2 :
デフォルトの名無しさん:2006/11/21(火) 10:54:08
2GET
4 :
デフォルトの名無しさん:2006/11/21(火) 23:02:46
>>3 > 意外と使えるCMemFile
その CMemFileの内容を、ディスクに保存せずに、CHtmlView で
表示出来ないかなぁ。
質問です。
今SDIアプリケーションで開発しているのですが
メインフレームのタイトルが
xxxxx - xxxxxxxxxx
のようにハイフンがついております。
このハイフンを消すことは可能でしょうか?
リソースのString TableのIDR_MAINFRAMの値が
〜\n\n〜\n\n\n〜\n〜
となっていると思うけれど、このうちのどれかの〜がメインフレームのタイトルになっていて、そのハイフンを消せばタイトルからハイフン消える。
7 :
5:2006/11/22(水) 10:36:07
>>4 CHtmlView::GetHtmlDocumentでhtmlドキュメントのIDispatchを取得して、
IHTMLDocument2::writeで注入。
MFCを勉強するのに定評のある本を教えて下さい。お願いします
できれば2、3冊くらい
スレ違い
シルトの標準講座MFC
↓
MFCのライブラリのソース読む
MFCはこれぐらいで十分
あとはwin32apiでもやった方がいい
13 :
デフォルトの名無しさん:2006/11/23(木) 15:28:54
MFCを使ってMDIプログラムを作っています。
子画面の作成方法は分かったのですが、
それにダイアログのようにコントロールを貼り付ける方法が分かりません・・・
CFormViewを土台にクラスを作ると子画面にできないですし、
CMDIChildWndを土台にクラスを作るとコントロールが使えません
両方の良いとこ取りをしたようなクラスはありませんか?
もしくは子画面でコントロールを使う方法を知りませんか?
(上は標準作成の子画面ではなく自作するクラスの方の話です)
MDIで普通にコントロール使えるだろ
15 :
デフォルトの名無しさん:2006/11/23(木) 16:03:54
>>14 色々と試してみたのですが無理でした
クラスの新規作成でCMDIChildWndを継承したクラスを作り、
グローバル関数でインスタンス生成して呼び出していますが、
表示されないですし、コントロールも貼り付けられませんです
ウイザードでMDIにしたら普通にできたけど
17 :
デフォルトの名無しさん:2006/11/23(木) 16:41:34
sdiでフォームビューにするのと同じ
初心者向けの入門書でも読んどけ
>>13 通常はウィザードで選択したViewで表示を行い、特定のDocumentを扱う場合のみ
新しいView(FormView派生)で表示したいってことかな?
20 :
9:2006/11/23(木) 18:19:49
ドキュメントテンプレート追加したら
任意のviewで表示できるけど
>>13 FormViewのMDI子ウィンドウはウィザードで普通にできるけれど、
もしかして、スプリッタやろうとしてるんじゃないのかな?
それならウィザードじゃ、FormViewはじかれて、できない。
FormViewの派生自作し、CreateStaticでスプリッタ作らないと。
Doc2つ作ってそれぞれにDoc-View割り付ける方法もあるらしいけれど、
オーソドックスに行くなら、この例ならTreeViewをウィザード使ってDoc-View使って、FormViewはDoc-View使わず、他のクラスからのアクセスはFormViewのオブジェクト宣言。
23 :
22:2006/11/23(木) 20:02:04
それと、FormViewのスプリッタをウィザードが認めてないのは、
作ってみればわかるけど、スクロールバーでボタンなどのコントロールが隠れたりして、
ありえないというか、まずチマタじゃ見ないFormになる。
蛇流ゆえに作っていくと色々とワナがあるよ。
24 :
22:2006/11/23(木) 20:12:08
左ツリーで右ブラウザ上のFORMみたいなことをやりたいなら、
CVIEWで作って、CMDIChildWndのハンドル取得して、オーナードローがいいよ。
DDX使えなくて、MFCの恩恵は使えないけど。
25 :
デフォルトの名無しさん:2006/11/23(木) 20:29:23
void CTestDlg::OnButton2()
{
m_button1.ShowWindow(SW_HIDE);
}
これにより、ボタン2を押すとボタン1は非表示状態になるのですが、
void CTestDlg::OnButton3()
{
m_button1.SetRedraw(FALSE);
m_button1.SetRedraw(TRUE);
m_button1.Invalidate();
}
としてボタン3を押すと、ボタン1が再び出てきてしまいます。
Invalidateだけだと出てきません。
SetRedrawって、SW_HIDEも勝手に戻してしまうものなのでしょうか?
これから作ろうとしているものは、
SetRedraw(FALSE)〜SetRedraw(TRUE)の間でいろいろ内部情報の更新をして、
その結果に合わせて表示状態も切り替えようとしているのですが、
非表示にしても、最後のSetRedraw(TRUE)で表示状態に戻ってしまいます…。
>>25 非表示なものにSetRedraw()やInvalidate()をする意味は?
非表示の間は描画処理は必要ないでしょ。
>>25 SetRedrawの実際の処理WM_SETREDRAWをMSDNで見ても何も書いてないね。
m_button1の表示状態見て処理するしかないんじゃない?
28 :
25:2006/11/23(木) 21:30:17
>>26 >>27 非表示なものにSetRedrawをするわけではなくて、
SetRedrawの最中に、更新結果によっては非表示にする
ということをやりたかったのです。
SetRedraw(FALSE)をした以上は、
最後は必ずSetRedraw(TRUE)を呼ばないとダメですよねぇ。
this->SetRedraw(FALSE);
this->SetRedraw(TRUE);
this->Invalidate();
もしくは
SetRedraw(FALSE);
SetRedraw(TRUE);
Invalidate();
にしたらうまくいったけど、なんでか分からん。
30 :
デフォルトの名無しさん:2006/11/23(木) 22:04:46
editから入力された文字列を受け取るにはどうしたら
いいんでしょうか?
誰か教えてください。
それと勉強できるホームページとか。
よろしくです。
32 :
13:2006/11/23(木) 23:40:38
ご回答ありがとうございます
返事が遅くなって申し訳ございません
>>19 そうです
普段はウィザード生成の標準子画面で操作を行い、
ボタンが押されたときに別の子画面を表示する感じです
(他にも同じ子画面が複数表示されないような制御も
行いたいと考えています)
>>22-24 基本的にやりたいことは単純にダイアログのようにコントロールが
貼り付けられて、それへの操作を処理のトリガとする子画面を持つ
MDIアプリを作りたいだけです
しかし、思ったように上手く、とても困っている状況です
つい数ヶ月前までVBしか経験のない状態でしたので、VC++6.0(MFC)の
ドキュメントビューアーキテクチャなども理解できていません
MFCで作れないWindowsアプリは無いと聞いたのと処理速度の問題から
こちらの言語での開発を始めたのですが・・・
MSDN2の
「フォーム ベースの MFC アプリケーションの作成を開始するには」
これでフォームひとつはできるはず。
35 :
デフォルトの名無しさん:2006/11/24(金) 00:40:42
>>21のいうようにドキュメントテンプレ追加する。最初のトリだけ書くと
1:新規MFCウィザードMDI、後すべてデフォルトでプロジェクト作成。
2:リソースで新規ダイアログ作る
3:新規フォームじゃなく新規クラスでCFormViewの派生クラスを作る(2のリソースID指定)
4:新規クラスでCDocumentの派生クラスを作る
5:リソースstringテーブルに次を追加する
Form\n\nForm(*.frm)\n.frm
注)\n\nの間に何か入れるとアプリケーション立ち上がり時、もしくはメニュー>新規作成時にCViewとCFormView選択可になる。
今は、CViewのみ立ち上がる。
6:C〜AppのInitInstance実装のAddDocTemplate(pDocTemplate);の下に以下を追加
pDocTemplate = new CMultiDocTemplate(
IDR_〜,//5のstringID
RUNTIME_CLASS(C〜Doc),//4のクラス名
RUNTIME_CLASS(CMDIChildWnd),
RUNTIME_CLASS(C〜View));//3のクラス名
AddDocTemplate(pDocTemplate);
6:このファイルの頭の#includeの後に追加した、FormViewとDocumentクラスの.hファイルを#includeを記述
7:これで実行(Formを確認したい時は4の\n\nの間に何か入れる)
けれど、C++はできるなら、VCは普通はWIN32アプリから入るんだけど、この先かなり難儀するかもしれないな。
37 :
デフォルトの名無しさん:2006/11/24(金) 01:00:01
>>36 細かなご回答、ありがとうございます
その手順で試してみます
36追加で2のダイアログのスタイルはチャイルド、境界線は「しない」に指定
39 :
13:2006/11/24(金) 01:08:10
皆様、丁寧なご回答ありがとうございました
教えて頂いたことを試してみます
更に先のことになるけれど、
CViewのメニューなりからのイベントでCFormViewを開く時は、
CChildFrameのオブジェクトを取得して(CViewクラスからならGetParentFrameで取得できる。
ドキュメントテンプレにdoc-frame-viewの枠組みは登録されているので、新たにnewしてはいけない。)
これを*pChldFrmとすると、
イベントハンドラに
if(!pChldFrm->LoadFrame(・・・
{
return FALSE;//もしくは失敗した時の例外処理
}というようにFormを作り、
pChldFrm->ShowWindow(〜/*定数*/);
pChldFrm->UpdateWindow();
して表示してやる。
訂正
Form\n\nForm(*.frm)\n.frm
を
\nForm\n\nForm(*.frm)\n.frm
しておいてもらえるかな。やれば意味わかると思う。
それと、includeの順番はこの場合必ず、
#include"C〜Doc.h"
#include"C〜View.h"
の順番で。たまたまコンパイルビルドとおっちゃうかもしれないけど、
includeの順番はとっても重要だから。
43 :
デフォルトの名無しさん:2006/11/25(土) 13:15:51
>>40-42 ありがとうございました
この件に関しての問題は解決しました
次はDLL側にある子画面を呼び出し側(MDI)で表示/利用することに
挑戦しようと思います
また質問に来るかもしれませんが、よろしくお願いします
44 :
デフォルトの名無しさん:2006/11/26(日) 14:17:52
CToolbarCtrlクラスを使っています。
このクラスで256色以上のビットマップを
貼り付けるにはどうしたらよいのでしょうか?
リソースエディタ上は16色しかでません。
何かうまい方法ありましたらご教授願いたいです。
45 :
44:2006/11/26(日) 14:33:20
環境はVC++6です。
47 :
44:2006/11/26(日) 16:32:37
ありがとうございました。
48 :
デフォルトの名無しさん:2006/11/26(日) 18:01:17
MDIアプリケーションでビューを
class CMyList : public CListView
としたのですけど、以下の一連の処理、
OnPreparePrinting()
OnBeginPrinting()
OnPrepareDC()
OnPrint()
OnEndPrinting()
が、ファイルメニューの印刷プレビュー項目を選択すると呼び出されるのですが、
同じく、印刷項目からですと何の反応もありません。
標準的な機能として呼び出されるのが当たり前と思っていたので、
ちょっと困ってしまっています。
OnPrint()に印刷処理を記述してプリンターに出力したいのですが、
どのようにしたら良いのかご存知の方、教えていただけませんか。
環境は.NET2003+XP SP.2です。
(後々のメンテナンスのことも考えて、
あまりトリッキーなことをしないで実装できるのが理想です。。。)
49 :
デフォルトの名無しさん:2006/11/27(月) 21:30:49
すいません、どなたかマルチモニタ環境があるかたに
試していただきたいんですけど、
・SDIアプリケーションをデフォルトのままビルド
・デバッグ開始してツールバーをフローティングさせる
・そのツールバーをセカンダリモニタ上に移動
とやったあと、そのツールバーをサイズ変更できますか?
自分の環境(VC6.0)ではセカンダリモニタ上ではサイズ変更できないんですけど…。
ダイアログベースのアプリで、Client領域に背景ビットマップを貼り付けています。
このダイアログの上で他のウィンドウをぐりぐり動かすとダイアログが再描画された時に
背景が部分的に欠けてしまう(ダイアログの地の色が出る)事があるんですが、
これってどんな理由が考えられるでしょうか。
51 :
50:2006/11/27(月) 22:27:39
WinXP+VC6.0です
52 :
デフォルトの名無しさん:2006/11/27(月) 22:40:32
VC6 MDI に MDI タブ機能を追加するにはどうしたらいいですか?
そういう機能は存在しない
>>48 標準的なCViewのサブクラスは印刷時に
CView::OnFilePrint();を呼び出している。
ただしCListViewから呼び出しても印刷できるかどうか
わからん。
>>49 試した。確かにサイズ変更できない。
原因は非公開クラスのCDockContext内のStretch()にあって
dockcont.cppの314-315行目のサイズ取得のところ。
最新のMFCではこっそりと修正されてる。
(VC6SP6)
HWND hWndDesk = ::GetDesktopWindow();
::GetWindowRect(hWndDesk, &rectDesk);
(VC2005)
rectDesk.left=GetSystemMetrics(SM_XVIRTUALSCREEN);
rectDesk.top=GetSystemMetrics(SM_YVIRTUALSCREEN);
rectDesk.right=rectDesk.left+GetSystemMetrics(SM_CXVIRTUALSCREEN);
rectDesk.bottom=rectDesk.top+GetSystemMetrics(SM_CYVIRTUALSCREEN);
VC6ではCToolBarとCDockContextを派生させて対処するしかない(当方では一応成功)。
非公開クラスなのでググってもほとんど情報がないけど
修正内容は違うがCDockContextを弄ってるのはあった。
http://www.ddj.com/184410272 英語だがStep3,Step4の文章が多少参考になる。
http://www.tkb-soft.hmcbest.com/diary_2005_03.htm 日本語。最後の方がグダグダでかなり強引。
質問です。
フォルダやファイルのフルコントロール拒否ってどうやってみたらいいでしょうか?
今はとりあえず、書きこんで見て書けなかったら・・・とかやっています。
もっとスマートな方法はないでしょうか?
57 :
デフォルトの名無しさん:2006/11/29(水) 06:17:19
質問なんですけど。
IEの履歴ウィンドウみたいなのあるじゃないですか?
あのスプリッタに「X 閉じるボタン」が付いてるやつ。
あれってMFCの機能で実現出来るものですかね?
スプリッタウィンドウにして一つのViewをFormViewにして
その中に各種のコントロールを設置すればそれっぽくなりますけど
閉じるボタンが押された時に、スプリッタを完全に非表示にしないといけない訳で
スプリッタの大きさ0じゃなく、動的にスプリッタの数を変更とか出来るのでしょうか?
CSplitterWnd内部では当然ペインの数は管理しているので
サブクラスで操作(数だけじゃないよ)すればできる。
流れ書こうかと思ったけどCodeGuruとか見たほうが早い。
ペインが左右に1つずつしかないなら、ほんの数行で済むはず。
>>58 なるほど… そういう物だったんですね…
>>59 今、色々試していた所、CDialogBarを利用して
似たような事が出来るかも知れないと思いました。
出来ればVC++のIDEみたく、ドッキング可能にもしたかったので
こっちの方がより理想に近いのかもしれません。
61 :
49:2006/11/29(水) 20:45:04
>>55 試していただきありがとうございます。
やっぱりこれグラフィックカードの問題とかではなかったんですか…。
ツールバーももちろんなんですが、
http://support.microsoft.com/kb/143255/ja ↑を参考にサイズ変更可能なダイアログバーを用意したんですけど、
セカンダリモニタ上でサイズ変更ができないのがかなり痛いです。
これって、VC6のままMFCだけ最新のものを使うということは無理で、
VC2005の環境にしてしまうか、派生クラスを自分で作ることになるんですよね?
ドッキングを捨ててモードレスダイアログにしてしまったほうがいいのかな…。
まずは教えていただいたサイトなどを元にして
なんとか挑戦してみたいと思います。
ありがとうございました。
62 :
デフォルトの名無しさん:2006/11/29(水) 22:26:25
ウィンドウやダイアログ(以下、あわせて子画面と記述)を追加するMFC拡張のDLLを作成しています
仕組みそのものは簡単で、アプリケーションからグローバル関数を通じて呼び出されます
グローバル関数は子画面ごとに用意し、関数の引数にポインタを指定する形でデータの受け渡しを行います
それで早速これを作り始めたのですが、自分の知識が乏しいこともあって問題が発生してしまいました
それは、ウィンドウを上手く表示させて処理させることができないということです
ダイアログの方はモーダル表示であるためか、特に問題なく表示させて処理させることができました
しかし、ウィンドウの方は違いました
新規クラス作成でCFormViewを継承したクラスを追加しているのですが、生成の段階で問題が発生してしまいます
コンストラクタがprotectedとなっているため、newで生成したときにエラーとなるのです
これは手動でpublicに変えることで表面上は解決しました
しかし、標準でprotectedになっていたことには何か意味があるのではないかと不安に思えてきました
大丈夫なのでしょうか?
また他にも問題があります
それは、メモリの開放です
ウィンドウはモーダルではないため、基本的にグローバル変数として使っています
これが問題となるのはユーザが閉じるボタンでウィンドウをデストロイした場合です
グローバス関数では、対応するウィンドウのグローバル変数がNULLでない場合に明示的にDestroyWindowを呼んでいます
その後にdeleteをしております
しかし、ユーザがすでにウィンドウをデストロイしていた場合、エラーが発生します
これをどうにか防ぎたいのです
ウィンドウがすでにデストロイされていることを知る手段はありませんか?
またはメモリが未開放であることを知る手段はありませんか?
とても困っております
知恵を貸してください
>>62 Viewの作成は通常newは使わず
CView *MyView = (CView *)RUNTIME_CLASS(CMyView)->CreateObject();
context設定して MyView->Create( ・・・ );
とかいう感じ。
後半はframeを保持しているのがどっちか不明なのでパス。
64 :
62:2006/11/30(木) 00:09:29
>>63 レスに大感謝です
参考にさせて頂きます
グローバル変数を保持しているのはDLLです
つまり、ウィンドウ&ダイアログは常にDLLの管理下にあります
アプリケーションは子画面の表示を指示するのとデータ受け渡しのみです
65 :
デフォルトの名無しさん:2006/11/30(木) 00:50:10
MDIのドッキングウィンドウってどうやればできますか?
66 :
デフォルトの名無しさん:2006/11/30(木) 04:17:02
>>65 私も興味あります。
VC++6というか、VisualStudioのようなMDIを実現する方法。
67 :
60:2006/11/30(木) 04:56:11
>>66 前書き込んだ者ですけど、多分、ダイアログバーを自分で改造して
似た様な物が出来るんじゃないかと思うんですが。
設置したコントロールもダイアログの状態によって位置、大きさを変更する等して。
外観は全部自分で独自に描画して似せて。
例えば、あの二本線のRebarみたいなのも自分で描画して。
CDialogBarのDDXが効かないのは、CDialogに書き直せば確かOKだった筈ですし。
68 :
デフォルトの名無しさん:2006/11/30(木) 19:00:30
アプリケーションの英語化作業中です
リソースを日本語版と英語版を用意して、以下のような設定にしています
英語版ビルド時には日本語を無視
日本語の場合には英語リソースを無視
この方法でビルドした場合、ダイアログに直接貼り付けてあるStaticテキストや
ボタンのCaption等は正しく言語の切替が行われていますが
StringTableから読み込んで表示する場合、英語版が全て空白になってしまいます
正しく読むにはどうしたらいいでしょうか?
英語と日本語でそれぞれプロジェクト作って比べてみれば馬鹿でもわかる。
70 :
68:2006/11/30(木) 19:43:41
すみません、解決しました
開発しているのはプラグインなのですが、対象となるソフトの言語設定を変更したら上手く行きました
71 :
49:2006/11/30(木) 22:37:56
>>55 CDockContextの派生クラスを作成し、以下の3つをオーバーライド。
・virtual void StartResize(int nHitTest, CPoint pt);
・void Stretch(CPoint pt);
・BOOL Track();
StartResize()とTrack()は、CDockContextのものをそのまま手を入れずにコピー。
Stretch()は、例の部分をVC2005版に修正し、それ以外はそのままコピー。
そのほかに、これらの関数で使われている定数や構造体の宣言をそのままコピー。
CToolBarの派生クラスを作成し、EnableDocking()をオーバーライド。
m_pDockContext = new CDockContext(this);
の部分を、上のCDockContextの派生クラスをnewするように修正し、
それ以外はそのままコピー。
というソースファイルを作成し、
SDIのツールバーをこのCToolBarの派生クラスに置き換えてみたところ、
無事にセカンダリモニタ上でもサイズできました。
「当方では一応成功」っていうのも、やはりこのような感じなのでしょうか?
72 :
62:2006/11/30(木) 22:54:50
とりあえずウィンドウをDLL側で生成して表示させることはできました
フレームとビューとドキュメントをCCreateContextで連結させるのに苦労しました
上手に表示されたときはとってもハッピーになりました
さて、申し訳ないですが本日も質問があります
それはビュー(CFormView)に張り付けたダイアログリソースについてです
なぜか分からないですが、呼び出しアプリケーション側のダイアログリソースに置き換わってしまいます
DLLのダイアログリソースが表示されません
Resource.hが怪しいと思っていますが、どうすれば解決できるのか分かりません
アドヴァイスを頂けませんか?
あと、昨日の質問が残っています
>>62の後半、メモリ開放についてです
CFormWndのインスタンスを持っているのはDLL側です
ユーザが閉じるボタンやAlt+F4でデストロイしたことを察知して2度デストロイやdeleteするのを防ぎたいです
大変にクリティカルな問題なのでとても悩んでいます
インターネット検索や書籍で解決策を探していますが、まだ解決には至っていません
アドヴァイスをお願いします
>>72 相変わらずFrameの位置が不明瞭です...
次の3つの内から一つを選択しなさい。
1.Exe側のCMainFrameにDLL側で作成したCFormViewを結合している
2.ExeとDLLにそれぞれFrame&Viewの対がある
3.その他
上段で上手に表示されたと書いてるけど、中段読むとFrameとViewの
結合に失敗してるし訳分からない。別な話?
下段CFormWndのbase class はCFormView or CFrameWnd ?
74 :
72:2006/12/01(金) 00:16:17
75 :
デフォルトの名無しさん:2006/12/01(金) 00:27:52
dll内でnewしたインスタンスはdll内でdeleteしないといけないのでしょうか。
>>74 であれば、Viewをdeleteする必要はない。
FrameとViewが正しく結合されていれば、exe側Frameが閉じられる際に自動で削除される。
CView::PostNCDestroy()参照。
>>75 例えば開発時に、EXEがReleaseでDLLがDebugだとすると。
メモリ管理のランタイムが別になるんで、EXEでnewしたメモリをDLLで開放しようとすると、
当然そんなメモリは管理してないから落ちてしまうと。
exe-dllで使用しているMFCのバージョンが同じで
>>78の言うことに気をつけていれば
問題ないんじゃないの?
77は根拠を示すべし。
>>79 別のアプリで確保したメモリを別のアプリで解放できるか?って話しになるんじゃない?
この子は何をほざいているのだろう・・・
>>79 バージョンが同じでも、MFCをスタティックリンクしてるとダメだよ。
論点がばらけ過ぎてる
84 :
55:2006/12/01(金) 19:42:03
VC++.NET2003で開発しています。
MDIから別プロジェクトの画面を子画面として表示させたいのですが、
どういう風に作ればいいのでしょうか。
またMDIか
このまえ質問してたやつはどこに消えた?
88 :
49:2006/12/03(日) 13:05:02
>>84 やはりこういう派生になるのですね。安心しました。
VC7でも同じ問題が発生するようで、VC2005じゃないと直ってないようです。
89 :
40:2006/12/03(日) 16:05:47
>CViewのメニューなりからのイベントでCFormViewを開く時は、
の続きで、Viewの差し替えは、Viewクラスでのメニューイベントハンドラーで
CWinApp* myapp=AfxGetApp();
CDocTemplate* mydoctemp=(CDocTemplate*)RUNTIME_CLASS(CDocTemplate);
POSITION myps=myapp->GetFirstDocTemplatePosition();
mydoctemp=myapp->GetNextDocTemplate(myps);//テンプレートリストの1番目を選択するイテレータ
mydoctemp=myapp->GetNextDocTemplate(myps);//テンプレートリストの2番目を選択するイテレータ
mydoctemp->OpenDocumentFile(NULL);
でドキュメントテンプレートに入れられた2番目のViewを新規子ウィンドウで表示できたよ
90 :
デフォルトの名無しさん:2006/12/04(月) 13:59:24
ダイアログにタブコントロールを乗せ、複数のリストビューの表示をタブで切り替える
ソフトを書いていたんですが、タブに重ねたリストビューの列サイズを操作すると
リストビューの表示が乱れる現象が出てしまいました。
http://www.uploda.org/uporg604606.zip.html サンプルプロジェクトです。VC2005で作りました。
http://www.uploda.org/uporg604603.gif 1つめのリスト。こういう感じで一番右の列境界をタブの外へ右にドラッグすると
スクロールバーが現れます。通常の動作です。
http://www.uploda.org/uporg604604.gif 2つめのリスト。1つ目と同じく一番右の列境界を右へドラッグするとスクロールバー
が現れるタイミングで表示が乱れます。
どうして2つ目のリストでのみ表示が乱れるのか悩んだ結果、ダイアログのリソース
定義ファイル中の、
> CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | (以下略)
> CONTROL "",IDC_TAB1,"SysTabControl32",0x0,7,7,173,186
> CONTROL "",IDC_LIST2,"SysListView32",LVS_REPORT | (以下略)
を
> CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | (以下略)
> CONTROL "",IDC_LIST2,"SysListView32",LVS_REPORT | (以下略)
> CONTROL "",IDC_TAB1,"SysTabControl32",0x0,7,7,173,186
と順番を入れ替えると表示が乱れなくなりました。逆に、タブの行をリストの先頭
に持っていくと今度は両方のタブでリストの表示が乱れるようになります。
結果オーライといえばそれまでなんですが、どうしてこれで問題が解決するのか納得が
いきません。リソース中の定義順が何に影響しているのでしょうか?
普通はプロパティシート
93 :
デフォルトの名無しさん:2006/12/04(月) 16:30:03
Zオーダーの問題
94 :
90:2006/12/04(月) 22:53:30
確かにZオーダの問題でした。どうもありがとうございます。
リソース定義の順番がZオーダになるというのが将来にわたって保障された
仕様なのかどうかが疑問なので、コントロールを重ねる場合のZオーダは
きちんとSetWindowPosでコード中に書いておくことにします。
95 :
デフォルトの名無しさん:2006/12/06(水) 06:13:15
VC6.0のMFCで作ったプログラムを実行したときにレジストリへ一切書き込まないようにしたいのですが
HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache
に VS_VERSION_INFO の FileDescription の値が書き込まれてしまいます。
FileDescription を消しても実行ファイル名が変わりに書き込まれてしまいます。
どうしたら書き込まないように出来るでしょうか?
そのキーを書込み禁止にすると(・∀・)イイヨ!!
CFtpConnectionを使ってFTPクライアントを実験的に作ってみたのですが、
PASVモードを使ったときにどのポートが使われているかというのは
どうやって取得すれば良いでしょうか?
98 :
デフォルトの名無しさん:2006/12/12(火) 21:25:29
CListCtrl (以下、リスト)をレポート形式で使用しているのですが、
このリストの特定セルだけ背景色を変えるにはどうしたら良いですか?
ステータス値に応じてセルの色が変わるような機能を実現したいのですが……
ダイアログ上に複数のスタティックなコントロールを配置しています。
各コントロール毎に違う背景色を設定したいのですがどのようにすればよいのでしょうか?
OnCtlColor()メソッド内でコントロールの判定ができればよいと思うのですが・・・。
どなたかご教授の程よろしくお願い致します。
OSはWinXP SP2、開発環境はVC++ 2005です。
>>98 カスタムドローじゃねぇの?
>>99 普通にウィンドウハンドル比べたらどうよ?
101 :
98:2006/12/12(火) 21:47:33
>>100 無知で申し訳ないのですが、カスタムドローとはどのようなものですか?
103 :
98:2006/12/12(火) 21:57:44
>>102 すみません、自分で検索するべきでした
どうもありがとうございました
104 :
99:2006/12/12(火) 22:00:20
>>100 レスありがとうございます。
if(GetDlgItem(IDC_STATIC_COLOR1) == pWnd){
AfxMessageBox(L"一番目のコントロール");
}
//以降コントロールの数分else if
試しにこんなコードでやってみたのですが引っかかりませんでした。
比較処理が悪いのでしょうか?
MFCってpWnd->m_hWnd == GetDlgItem(IDC_STATIC_COLOR1)->m_hWndってやらなくてもいいんだっけ?
まあ、駄目だったら、そもそもIDC_STATIC_COLOR1が本当にそいつの直下に配置してあるコントロールなのかどうなのか
ってところがあやしいんじゃね?
106 :
99:2006/12/12(火) 22:22:41
>>105 OnInitDialog内で
GetDlgItem(IDC_STATIC_COLOR1)->SetWindowText("あいう");
で文字は表示されたので問題はないと思うのですが・・・。
もう少し調べてみます。
107 :
99:2006/12/12(火) 22:31:54
>>105 すみません、教えていただいた
pWnd->m_hWnd == GetDlgItem(IDC_STATIC_COLOR1)->m_hWnd
でできていました。(メッセージボックスが表示されていなかったのでできていないと思っていました)
どうもありがとうございます。
それはえがった
109 :
デフォルトの名無しさん:2006/12/13(水) 16:35:12
VC6を使って、MDIアプリにMDIタブを実装したい
まずは、CMainFrame に MDIタブ用の CDocBar を配置したいのだが、
どこをどうオーバーライドしたらいいんだ?
CMainFrame::recalcLayout() あたり?
またお前か
その前にMDIの作り方は間違っていないのかね?
なんだかこの間からぶち当たった問題をことごとく質問してないか?
相談室だから質問しています
>>112 相談しようぜ。
MDIの基本的な部分はOKなん?
ここは自分でできもしないことを相談する所か?
まあ、MFCスレってここしかないんだから、そう厳しいこといわんと。
MFCって結構むずいじゃん。
俺、ドキュメントビューアーキテクチャーとかいう仕組み覚えるのに何日も必要だったぞ。
まず、ドキュメントビューアーキテクチャーの構造なんて大して重要なもんだと思ってなかったし(SDIで組んでたのもあって)。
この状態でMDIプログラミング特攻すると、はっきりいってハマルじゃんw
プロパティシートについて質問があります。
ダイアログをいくつか作成(このときフォントをMSゴシックの12ptに変更)し、
各ダイアログ毎にクラスを作成(CPropertyPageクラスの派生クラス)して
メインメニューに[プロパティ]項目を追加、そのイベント内で
・プロパティシートのインスタンス生成
・プロパティページをプロパティページにAddPage
・DoModalで表示
しています。
このとき、表示された各ページのフォントサイズが標準のMS UI Gothicの9pt
で表示されてしまっています。なのでCPropertySheetの派生クラスを作り、
OnInitDialog内でフォントサイズの変更を行ってみたのですが変化なしでした。
なぜこのような現象が起こるのでしょうか?
プロパティシート使ったことないけど
タブコントロールなら、全ページフォントを設定する必要があるな。
プロパティシートにもそんなのあんじゃね?(適当w)
OnInitDialog内でGetPage()->SetFont();は行っているのですが
それでも変わらないんですよ。各ページのコントロールのサイズも
ちっちゃくなってますし。全ページのコントロールの位置、サイズ、フォントを
設定しないといけないんでしょうか。
CPropertySheet フォント で検索
MDIの基本的な部分はたぶんオケ
だからおいらの相談に答えてくれよー
>>120 ドキュメントビューアーキテクチャ(なげぇなw)の理解は大丈夫ということでOK?
>まずは、CMainFrame に MDIタブ用の CDocBar を配置したいのだが、
MFCにCDocBarなんてあったけ?
>>123 すまん CDockBar だった
CDockBar はアンドキュメンテッドなクラスで、CControlBar を配置するための滑走路みたいなものだよ
125 :
116:2006/12/13(水) 22:43:28
>>119 SendMessageToDescendants()?でフォントは変更できましたが、
サイズとかの変更の仕方が分かりませんでした。
MFCを理解しようとしないで自分のやりたいことだけ質問する馬鹿ばっかりだな
MFCのすべてを理解してるなら、すべての質問・相談にちゃっちゃ答えて神になってくれ
何のためにソースがついてるんだろ
非効率だよね。
まず、全体っちゅーか概要ぐらいは理解しないと
なにやるにも知ってる人間にお伺いを立てないと何もできなくなっちゃうぞ。
なんかMFC使うほうがかえって面倒くさそうだ
馬鹿じゃねぇの
コントロールのサイズと位置はピクセル単位じゃなくてダイアログベース単位で、
ダイアログベース単位はフォントの幅が元になってる。
だからダイアログのフォントを変えると
コントロールのサイズと位置もフォントに比例して変わる。
このフォントサイズはダイアログを作る時に指定した
ダイアログボックステンプレートに定義されている。
ダイアログを作った後でフォントを変えても
コントロールは既に作成されてしまっているから
コントロールのサイズと位置は後で指定したフォントには影響されない。
以上ここまでMFCに限らずWin32でも同様
プロパティシートがリソースで定義されたダイアログのフォントを無視しているということは
たぶんメモリ上に読み込んだダイアログボックステンプレートのフォントを書き換えてから
その変更を加えたダイアログボックステンプレートでダイアログを作っているのではないか
と推測されるけど、あとはCPropertyPageのソース等を読めばわかることだから省略
134 :
デフォルトの名無しさん:2006/12/14(木) 10:51:38
☆ チン
☆ チン 〃 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヽ ___\(\・∀・)< MDIタブ実装方法 まだー?
\_/⊂ ⊂_)_ \_______
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄/|
|  ̄  ̄ ̄ ̄ ̄ ̄ ̄:| :|
| .|/
ソースを読めばわかることだから省略
MDIタブのこと書こうか迷ってたんだけど、AAみて踏ん切りがついたよ。
MDIタブの何を書こうかと迷ってたんだ?
Button(OKやCancelや適用など)をDisableにしたいのですが、どの関数を使うのですか?
SetCheck()かと思ったのですが違うようでした。。
>>138 基本クラスのメンバEnableWindowで
なるほど…
やってみます。ありがとうございました。
141 :
デフォルトの名無しさん:2006/12/17(日) 19:17:51
リストコントロール(CListCtrl)をリードオンリにするにはどうすれば良いですか?
142 :
デフォルトの名無しさん:2006/12/17(日) 19:21:10
2つ目の質問です
ツリーリストコントロールって標準で存在しませんか?
存在しない場合はどうすれば使えますか?
MFCで作ったフリーソフトでツリーリストが使われていたので、
何らかの方法でできるのではないかと考えているのですが・・・
ちなみに、今の自分の技術力では自作は無理です
143 :
デフォルトの名無しさん:2006/12/17(日) 19:25:35
3つ目の質問です
MDI子ウィンドウのビュー(フォームビュー)でリストコントロール(CListCtrl)を使っているのですが、
他の子ウィンドウがリスト部分の前に重なった後、リスト部分をクリックしてリストがある子ウィンドウを
アクティブにすると重なっていたリスト部分だけが再描画されません
原因はまったく不明です
どのようにすれば子ウィンドウがアクティブになった時に正常に再描画されるようにできますか?
144 :
デフォルトの名無しさん:2006/12/17(日) 19:29:21
最後の質問です
MDI子ウィンドウのビューでリストコントロールを使っているのですが、
子ウィンドウのサイズ変更にあわせてリストのサイズを動的に変更するには
どのようにすれば良いですか?
VC#ではプロパティ画面で簡単に設定できたのですが、
VC++にはないのでとても困っています・・・
以上4つ質問させて頂きました
何かご存知の方は、ご回答をよろしくお願いしますm(_ _)m
最後のやつの答えは
子ウィンドウのサイズ変更にあわせてリストのサイズを動的に変更する
MDI野郎の質問は意味不明
具体的にはOnSizeとかOnSizingとかOnExitSizeMoveとか用途に合わせて使うと吉。
>>141 普通リードオンリーでできんじゃねぇっけ?
リソースファイルの方の設定に編集できるとかできないとかそういうプロパティあった希ガス。
>>142 昔、俺がみたのは自力で描画してたのしかみたことないな。
今、どうなってるのかはよくわからん。
>141-144
勉強してないの丸わかりなんだけど
よくリストコントロール表示できたね
どっかからソースぱくってきた?
たしかにこうなんもかんもわからんようだとどうしようもないなw
いつも質問しっぱなしで消えて行く人と文体がそっくりだな
お願いします。MFCを使い大量の点を打って画像を描画するプログラムを作っています。
点の数は数千を越えていると思うのですが かなり処理に時間がかかります。
自分なりに色々調べたところ SetPixelは遅い ということがわかりました
同時に BitBlt とか 裏画面 などと 高速化に関するワードも出てきましたが
全く分かりませんでした
この言葉で全て解決しようとするのが悪いのですが 初心者です。
しかし、時間が本当に無いので時間をかけて勉強して… ができません。
ちなみに 点は一色です。 SetPixelの遅さを解決する方法で
まだ分かり易いだろう と思う方法を教えていただけませんか?
かなり遅いって具体的に何秒?たった数千なら一瞬のはずだけど...
えっ・・・ そうなんですか?
具体的にはループ回数が3万でそのうちの一部の点を
描画しているので、最大でも3万ですね
1万は越えているかも知れませんが…
時間は3分から5分程度でした。
うちのPCは最新鋭からは程遠いセレロンだけど10万個の点をSetPixelで
描いても0.1秒ぐらいだったよ。(裏画面とか未使用)
描画以外の部分に時間かかってるんじゃないかな。
配列に直接描画すればいいんじゃない?
そうでしたか… スペック的には確実問題になるほどではありません。
ループ回数を増やすと比例関数的に時間も延びたので
てっきりそこが問題だと思っていました。
そうなるとどこに時間がかかっているのか全く分かりませんね…
ランダムウォークさせているのんですが そこか
1024*768もの配列を作って その中身全てを参照(検索)するという作業を
何度かしているのも原因かもしれませんね。
mallocなんかも全く使っていませんし…
ループ回数をこれ以上にするとエラーになり途中で動作が止まってしまうのも
同じ原因から来ているのかも…
しかし ここまでくるとここで相談させてもらう内容ではなくなってしまいますね。
1024*768*30000=230億強
それは遅いだろ...
>BitBlt とか 裏画面 などと 高速化に関するワードも出てきましたが全く分かりませんでした
>初心者です
>時間が本当に無いので時間をかけて勉強して… ができません。
結論: 無理
最後に一回だけ描画すればいいのに
いちいちSetPixel使うからだよ。
えっと 最後に一回だけ描画してます。
まぁ特に考えてたわけではなく、むしろ本当は描画の
様子が分かるように1回1回点を打ちたかったのですが
それができなくて 最後にだけ描画してます。
(点を打つ配列に目印をいれて最後にその部分だけ描画)
結論を言うと そのループ及び巨大な配列の中身を参照するのに
時間がかかってるというわけなんですね・・・
>>160 ってことでFAですかね。
検索の仕方や配列の使用法などを再考してみますね。
こんなくだ質に付き合ってくださってありがとうございました。
SetPixelをループに入れてる時点で一回だけじゃないじゃん。
GDIにじゃなくてメモリに対して書くようにすればいいんじゃないの?
たった一色ならcharで1024*768の配列をnewして
0か1を直接書き込めばいいじゃない。
その後BMPに変換すれば?
正直MFCと全然関係ない
1280*1024の画面全体の約130万ピクセルでも数秒だね
遅いというのは一瞬じゃないということ
自分で試さずに質問するのはやめてほしい。
>>162 そういう時は、SetPixelだけをコメントアウトしてみる。
そうすれば、それが犯人かどうか分かる。
質問者じゃないけど試しにBitmapBits弄ってみたら
130万pixelなんて問題にならないぐらい強烈に早いね。
今後使う機会があるかは微妙だけど勉強になったよ。
>>170 スレ違い房乙
さらにレスしていただいたんですね。
>>163 確かにループには入ってますね
でもループもしないで1回だけ なんて できるんですか
>>164 そのような方法がある事は調べていたときにわかったんですが
なかなか理解できなかったんですよね
>>165 今は理解できないんで ちょっと考えて見ます^^;
ありがとうございます。
>>166 ですね。 158で自分でも言ってますが。 すみませんでした。
>>167 そうなんですか。 >遅いというのは一瞬じゃない そうですね
自分で試さずに とは 何のことでしょう?
確かに SetPixelに時間がかかっていたかどうかは
自分で画面全体にSetPixelで塗りつぶしてみれば分かったんですね…
そうだ と思い込んでしまったので思いつきませんでした ごめんなさい。
>>168さんもありがとうございます。
そんな方法もありますね 次回から参考にします!
>>169 スレ汚しすみませんでした。
172 :
デフォルトの名無しさん:2006/12/19(火) 02:51:30
> 描画しているので、最大でも3万ですね
> 1万は越えているかも知れませんが…
>
> 時間は3分から5分程度でした。
描画しているのは最大でも3万で時間は3分から5分
とりあえず、ビットマップ作ってメモリDCで選択して
そこに描画してBitBltするという、昔ながらのやり方を
試すのが今後のためにいいと思うが。
175 :
153:2006/12/19(火) 14:54:29
>>172 VC++ のMFCです。
>>174 そうですよね。
いい機会ですし勉強して使えるようにしたいと思います。
ほとんどMFCと関係ない
では MDIタブの実装方法についてお話してください
よろしくおながいします
mfcにMDIタブなんてものは存在しない
イヤです
じゃあmfc関係無いのでは
MFCのMDIを拡張して作るんだから関係あるし、難易度が高い
MFCを使わず、まったくゼロから MDIタブを作るのならそれほど難しくはない
と混じれ酢してみる
決まった作り方が存在しないから好きなように勝手に作れ
好きなように作りたいんだけど、作り方がわからないんだよぉ〜
ダメです
MDIタブを作るには、フレームウィンドウの上部(or左or右or下)にMDIタブのための領域を確保する必要がある
そのためには void CMainFrame::RecalcLayout(BOOL bNotify) をオーバライドすればいいぞ
どうオーバライドするかは自分で調べろ
イヤです
VC++6.0 WinXPProで開発を行っております。
XPログオン時のユーザ名とパスワードが正しいかどうかを、開発したプログラム上で
確認したいと思っているのですが、どのようにすればよろしいでしょうか。
誤爆?
ここはライブラリの専用スレですよ
ウィンドウにスクロールバーがあるかどうかを調べたいのですが、
どうすれば取得できるでしょうか?
WS_HSCROLLやWS_VSCROLLスタイルが付いてるか調べればいいんじゃないかな
GetWindowLongで取得すればいいのでしょうか?
色々調べてみたのですが、GetWindowLongの使い方がいまいちよく分からないです。。
具体的にどう使えばいいか、ご教授願えますでしょうか(><
MSDN見ろよ
MSDN見てます。
LONG lStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);
で取れると思うんですけど、そこからどうすればいいか分からないんです。
どこを見れば分かりますか?
ビット演算も知らんのか?
MFCの質問じゃない
ビットで入ってるんですね。
MFC以前の問題ですか・・・
もっとよく調べてきます。
201 :
デフォルトの名無しさん:2006/12/24(日) 22:58:19
質問があります。
現在、ダイアログAのボタンを押すと、ダイアログAを隠して
ダイアログBをモードレス表示し、
表示されたダイアログBのボタンを押すと、ダイアログBを隠して、
ダイアログAをモードレス表示するツールを作成しております。
そこで、ダイアログAのボタンを押すと、ダイアログAを隠して
ダイアログBをモードレスで表示することは出来たのですが
モードレスで開いたダイアログBのボタンを押すと、
ダイアログAをモードレスで開く方法がわかりません。
教えてください。
よろしくお願いします。
ダイアログAがやったのと同じ事をダイアログBでやればいいだけじゃん
>>202 エスパー値が低いのに初心者の質問に答えるな。話がややこしくなる。
要は循環参照になっちまってコンパイルできねぇんだろ?
つまり、
メインウィンドウ→ダイアログA→ダイアログB→ダイアログA→ダイアログB
って構造だとダイアログAとダイアログBが循環してしまって駄目なわけだ。
なので
メインウィンドウ→ダイアログA
→ダイアログB
としてメインの方でダイアログAのボタンX、ダイアログBのボタンXの
内容を処理するようなもんを作る必要があるとそういうことだろ?
この処理をやるにはダイアログAとBのインスタンスはメインの方にもったほうがいい。
そんでメインの方で
1.ダイアログAがあったら消して、ダイアログBを出す処理
2.ダイアログBがあったら消して、ダイアログAを出す処理
を実装する。
んで、ダイアログAのボタンXでは1を発動させるような処理(親にSendMessageで独自のメッセージ飛ばすのがいいかな?)
んで、ダイアログBのボタンXでは2を発動させるような処理
を組めば完成とそういうことだ。多分w
Windowsの電卓の10進と16進の切り替えがそんな感じだな
あれは表に出ない親ウインドウがあってそこから2つのダイアログを切り替えてる
しまった、ここまで書いて全然MFCと関係ないのに気がついた
>203は別に独自のメッセージである必要もないね。
MFCなら仮想親ダイアログにメンバでABダイアログがぶら下がっているだろうから
ダイアログからは親のメンバを呼ぶだけでいい。
>>204 ほ〜らMFCらしくなったでしょw
なんですぐMFCと関係無い方向に行くんだ?
はっ
おまいらちゃんとMFCがわかっているのか?
>>206 行くっつぅか元々>192からしてMFCと・・・
APIでウィンドウも出せないくせにMFC使うな
と誰かが言ってた。
VS2005 MFCを使用しています。
プロパティシートでSendMessageToDescendants()を使用し、
各ページのフォントサイズを変更しているのですが
なぜかリストコントロール内のフォントサイズだけ変更されません。
(ヘッダーは変更されていました。)
SendMessageToDescendants()を使用せず、リストコントロール
のSetFont()を使用すれば変更できるのですが、リストコントロール
に合わせてすべてのページですべてのコントロールにSetFontをするのは
避けたいです。なにかいい方法はありませんでしょうか?
>>211 今までリストコントロールを利用していないシートの
コーディングを行っていたのでてっきりうまく変更されていた
ものとばかり思っていたのですが、リストにデータを挿入して
表示したところリスト内のサイズだけ小さかったので
再度質問させていただきました。
1. 専門用語を知らないMFC初心者が質問
2. 知ってる人が専門用語をあまり使わずに解説
3. 理解できない別の知ったか初心者が 「MFCと関係ない」
4. 質問者が3にむかついて失踪
最近この流れが多い。3の人は1年ぐらいROMって欲しい。
214 :
デフォルトの名無しさん :2006/12/26(火) 08:50:07
すいません教えてください。
C/C++を一通り勉強して、mfcでビュッフォンの針のシミュレーションプログラムを
作ろうと思ってるんですが、ダイアログベースで、ピクチャボックスに描画しようとして
も上手くいきません。CClient の矩形をCRectで取り
bottomとrightを数値で覚えさして、シミュレーション用の横棒を引くため
bottomを横棒の数で割り、movetoとlinetoでそれぞれの位置に線を引いたのですが
(用は、数値が1ならクライアント領域が二等分されるようになり
数値が2ならクライアント領域が三等分されるような形)
上手く等分されません。
なにか良い方法か、サンプルのあるページがあれば教えてください。
描画に使った数値が合ってるかどうかぐらい調べてから質問しろよ
シミュレーションの前に、簡単な線でも描けるようになってから質問しろよ。
日本語でかかず、プログラムを示せや
デバッグメッセージで、moveto、linetoに渡す数字表示させて並べてみな
219 :
デフォルトの名無しさん:2006/12/26(火) 18:47:19
VC6でMDIアプリを開発しています。
子フレームを最大化した状態でドキュメントを切り替えると、最大化されない子フレームウィンドウ枠が
一瞬描画されてしまいます。
これを防ぐにはどうしたらいいのでしょうか?
普通に作ればいい
普通に作ったら 子フレームウィンドウ枠が一瞬描画 されるんだけど
これは いったい誰がだしているの?
お前が作ったプログラム
223 :
デフォルトの名無しさん:2006/12/27(水) 17:33:42
CFormViewの中に設置したレポート型のリストビューで
アイテムを右クリックしたときにポップアップメニューを
表示させてそのアイテムにのみ処理をしたいのですが
どうすればいいのでしょうか
簡単にできそうな気がして何が問題かよくわからん
ここで質問しなきゃわからないような何か特殊な問題あったか?
OnRButtonDownの追加により
リストビューで右クリックのイベントをとるまでいけたんですが
メニューの表示や選ばれたアイテムの取得方法がわかりません
簡単なら教えてくださいお願いします
226 :
225:2006/12/27(水) 18:57:47
今はOnContextMenuに変えています
特に難しい問題はないはずだから調べればわかると思う。
リストビューで項目の右クリックをとるのはNotify使うんじゃなかったかな
あまりにも懐かしすぎて、過去のソース見ないと思いだせんがNM_RCLICKとかあったと思う
229 :
219:2006/12/27(水) 19:21:19
void CMDIFrameWnd::MDIActivate( CWnd* pWndActivate )
を使って、子フレームを切り替えているのだが、このメソッドをコールすると
一瞬現在アクティブなウィンドウに WM_MDIACTIVATE が送られ、
その前後に子フレームが再描画されるとこまでわかった
どうしたら子フレームの再描画をとめられるんだ?
誰か助けて。おねがい
230 :
デフォルトの名無しさん:2006/12/27(水) 19:37:15
調べろカス
普通のMDIでもそうなるならそういう仕様
普通のMDIではそうならないなら普通のMDIと同じにすればいい
232 :
225:2006/12/28(木) 10:44:01
>>228 NM_RCLICKで右クリックのイベントは取れました
右クリックしたときのアイテムの取得はどうすればいいのでしょうか?
234 :
225:2006/12/28(木) 11:25:06
返答ありがとうございます
調べてみたら
CListCtrl::GetFirstSelectedItemPosition
で取れるようです
235 :
225:2006/12/28(木) 12:24:51
次は右クリックを押したときにメニューを表示させたいんですが
表示はできましたが最初のメニューだけすごく小さいのです
サブメニューは普通に表示されます以下ソースです
CMenu menu;
CPoint posMouse;
VERIFY(menu.LoadMenu(IDR_MENU1));
::GetCursorPos(&posMouse);
menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, posMouse.x, posMouse.y, this);
236 :
225:2006/12/28(木) 12:32:21
自己解決しました
CMenu* pPopup = menu.GetSubMenu(0);
pPopup->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, posMouse.x, posMouse.y, this);
ここはおまえの日記帳じゃねえ。
1週間くらい悩むような問題を質問しろよ。
238 :
225:2006/12/28(木) 15:30:47
ニートじゃないのに1週間も悩んでられるかよ
文句しか言えない無知は黙ってろ
配列で作ったマルチスレッドの破棄をメインスレッド側からするには
どうすればいいのでしょうか?調べたんですがflagを立てるやり方しか見つかりません
その方法ではユーザーインターフェーススレッドのような複雑な処理をしているときになると
通じないと思いますぜひ知恵をお貸しください
MFCと関係ない
MFCで開発してますがVC++のほうで聞いたほうがよかったですか?
普通にMFCクラスから派生して作ったのでMFCだと思うんですが
なにがどう関係ないのかの説明をいただきたい
UIスレッドはPostQuitでいいじゃん
PostQuit?
PostQuitとはトレードクラスのメンバ関数ですか?
そのようなものは無いと思うんですが
PostQuitMessageだろう
PostQuitMessageだとスレッドどころかアプリケーション終了しますよ
UIスレッドなら
スレッド側に、メッセージ受けると終了するような仕組みを作る。
メインスレッドからスレッドにPostMessage or PostThreadMessage。
必要に応じて、メインスレッドはスレッドが終了するまで待機。
なるほど
ありがとうございますやってみます
VC6 で組んだプロジェクトが VC7 でコンパイル出来なくて困ってます。
ユーザー定義メッセージのとこなんですが。
メッセージマップで
ON_MESSAGE(WM_USER_ENDTHREAD, OnUserEndthread)
ヘッダで
afx_msg void OnUserEndthread(UINT wParam, LONG lParam);
実体部で
void CPg1::OnUserEndthread(UINT wParam, LONG lParam)
{
;
}
としているのですが、コンパイル時に
pg1.cpp(130): error C2440: 'static_cast' : 'void (__thiscall CPg1::* )(UINT,LONG)' から 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)' に変換できません。
とでます。
VC6 では問題ないのですが・・・。 ご教授下されば有難く思います。
エラーメッセージそのまんまじゃん
252 :
250:2006/12/28(木) 22:30:23
>251
void を LRESULT にしろってことですかね?
ユーザ定義メッセージハンドラの仕様が変わったというだけのことですか。
相当古いよそれ
俺はGetWindowLongでとった値をどうキャストかけても警告だったかエラーだったか消えなくて悩んだ覚えがあるな。
結局、どうしたっけな・・・。
255 :
239:2006/12/29(金) 12:15:18
PostThreadMessageでメイン側からWM_QUITメッセージを飛ばし終了させようとしたのですが
Instanceでの処理は止まらないので終了することができません
WM_QUITの代わりのメッセージを作ったとしても終了処理をどうすればいいのでしょうか
Instance→Run→ExitInstanceの流れを通らないとスレッドの破棄は難しいのでしょうか?
>>248さんの終了処理するような処理をどうすれば実装できるか困っています
>>255 文字通り、サブスレッド側でメッセージを受け取れば宜しい。
逆に言えば、サブスレッド側をそのように作らないといけない。
詳細は、サブスレッドの作りが判らないしスレ違いになるので割愛。
質問です。
タブ上にリストコントロールを表示する為、メンバ変数作って
OnInitDialog関数内でリストをCreateしています。
(タブはリソースエディタで貼り付けています)
表示はできたんですけどなぜかリスト内の項目が選択できません。
なんででしょう?とりあえずこんな感じで作ってます。
m_Tab.GetClientRect(&rcRect);
ClientToScreen(&rcRect);
rcRect.left -= 21;
rcRect.right -= 5;
rcRect.top += 44;
rcRect.bottom += 52;
m_ListCtrl.Create(LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_NOCOLUMNHEADER|LVS_REPORT|LVS_SHOWSELALWAYS,
rcRect, GetParent(), IDC_JOURNALSHOWSET_LIST_KP);
>表示はできたんですけど
本当に?
GetParent()はダイアログの親ウィンドウを返してると思うんだけど。
こいつ思い出した
結果オーライ
> 90 名前:デフォルトの名無しさん[] 投稿日:2006/12/04(月) 13:59:24
> ダイアログにタブコントロールを乗せ、複数のリストビューの表示をタブで切り替える
> ソフトを書いていたんですが、タブに重ねたリストビューの列サイズを操作すると
> リストビューの表示が乱れる現象が出てしまいました。
>
> (中略)
>
> 結果オーライといえばそれまでなんですが、どうしてこれで問題が解決するのか納得が
> いきません。リソース中の定義順が何に影響しているのでしょうか?
260 :
デフォルトの名無しさん:2006/12/30(土) 15:35:51
MDIタブ age
261 :
デフォルトの名無しさん:2006/12/30(土) 15:57:27
メニュー項目を選択すると CSliderCtrl を WS_POPUP で作って表示させる処理を
ダイアログに追加していたんですが、ダイアログを終了する時にビープが一発鳴る
ようになってしまいました。
どこで鳴ってるのかデバッガで追ってみたところ、InitInstance の最終行、return FALSE;
で出て行ったあとのようです。この先も追いたいんですが、F11ではこれ以上追えません
でした。どういう風にデバッグすればいいでしょうか?
ダイアログを終了する時にInitInstanceなのか?
ダイアログベースのMFCアプリケーションなので、ダイアログの終了=アプリ
の終了という構図です。Wizardが作ったコードそのままですけど、下記のような
雰囲気です。
BOOL MyDialogApp::InitInstance()
{
いろいろ初期化
CMyDialogDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
;
else if (nResponse == IDCANCEL)
;
return FALSE;
}
>>260 ヒント:
void CMainFrame::RecalcLayout(BOOL bNotify)
CWnd::RepositionBars()
先月からMFCを勉強し始めた者です。
以下のようにCFileDialogを使用して、ファイルの読み込み処理をつくりました。
これを、ビューの領域に表示するにはどうすればいいのでしょうか?
「void CFOpenView::OnDraw(CDC* pDC)」に処理を書けばいいと思うのですが、全然わかりません。
どなたか、教えてください。
void CFOpenDoc::OnFileRead()
{
CFileDialog CFDlg(TRUE, _T("txt"), NULL, OFN_HIDEREADONLY, _T("TEXTファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*||"));
CString String, FilePath;
CStdioFile StdFile;
if( CFDlg.DoModal() == IDOK){
FilePath = CFDlg.GetPathName();
if(StdFile.Open(FilePath,CFile::modeRead)){
StdFile.ReadString(String);
StdFile.Close();
} else {
AfxMessageBox(_T("ファイルが開けない"));
}
}
}
Hello, Worldと同じ
文字列を表示するだけ
267 :
265:2007/01/03(水) 12:39:21
>>266 レスありがとうございます。
試してみます。
ダイアログベースのプログラムを作成しています。
フォームにボタンを配置して、そのボタンのCaptionを動的に変更したいのですが、方法が分かりません。
CButtonクラスメンバの中にもそれっぽい関数が見付からず途方に暮れてます。
方法があれば教えてください。お願いします。
CButtonの基底クラスのメンバ関数
270 :
268:2007/01/03(水) 19:06:07
>>269 ありがとうございます。
普通にSetWindowTextで変更できたのですね。
助かりました。
VC++2005上でVBMP3.dllというライブラリを使用し、MP3を再生するプログラムを作成しています。
MP3ファイルをオープンするために呼び出す関数 vbmp3_openはヘッダ中に以下のように宣言されています。
BOOL APIENTRY vbmp3_open(const char* pszName, InputInfo* pInfo);
で、プログラム中で
vbmp3_open(FileName, &pInfo); // FileNameはCString型
としたところ、Debugでのコンパイルは成功するのですがReleaseのコンパイルが以下のエラーとともに失敗します。
error C2664: 'vbmp3_open' : 1 番目の引数を 'CString' から 'const char *' に変換できません。
この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。
といった状態です。解決方法はありませんでしょうか。
Unicodeネタいい加減飽きた('A`)
簡単な質問だと答えがすぐに返ってくるねぇ
MDIタブの実装方法は難しくてここの住人に答えるのは無理ってことかぁ
MFCにMDIタブがあればすぐ教えてやるけど
ないものは教えられない
用意された機能は使えるけど
自分でMFCを拡張してタブを実装する技術はないってことだな>274
MFCの設計に含まれていない以上、
Office2007のリボンの実装方法聞いてるのと同じようなものだからなあ。
頑張れば出来るんじゃね?としか言いようが無い。
275は仲間を見つけて喜んでいるようだ
MFCにMDIタブを実装した経験のある おいらが来ましたよ
んで何が聞きたいんだ?
奥さんが欲しいです
>>279 以下のように2行コメントにしてみて
for(int i=0; i<FEMALE_MAX; i++){
if(female[i].IsMarried()==TRUE)
continue;
if(female[i].GetAge()<16)
continue;
// if(female[i].CheckQuality()==FALSE)
// continue;
propose(female[i]);
}
先生!なぜかループが一回も回りません!
>>281 femaleが空なんじゃないか?
つーか、FEMALE_MAXが0なのか。
//if(female[i].GetAge()<16)
// continue;
こういう余計な制限もとっちゃおうぜ。
//if(female[i].IsMarried()==TRUE)
// continue;
よく考えたらこれだって別に大した制限じゃねぇな。
if(female[i].GetAge()>35)
continue;
さすがに遠慮したいから入れておこうな。
>>281 しょうがない、female -> maleに置き換えるんだ。
MFC使ってるやつ少ないのかと思ってたけど
くだらない話になると書き込みが増えるな
ROMってるやつ多いのか?
VisualC++ .net Standard使用
CImageのLoadFromResourceに関して質問です
BITMAPリソースは読み込むことができるのですが、jpgファイルをバイナリリソースとして格納した場合に、こいつを読み取ってくれません
LoadResourceを使ってtmpファイルでも書き込んでからCImage::Loadなんて馬鹿馬鹿しいですし
何とか簡単にリソースに埋め込んだバイナリデータのjpgを読み込ませる方法はないでしょうか?
ちなみに、こんな感じでやってます
CImage image;
image.LoadFromResource(GetModuleHandle(NULL),ResourceID);
あまりにもバグって気持ち悪くなってきた
VC6にはCImageないんだよな
DIB程度ならCreateDIBSectionをCBitmapにAttachとかで済むから、あまり困らなかったな。
>>288 ::CreateStreamOnHGlobalとCImage::Load(IStream *)を使えば、ファイル無しでできる。
効率から言うと、バイナリリソースアクセス用のIStream実装を書いた方が良いけど('A`)マンドクセ
292 :
デフォルトの名無しさん:2007/01/07(日) 01:51:10
初期状態でドッキングされていないツールバー(フローティングツールバー?)の作り方を教えてください
普通のツールバー(ドッキングされているツールバー)はスケルトン作成(SDI or MDI)したソースを見れば
分かりそうな感じですが、それとスタイルが違うツールバーはどのように作れば良いですか?
グーグルで調べているのですが、思ったような情報に行き当たらず困っております
MDI野郎の文体だね
>>291 サンクス
CreateStreamOnHGlobalでいけました
というか、IPictureをかまさないとストリームにならないのでかましたわけですが
これを使うとCImageの意味がまったくをもってないですね(笑)
MFCのフローティングツールバーはMFCが自力でやってるから
具体的な方法はMFCのソース読めばわかるよ
確かバーの上に張り付いてるやつを別ウインドウ開いて丸ごと引っ越すだけだったと思う。
296 :
デフォルトの名無しさん:2007/01/08(月) 17:20:10
>>295 レスありがとうございます
ど素人(入社1年目)なので、それだけですとやり方が分かりません・・・
297 :
デフォルトの名無しさん:2007/01/08(月) 17:27:33
追加で質問をさせてください
ツールバー上のアイテム(ボタン?)をドラッグした時に
点線の四角形またはそのアイテムのアイコン(半透明)を
ドラッグ中のマウスポインタの横に表示させるにはどうすれば良いですか?
イメージとしては、VC++でダイアログリソース編集時にコントロールアイコンを
ツールバーからドラッグした時のような感じで
>>296 自力で調べて判らないようなら上司なり先輩なりに聞け。
それでも判らないようならあんたには不適当な要求仕様なのだからそう上司(なり指示した人間)に言え。
>>298は的確だと思ったな
あと2ちゃんで仕事をにおわせると答えてもらいにくくなるよ
タダで教えてその内容で相手は金を得るわけだし
>>301 要求仕様のさばき方相談室じゃないんだよー
会社だったら違う人に仕事まわすだけだろ
できない仕事をかかえこまないように
>>296でわからないっつーのはもうアレだ。
なんつーか色々と色んなことが困難だw
>>292,296
質問の意味が2通りに取れるんだが
MFC標準のCToolBarをフローティング状態で表示したいってこと?
それとも独自にフローティングツールバーを実装したいってこと?
おそらく前者の意味で聞いてるんだと思うけど、
それならCFrameWnd::FloatControlBar()でフローティング状態にできるよ。
後者なら、MFCのソースを参考に自分で書けとしか言えません。
308 :
デフォルトの名無しさん:2007/01/09(火) 11:46:02
ダイアログバーにIDC_STATICのスタティックテキストを貼り付けると、
そのテキスト上でのマウスドラッグはバーのドラッグ処理になりますが、
これってどのような仕組みなのでしょうか。
ダイアログバー内に貼り付けた自作ウィンドウクラスにも
このような動作を組み込みたいんです。
OnNcHitTestでHTTRANSPARENTやHTCAPTIONを返してみても
まったく動かなかったり、コントロールだけが動いたり、
ダイアログバー内でダイアログ自身が動いてしまったりと、
仕組みがわからずに苦戦しています。
同じスタティックテクストでも
IDC_STATIC以外の名前を付けるとドラッグにならないようなので、
コントロールバークラスがIDC_STATICに対して
なにか特別なことでもやっているのでしょうか。
初心者はIDC_STATICではまる
初心者 IDC_STATIC の検索結果 約 211 件中 1 - 10 件目 (0.25 秒)
311 :
デフォルトの名無しさん:2007/01/13(土) 23:36:22
ドキュメントビューアーキテクチャという概念がよく分かりません
ドキュメント: プログラム内で共有するデータを扱う, メンバ変数がたくさんある, ファイル入出力
ビュー: ユーザとのインタフェースを扱う, 描画を取り仕切る, コントロール管理
の認識でOKですか?
いや
>>311 概ねOKじゃね?
どっちかっていうとその役割よりドキュメントとビューがセットで1つになってること(ドキュメントテンプレートってのなかった?)
新規作成でできるもんがドキュメント+ビューを型にしたインスタンスであることって方が重要のような気がするがわかっているならOK。
そうすると自然にMDIのアプリは
1.メインフレーム(メニューとかくっついてる)
2.(ドキュメント+ビュー)X新規作成で生成された数分
3.その他のツールウィンドウやダイアログ
で構成されることになる。
VCだと
・メインフレーム(メニューとかくっついてる)
・ソースコードエディターとかリソースエディター等など(新規作成からできる奴)
・ソリューションエクスプローラーとかアウトプットウィンドウとか・・・
にあたる。
強引に「こうやって作れよ!」っていう型なんで設計からしてこうやってなってないと駄目っちゃ駄目だなw
314 :
311:2007/01/14(日) 00:12:54
ありがとうございます
315 :
スイ:2007/01/14(日) 00:22:26 BE:311467872-2BP(0)
↓ハイ、次の方どうぞ。
えっと、これ本番ですか?
319 :
デフォルトの名無しさん:2007/01/14(日) 08:06:10
>>318 ええ!?
>>313のどこをどう読めばが複数ドキュメントの解説がメインになってるの?
とんだ濡れ衣だ!勘違いなら謝ってよ!
X複数ドキュメント
○複数ドキュメントタイプ
>新規作成でできるもんがドキュメント+ビューを型にしたインスタンスであることって方が
>重要のような気がするがわかっているならOK。
SDIでは100%成り立たないし、単一のドキュメントタイプをもつMDIなら自明で重要性は感じられない。
これが重要な意味を持つのは複数のドキュメントタイプをもつMDIしかないように思った。
確信犯だと思ったんだが、気に障ったのなら謝るよ。漏れの知らない世界があるんだろうね。
>>321 え?じゃあ、君の勝手な妄想で俺につっかかってきたの?
それとあきらかにその文章で複数ドキュメントタイプの説明なんて書いてないのにその態度はなんなの。
しかも、確信犯の使い方も間違ってるし。
こんなの業務でやったら大変だぜ。改めろよ。
いや、改めなくていいから一切社会活動を行なわないでください。
>VS2005でMFCアプリのデフォルトプロジェクトがMDIになったのは大失敗な気がする。
これ昔からだろ、2005ではじめて触ったのか
SDI MDI
MFC以前からある
ドキュメント/ビュー
MFC2.0で追加された
CFrameWndの派生クラスをドキュメントテンプレートから閉じるにはどうしたらいいでしょうか。
つまり class CHogeDocTemplate : public C[Single/Multi]DocTemplate
の OpenDocumentFile で特定のフレームを閉じる様にしたいのですが、
閉じる時に CFrameWnd::DestroyWindow や OnCloseDocument を使うと
OnClose が呼びだされないがこれで大丈夫なのか、
だめだとしたら正しい閉じ方はどうなのかを教えていただきたいのです。
よろしくお願いします。
普通に閉じればいいじゃん
CFrameWnd::OnCloseからDestroyWindow呼んでるから
OnClose が呼びだされないのは当たり前
>>327 普通にとはどのようにでしょうか?
>>328 その通りです。OnClose から閉じる方がドキュメントを閉じる等の処理も
正しく行われるように読めたので出来ればそうしたく質問しております。
OnCloseからOnCloseDocument呼んでるから
OnCloseDocumentからOnClose が呼びだされないのは当たり前
OnCloseはウィンドウを閉じる時
OnDocumentCloseはドキュメントを閉じる時
と考えれば何も問題ないべ
332 :
デフォルトの名無しさん:2007/01/16(火) 04:24:49
CPUやメモリをあまり気にせずにプログラム書いてたら
起動しただけでCPU使用率50%という異常な状態になっていました。
このプログラム自体、起動と同時に行う処理はほとんどなく、
SDIのスケルトンと同じようなもののはずなんですが。。
処理がないのにCPU使用率が高いまま下がらないのは
原因としてどのようなことが考えられますか?
もしくは原因を調べる方法とかってありますか?
http://pc10.2ch.net/test/read.cgi/tech/1168708801/17 に最初書き込みましたが、こちらのが適切かなと思って移動してきました。
Acrobatのページサムネール表示、あるいはPowerPointのスライド一覧表示のように、
イメージのリストを表示し、かつ、その順番をマウスのドラッグで調整したいと思ってます。
ドラッグ中、イメージが挿入される場所にカーソルの様な縦線が出てきて欲しいなと思ってます。
こういうコントロールの既存の実装やコードのサンプルなど御存知でしたら御教示頂けないでしょうか?
codeguru、codeprojectは廻ってみたものの、どうにもサムネールの表示どまりでして・・・
ある場所から突然malloc(255)がNULLになります。直前のmallocは必ず成功で、場所は一定
HEAP、スタックを2000000(2M)や20000000(20M)で試しましたが、タイミングや場所は変わらないようです
お手上げです。解決策をお知りの方おりませんか?
直前のmallocまでのすべての戻り値をここにさらしてごらん
直前のmallocの戻り値でいいですか?
malloc(255);//必ず成功。 戻り値:0x00b72e68
WideCharToMultiByte
MultiByteToWideChar
malloc(255);//必ず失敗
こんな感じです
ヒープ壊してんじゃねえの
解決しました!
MultiByteToWideCharを2度使いmallocのサイズを指定していたのですが、wchar単位でNULLが含まれていないため少なくなっていました
成功するほうをmalloc((len+1)*sizeof(wchar_t));で動きました。
ありがとうございました。
CStringWじゃ駄目なのか?
>>332です。
>>336 ありがとうございます。
プロファイルで調べたところOnIdle()のreturnが原因だったようです。
そのreturnのことで質問なのですが、
OnIdle内でのレンダリングによってCGアニメーションを表示するプログラムを書いているのですが、
return TRUE;だと前述のようにCPU使用率が高くなるのですが、
アニメーションは正常に表示されます。
return CWinApp::OnIdle(lCount);だとCPU使用率の問題は解消されるのですが
OnIdle()が呼ばれる間隔が長くなるためか、アニメーションが滑らかに表示できません。
この2つを同時にクリアできる良い方法はありませんか?
よろしくお願いします。
んー、、、目的の fps が取れてるなら Sleep(0)を呼ぶとかどうだろう、Sleep(1)でもいいが
ほっといてやれ
>>344 ありがとうございます!!
どうやらすごく基本的なことのようですね。。
マルチラインエディットボックスで
水平方向のスクロールバーの位置から
列の何文字目から表示している知りたいのですが
どうすればいいのでしょうか?
やりたいことはエディットボックスの中身を編集して
かきかえても書き換える前と同じ位置を表示したいのです。
LineScrollを使用すれば垂直はうまくいくのですが、水平がうまくできません。
また、SetScrollPosを使用してもエディットボックス内が更新されないのでこまっています。
>>347 「書き換えても書き換える前と同じ位置」というのもよくわからないんだけど、
わざわざスクロールバーを使っているのはなぜ?
単純にGetSelでカーソル位置を取得しておいてSetSelで戻すだけじゃダメ?
あと、エディットボックスの更新するにはUpdateData(FALSE)とUpdateWindow()
じゃない?
質問がよくわかってないのではずしてるかも知れんけど。
349 :
347:2007/01/19(金) 14:44:11
>>348 さん
レスありがとうございます。
自己解決しました
CWnd* CWnd::GetDlgItem(int nID); で得られるCWndのインスタンスの解放は
誰に責任があるんでしょうか?ソースコードを少し追ってみると、独自のアロケータ
でごにょごにょやってるような感じなんですが。
351 :
350:2007/01/19(金) 16:23:11
自己解決しました。こういう一時的に作ったオブジェクトはMFCが勝手に
CWinApp::OnIdle() → CWnd::DeleteTempMap() あたりで解放するんですね。
ソース追うのもいいけど、ヘルプもみよう
いや、だってヘルプには「返されるポインタは、一時的なポインタです。後で使用するために保存しておくことはできません。
」としか書いてないから、誰がどこでいつ解放するか気になるじゃん?
一時的なポインタを解放するのか?
そりゃ解放するでしょ。問題は誰がいつどこで開放するかであって、それに
よって「一時的なポインタ」とやらの有効範囲が決まってくるわけだから。
クラスがなんだかわかってないのでは?
あれ、FromHandle()あたりからDeleteTempMap()をたどって知ったんだったかな、、、
ヘルプだけで一時的なCWnd*がいつ消されるかも読んだ気がしたが・・・
>>357 それがヘルプに書いてあれば悩む必要がないのにね。
すいません。
自作でエクスプローラ風アプリケーションを作りたいのですが、
それ風なサンプルを説明しているサイトとか知りませんか?
全く、それ系のインターフェイス名も知らないんで、
ググれなく困っています。
せっかく教えても無駄になりそうだからやめておこう
362 :
361:2007/01/22(月) 20:56:48
質問なんですけど
AppクラスからDocumentクラスのポインタの取得方法を教えてください
よろしくお願いします。
自分で持ってそうな気がするけど
Viewが一つだけなら
GetFirstDocTemplatePosition()、GetNextDocTemplate()、GetFirstDocPosition()、GetNextDoc()
あたりで。
366 :
363:2007/01/23(火) 11:19:24
>365
GetFirstDocPosition()、GetNextDoc()で取得できました。
ありがとうございます。
367 :
デフォルトの名無しさん:2007/01/25(木) 16:20:26
スライダについて質問です
slider.SetRange(0, 100, true);
slider.SetTicFreq(10);
slider.SetPos(0);
このようなスライダを作り、スライダで設定した値をEditBoxに表示しています。
このとき、スライダのつまみをドラッグした場合には正しい値が得られますが
クリックで設定しようとした場合が上手くいきません
例えば、70を設定しようと思って該当する目盛りのあたりをクリックすると、
70の位置には来ず、マウスボタンが押されるたびに60と80で切り替ってしまいます。
クリックでも値を設定できるようにするには、何か特殊な処理が必要なのでしょうか?
スライダの現在位置が0の時に70の位置をクリックしたら
0+GetPageSize()で得られる位置に移動するのがスライダ
コントロールの仕様だと思うんですが。
仕様が気に入らないのであれば、自分で必要なイベントを拾ってSetPos()すれば良い。
369 :
デフォルトの名無しさん:2007/01/26(金) 01:06:48
CEdit::SetFoces()に関する質問です。
任意のテキストフィールドをフォーカスさせたい場合は
CEdit::SetFocus()を行うと実現できますが、
このとき、フォーカス対象のテキストフィールドに文字列が
入力されているとき、文字列全体を範囲選択した状態で
フォーカス移動させるにはどのような手法があるでしょうか?
イメージとしてはタブでフォーカス移動させたときのような感じです。
よろしくお願い致します。
370 :
369:2007/01/26(金) 01:14:49
ごめんなさい。自己解決しました。
CEdit::SetFocus();
CEdit::SetSel(0,-1);
で実現できるようでした。
371 :
デフォルトの名無しさん:2007/01/27(土) 01:54:56
ダイヤログベースのアプリです。
英語化について教えてほしいです。
タイトルアイコンをクリックした時のシステムメニューや、
AfxMessageBoxを表示させたときのキャンセルの表示など
あらかじめ用意されている部分に日本語が表示されますが、
すべて、一切がっさいを英語にしたいと考えています。
どのような方法で英語かすることができるでしょうか?
>371
アプリケーションを実行するとき、デフォルトのコードページを英語に変更する。
でも、システムのバグをたたくこともあるからお勧めしない。
英語環境でビルドしてあるやつでもそうなるから
OSの問題だろ
だから実行時指定
>>371 日本語関連を全くインストールしていない、設定も悉く日本にしていない端末で、実行する。
MFCは全くの初心者なのですが、MFCにもバージョンはあると思うのですが
Visuall C++(VC6)に付属のMFCのバージョンはいくらになりますか?
6.0
WikipediaのMFCの項目、批判の所見てワロタ。
どこの知障だよ、書いたの。
>378
DelphiやJavaはライブラリらしい。しかも、C++はコンパイル時間が長いらしい。
380 :
372:2007/01/27(土) 19:01:12
>371
あと、afxMessageBoxにはユーザ拡張用の前呼び出し処理があるから、
それを横取りして自作のメッセージボックスを表示する。
とかかな。
コンパイル時間は長いとは思うけど、他のオブジェクト指向言語と
比べてどうなのかはわからんな。
ただ、「C++だから」ってより「色々インクルードするから」長いんだけど。
実行時コンパイルの方が好感もたれるのか
すみませんMFCど素人です
ANSIの
unsigned char foo[64]
MFCではどの様に書いたらいいのでしょうか?
コンパイラはVC6です
unsigned char foo[64]
ガベコレがないのが致命的欠点であるかどうかは検証不可能だから
これはもちろんWikipediaに書いてはいけない。
Delphiの方にもしょうもない書き込みしてるが、
群を抜いているのなら特定のソフトウェアをあげつらう必要はなかろうに。
「中立的な観点」を欠いてしまっているのが分らないのかね。
386 :
デフォルトの名無しさん:2007/01/27(土) 23:24:57
何で C# って使われてないの?
VC++ ネイティブのより多少計算とか遅いかもしれないけどさ、
開発が VB 並にめっちゃ楽だし、
文法は Java そっくりで習得も移行も容易だし、
全体的にスマートな印象を受けるじゃん
いい加減 VC++ 信仰は止めて欲しいんだよね
一々 Windows と UNIX(Linux) 版を作りたくねーんだよ
もうさ、時代は中間言語の時代だと思うね
頼むから、ネイティブ信仰は止めようぜ
な
>>386 TPOで使い分けるでFAだろ。
まあその手の議論は実りがないから他でやったほうがいいな。
InitDialog中で、必要なファイルがあるかのチェックをして
なければSendMessage(WM_CLOSE);として終了するようにしているのですが
一瞬Windowが表示されてしまいます。。。
Windowを表示させずにそのまま終了する方法はないでしょうか?
ダイアログ出す前に調べる
>>388 モーダルならEndDialog、モードレスならDestroyWindow。
ほほぉ、それからそれから?
VC8のMFCではダイアログボックスに貼り付けるボタンやテキストボックスのサイズや
表示位置をそれぞれのプロパティから数値で詳細に設定できるのですが、VC6のMFCでは
そのようなプロパティに項目が見当たりません、VC6で皆さんは位置決めやサイズを
何処で設定されているのでしょうか?
テキストエディタ
395 :
デフォルトの名無しさん:2007/01/28(日) 16:34:24
ダイアログベースのアプリです。
ウインドウサイズをマウスで自由に変更できるようにするには
どのような設定、または処理を作れば良いでしょうか?
SDI/MDIベースでないとできないですか?
いいえ。
サイズ可変のスタイル付ければダイアログ自体のサイズは変えられるようになるが
中のコントロールもそれにあわせて調整したければ、自分で書くしかない。
398 :
デフォルトの名無しさん:2007/01/28(日) 17:17:53
>>397さん
お返事ありがとうございます。
サイズ可変のスタイルのつけ方は、具体的なコードイメージを教えていただけないでしょうか。
ダイアログ内部に設置したCEditのコントロールもあわせて変更するように実装します。
399 :
396:2007/01/28(日) 17:44:13
スルーされたから要点だけ突っ込み。
>サイズ可変のスタイルのつけ方は、具体的なコードイメージを教えていただけないでしょうか。
MSDN嫁。リソースで定義したダイアログならリソースエディタのプロパティの該当項目をチェックするだけ。
>ダイアログ内部に設置したCEditのコントロールもあわせて変更するように実装します。
サイズ変更のメッセージハンドラを書く必要がある(勿論そこでCEditのサイズを調整する)ので、
初心者向けの解説サイトでも探して解説を読め。
すいません。でも方法教えていただきありがとうございました。
これからはMSDNみてから質問します。
CEditのほうもありがとうございました。
>>401 VC6の場合画面の右下のステータスバーに座標とサイズが表示されてるから
それを見ながら、マウスかキーボードで配置する。
[↑↓←→]で位置の変更、[Shift]+[↑↓←→]でサイズ変更。
もしくはリソーススクリプトを直接編集する。
ダイアログ上にコントロールを大量に貼り付けて等間隔に位置を合わせるtips。
1.テキストエディタで.rcファイルを開く。
2.DIALOG内のCONTROL行をcsvファイルとして保存する。
3.以下省略。
すごい大量のとき役立ちそうだなw
ダイアログエディタに位置そろえる機能ついてるけど
>>403の3.の部分はストリングテーブルを書くときに便利だな。
defineと日本語/英語の文字列が一気に書ける。同時に仕様書も作れて一挙両得。
defineの数値はドラッグすれば1づつ増やせるからバグもでない。
407 :
デフォルトの名無しさん:2007/01/30(火) 23:29:19
フレームウィンドウとかの OnDestroy について質問です
通常 OnDestroy の中では親クラスの OnDestroy を呼んでいますが、
その親の OnDestroy の直前の部分でメモリ開放処理を行うのは良くないですか?
リストに登録されているアイテムを開放したいのですが・・・
>>407 良くないと思う理由は?
リストってリストボックスやリストビューコントロールのこと?
409 :
デフォルトの名無しさん:2007/01/31(水) 00:00:58
>>408 CListCtrl のことです
これに new で生成したオブジェクトを登録?しています
そのまま終了するとメモリリークが発生してしまうので、
ウィンドウが破棄される直前に開放しようと思いました
それで OnDestroy に追加することにしました
良くないと思った理由は、親クラスの OnDestroy を
呼んでいるところの下にデフォルトで「ここに追加」
的なコメントが入っているからです
410 :
デフォルトの名無しさん:2007/01/31(水) 00:10:13
CListCtrlが消えるのいつなん?
プログラムが生成→消滅→生成→消滅→・・・ってやってるか
生成→表示→非表示→表示→非表示→・・・消滅ってやってるかでタイミング違ってくるじゃん。
生成したインスタンスを消したいタイミングはいつよ?
最終的に(それがいつだかはアプリにもよるが)インスタンスを確実に消滅さしときゃ問題ねーんだしよ。
411 :
デフォルトの名無しさん:2007/01/31(水) 00:29:46
リストは起動時から終了時までずっと表示です
終了時に一覧情報を保存して破棄することにしています
できるだけ綺麗な(オブジェクト指向的な)ソースコードを
書きたいので、親の OnDestroy の前が正解か後ろが正解か
が気になります
413 :
デフォルトの名無しさん:2007/01/31(水) 00:51:06
>>412 ありがとうございます!
やってみます!
>>411 だったらOnDestroyは関係ないんじゃない?
つか、親のOnDestroy後にCListCtrlにアクセスされたら(するのか?)死ぬじゃない。
親のデストラクタでdeleteしとけばいいんじゃね?やってみ、やってみ。やってみたら結果報告ヨロ
CMainFrame::OnDestroy()の前後どっちか2択と言われたら後に1票。
個人的には、Documentで扱っているデータなら
CHogeDocument::OnCloseDocument() or OnSaveDocument()
ViewのみでやってるならCHogeView::PostNcDestroy()でやると思う。
CMainFrameにCListCtrlのデータ持たせるとViewからデータへの
アクセスが面倒じゃない?
416 :
デフォルトの名無しさん:2007/01/31(水) 01:08:09
親ウインドウと関係あるのはopenからcloseまで
closeしたらウインドウ関係ないから心配いらん
>綺麗な(オブジェクト指向的な)ソースコード
普通はデストラクタで解放
418 :
デフォルトの名無しさん:2007/02/01(木) 00:21:49
CListCtrl コントロールのイベント処理ですが
クリック時とダブルクリック時とで処理を分けたいと思っています
しかし、ダブルクリック時には先に必ずクリックイベントが
発生してしまってうまくいきません
NM_DBLCLK の直前に NM_CLICK が発生するのを
防ぐことはできませんか?
仮にNM_CLICKが発生しないようにしたらシングルクリック時の処理が出来ない。
コントロールの身になって考えれば、ユーザーのクリックがシングルなのかダブルの1発目
なのかの判断はできない。
シングルクリック時の処理開始をしばらく待ってみる以外手はないと思う。
420 :
デフォルトの名無しさん:2007/02/01(木) 01:11:47
>>419 レスありがとうございます
つまり、NM_DBLCLK 前には NM_CLICK が
絶対に発生してしまうということですね
何か良い手はないですかね・・・
本来はダブルクリックってーのは、シングルクリック→メニュー等選択
のショートカットだから、シングルクリックのあとにダブルクリックがきても
何も困らないんだけどな。
ダブルクリックを変なことに使おうとするからこうなる
これからMFCの勉強を始めたいのですが
書籍の「標準講座MFC」って今でも役に立つでしょうか?
MFC6.0ってちょっと古いみたいですが、最新のバージョン(MFC8.0?)と
大きく違うところってあるのでしょうか
仕事でどうしても必要なのか?
でなければ止めとけ。
>>423 新しいUI関連のクラスがいくつか無いだけで、基本はそんなに変わってないと思うけど。
427 :
デフォルトの名無しさん:2007/02/03(土) 21:57:59
お前ら教えてください。
ツールバーのボタンに文字列のみ表示したいのですが、
TBBUTTON::iBitmapにNULLを指定しただけでは
イメージ(アイコン?)のスペースの分のスペースが空き、
そこから先から文字列が描画されてしまいます。
どうすればいんでしょうか?
CToolBarでできそうな気がするけど
429 :
427:2007/02/03(土) 22:47:49
>>428 なるほど!
CToolBar::SetSizes()の中にやり方が書いてありました。
助かったよ!ありがとう!
今、Visual C++ 6.0 を使ってるのだが、開発環境をバージョンアップしようとしたら
どれを導入すればいいのだろう?
無料で配布されている Visual C++ 2005 Express は MFC は入ってないんですよね?
それとも、あと少し待って次のバージョンが出たときのほうがいいんでしょうかね。
431 :
デフォルトの名無しさん:2007/02/04(日) 09:26:03
>>430 そりゃおめ、vista上で動くモン買えや。
いま、XPでなにやら揃えるのは無駄でしょ?
432 :
デフォルトの名無しさん:2007/02/04(日) 11:30:15
IEのメニューの用に画面に収まりきらないメニューがある場合は
「>>」を表示し、「>>」を押せば残りのメニューが表示されるようにしたいのですが、
そういったコントロールがあるのでしょうか?
どなたかヒントだけでもわかる方おられましたら教えてやって下さい。
軍人や警官の袖に付いている山形の袖章のことをいうのだそうです(多分)。
USECHEVRONあたりで探せば?
435 :
432:2007/02/04(日) 12:31:54
>>434 「>>」はChevronって言うんですか用語自体知りませんでした。
Chevronでぐぐればすぐにでてきました。
教えていただかなければ数日ははまるとこでした、
ありがとうございます。
フランス車に詳しければ直ぐに判るんだがな。
437 :
デフォルトの名無しさん:2007/02/04(日) 22:58:24
CFont::CreateFontとかCFont::CreateFontIndirectって
CFont オブジェクトを使い終わったら、最初にデバイス コンテキストからフォントを選択して、それから、CFont オブジェクトを削除します。
ってあるけどデストラクタで解放してくれないの?
解放しないままアプリ終了したらリソースリークするのかな?
438 :
デフォルトの名無しさん:2007/02/04(日) 23:01:29
CClientDC::SelectObject
よばなきゃ問題ないのか???
よくわからん
439 :
デフォルトの名無しさん:2007/02/04(日) 23:06:49
エディットボックス内のフォントを変更すのみで
DCで直接使用しない場合は問題ないのか???
MSさんさっぱりわかりませんorz
SetFontで
>>437 デバイスコンテキストに選択されたままだと解放されないと思った。
442 :
デフォルトの名無しさん:2007/02/05(月) 17:27:27
|あいう |^|
|えおか| | |
| | |
| | |
5| | |
| | |
| リッチエディット | |
| | |
| | |
10| | |
| | |
| | |
| | |
| | |
15|--------------------------|↓|
スクロールバー
こんな感じの画面を作ることになったのですが
右のスクロールバーと左の行数のコントロール?(何でもいい)で
同期をとりたいのですがどのようにしたらよいのでしょうか?
なにかヒントでもありましたらご教授をお願いいたします。
環境:VC++2005 MFC
すみません。CFileFind について、みなさんのお知恵を貸してください。
エディットボックスに入力したパスを CFileDialog で開く、という処理を作ってまして、
入力したパスの存在チェックを CFileFind で行っています。
ですが、C:\ や、\\hoge\ 等、ドライブのルートを指定した場合に存在を検出できず、
前回開いたフォルダがFileDialog で開かれてしまい、困っています。
どなたか良い方法をご存知でしたら、ご教授ください。
よろしくお願い致します。
単独で現れる\記号の数をカウントすればいいんじゃないかい
"\\"はReplaceで別の記号に置き換えるとかして、
その後で"\"が1個だけならルート
つか、そのまえになんでCFileFindってそんな厨仕様なの?
なんか意味あんじゃね?
試してないけどCFileDialogで存在しないパスは指定できないような気がするけど
ああそうか指定したパスをCFileDialogで開きたいのか
>>444 ルートディレクトリが検出されないのは、内部で呼び出しているAPI側(FindFirstFile)の仕様。
CFileFindの仕様としては書かれてないかも。
FindFirstFileの説明にはルートディレクトリの属性を取得するにはGetFileAttributesを使えと書いてある。
ところでみんなフルコントロールの拒否とかってどうやって判断してる?
451 :
デフォルトの名無しさん:2007/02/08(木) 17:40:42
メニューをoffice風にするため調べたら
”ツールボックスからメニューをペタペタ”をすればいいらしい
しかし、MFCを使わなければならないことが判明
win32アプリにツールボックスからメニューをペタペタはできない
Wwindowsフォームで作るとできる
しかしForm.h、Form.resxとか変なファイルが中身見ると分けわかんなくなってるしWinmainがないぞ
C++とMFCは別物なのか!!
2005express
>>451 それは.NET frameworkじゃね
知らないうちにC++/CLIを使っている。いかんこれはゲイツの罠だ。
初めて任されたツールが遂に完成シマスタ^^
予定では後一週間あるので連休明けはブラックボックステストと
ロゴの作成にかかりたいのですが、VC6 MFCのリソースエディータって
しょぼいですね(^^;フリーでお勧めのリソース編集ソフト知ってたら
教えてくださいオナガイシマス
>>454 ロゴの作成にリソースエディタってお前馬鹿じゃないのか?
いるんだよ、ソースコードもロゴ画像もIDEで編集しないと気がすまない馬鹿って奴が。
ロゴの作成をMFCスレで質問するのは脳に異常があるんだろうな
進行が進まないうちに早めに治療を受けたほうがいいよ
>>457 教えるも何も、「画像を作る」って聞いたら藻前様は何を使うと仰るのですか?
#ふつー、画像編集ソフトを使うと思うのだが。
別にいいんじゃね、リソースエディタでも。センスがあれば。
>リソースエディタでロゴ作成業務 8H
やべぇw脳勃起してきたw
印刷プレビューをダイアログベースのプログラム(VC6.0)で実現するにはどうすればよいのでしょうか?
検索するとSDI/MDIのプログラムばかりで途方に暮れています。
MFCのソース見れ
りえ子、結婚してくれ
466 :
465:2007/02/19(月) 14:17:23
自己解決しました
おめでとう
いや、うまくいったら、自己解決とは言わない気が…。
自己解決 = 脳内解決
だな
誰か、知っている方、教えてもらえませんか。
リストの表示で、拡張スタイルにLVS_EX_HEADERDRAGDROPを指定し
仮想リストビューでアイテムの表示を行っております。
そして、カラムのドラッグ&ドロップで順番を入れ替える事が出来るのですが、
順番を入れ替えると、カラムのアイテム表示が、新しい表示と古い表示の両方が
出てしまいます。なぜでしょう?
------------------------
Colum1 | Colum2 | Colum3
------------------------
1 | 2 | 3
1 | 2 | 3
カラムの順番を入れ替えて、幅を広げると
古い表示が出てくる。
------------------------
Colum1 | Colum3 | Colum2
------------------------
1 | 3 2 | 2
1 | 3 2 | 2
VS.2005でMFCをスタティックでリンクに設定しております。
123→132は判った。
123→312ではどうなる?
472 :
470:2007/02/22(木) 15:20:09
>>471 312ではColum3の表示が"3 1 2"となりました。
473 :
470:2007/02/22(木) 15:21:42
>>471 あ、言葉が足りませんでした。
Colum3のアイテム表示が"3 1 2"です。
なんとなく、メモリ管理が失敗している悪寒。
475 :
470:2007/02/22(木) 16:19:39
原因が判りました。
スタイルにLVS_OWNERDRAWFIXEDが指定されていました。
MFCのROWLIST サンプルを元に、変更を加えていったのですが、
CListViewExで、LVS_OWNERDRAWFIXEDが指定されておりました。
レスをしてくれた方がには、お礼申し上げます。
476 :
デフォルトの名無しさん:2007/02/22(木) 20:26:53
MFCを使って、できるだけ簡単にHTMLメールを
ダイアログベースで表示したいのですが、
どんな方法があるでしょうか?
もうちょっと仕様検討してから来てください
478 :
デフォルトの名無しさん:2007/02/22(木) 22:17:26
>>477 できるだけ簡単にできる方法に合わせて仕様を決めようかと思って。
メールを表示するソフトなんて聞いたことがない
HTMLを表示(レンダリング)するコントロールを探せ
よくあるペイントソフトのような複数の画像表示ウィンドウに
共通のパレットダイアログを持つようなプログラムを作ろうと考えています。
MDIで生成すると、例えばファイル→開くを選択すると
ドキュメント以外にビューも生成されて、ビューが持っているパレットダイアログ(モードレス)
までが複数生成されてしまいますが、これを阻止するにはどのようにすればよいのでしょうか?
パレットをビューに持たせてるのが間違い。
>>482 確かにおっしゃるとおりです。
ウィンドウを切り替えたときにパレットの内容をアクティブなウィンドウの
情報に変えたいので、そのあたりの情報などを管理できる部分にまとめようと思うのですが
この場合、パレットを持たせるのはMainFrameでしょうか?
すいません教えてください。
VC++6.0です。
ツールバーのボタンに対してプロパティからプロンプトという項目を設定すると実行時にボタンの説明文が出せますよね。
あれをダイアログのボタンやエディットボックスにも出したいのですがどうすればいいでしょうか。
つ CToolTipCtrl
486 :
484:2007/02/23(金) 22:23:14
即レスありがとうございます。
調べてみます。
488 :
デフォルトの名無しさん:2007/02/26(月) 18:13:00
自分自身のProductVersion の読み出し方法は?
色々探したのですが、どうも自分自身のProductVersionを
読み出す方法が見つかりません。
自身の実行ファイルのフルパスを探し出し.... という方法は
見つけましたが、何だかなぁという感じで。
CString::LoadString のような感じで読み出す方法はないのでしょうか?
ストリングテーブルになかったか?
なんだ質問者が答えてるじゃないか
キチガイの独り言はやめほしいな
491 :
デフォルトの名無しさん:2007/02/26(月) 19:18:29
>>489 > ストリングテーブルになかったか?
ストリングテーブルには登録されてないよ。
492 :
デフォルトの名無しさん:2007/02/26(月) 19:19:07
>>490 > なんだ質問者が答えてるじゃないか
> キチガイの独り言はやめほしいな
CString::LoadString で読み出せるのか?
IDは、何を設定するの?
何だかなぁ
わざわざ教えてやっても何だかなぁと言われたら馬鹿だし
FindResourceから始めれば出来なくは無いな。
497 :
483:2007/02/26(月) 21:52:54
>>487 CDialogBarを利用してみました。ソースは以下の通りです。
(MainFrm.cpp)
if (!m_wndDlgBar.Create(this, IDD_DIALOG_HOGE,
CBRS_ALIGN_TOP, AFX_IDW_DIALOGBAR)){
TRACE0("ダイアログバーの作成に失敗しました。\n");
return -1;
}
しかし、ダイアログを移動するとダイアログのあった場所が再描画されません。
CBRS_ALIGN_TOPを指定しているせいでしょうか?
また、サイズがリソースで作成したものと変わっていたり(横いっぱいに広がっている。ALIGN_TOPの影響?)
しています。
ttp://www.alpha-net.ne.jp/users2/uk413/vc/VCT_DlgBar.html このようなドッキングされた状態の作成方法はいろいろ紹介されているのを確認しましたが、
通常のモーダレスダイアログのような振る舞いをさせる方法が分かりません。(任意の座標に表示させるとか)
どういった方法をそればいいのでしょうか?
ダイアログバーのサンプルならMSDNについてる
ウインドウの動かしかたも知らんのか
こうですか?
うまくいきました!!
501 :
MDI今日始めます:2007/02/27(火) 18:18:27
すみません。ど素人ですm(__)m
MDIのプログラム今日始めました。ウィザードでMDIのプロジェクトを作成後、
クラスビューでOnDraw(CDC* pDC)という関数を発見し、これで描画できると
思いましたが、子ウィンドウを新規作成するたびに同じ描画を繰り返すだけ。
子ウィンドウ毎に違う描画をしたいのですが、どうしたらいいんでしょう?
メインのソースたどろうにも、CWinApp::OnFileNewはライブラリになっていて
ソースの実体が無くどうしていいのかわかりません(ToT
その違う描画、は何を持って違うことになるのか
それによってOnDrawでの動作を変えりゃいいだろ
同じ描画になるのは同じ描画しかしないコードを書いているから。
CView::OnDrawでCDocumentのインスタンスを識別してそれぞれで描画するようにしれ。
504 :
デフォルトの名無しさん:2007/02/28(水) 01:39:33
ListViewの初期化方法、削除方法を教えてください。
教えてください。
VC++6.0でMDIです。
MDIの子ウィンドウとしてCFormViewを継承したクラスが2つあります。
このクラスを仮にA,Bとします。
Aのウィンドウのボタンが押されたときにBのウィンドウの
エディットボックスの内容を更新したいのですがどうすればよいでしょうか。
MDIGetActiveとGetNextWindowをつかってウィンドウをたどっていき
if(pWnd->IsKindOf(RUNTIME_CLASS(B)))で判定すればBのウィンドウの
ポインタが取れると思ったのですが、このif文がなぜか真になりません。
何がまずいのでしょうか。
>>506 MFCの問題っちゅーかプログラミング能力の問題じゃねぇの?それ。
まあ、問題の切り分けができないってのもわからないでもないが・・・
そういう機能はAとB2つに影響を与えることができるクラスに付けなきゃ駄目だよ。
AやBはその機能を呼ぶだけ。
>>203-205の問題と似てネーか?
>>506 そもそも基本ができていない
やろうとしていることの前に、基本から勉強しなおせ
基本的な質問なのです、よろしくお願いします。
VS2005でMFCアプリケーション(ダイアログベース)を作ったのですが。
新規にダイアログベースを作成してそのまま何も加工せずにセットアップ
ウィザードを使ってsetup.exeを作って他のPCでインストールしようとしたら
.NET framwork2.0をするように指示する画面がでました。
これは、VS2005で開発したものはframework2.0が必要?それとも
インストーラーがframework2.0が必要?なんですか?
frameworkが必要ないとおもってMFCにしたのですが、framework不要に
する設定ありますか?よろしくお願いします。
訂正です。
x .NET framwork2.0をするように指示する画面がでました。
○ .NET framwork2.0をインストールするように指示する画面がでました。
CHtmlDialog使ってる?
それはじめてききましたので意識的にはつかってないかと
んー、普通に作ればいらんけどな。
とりあえず、新規プロジェクトで何もしないでウィザードだけでできあがったダイアログで
試したらどうなる?
セットアップがあやしいな
515 :
デフォルトの名無しさん:2007/03/01(木) 21:06:55
『標準講座MFC6.0―Visual C++による効率的なWindowsプログラミング』
という本を以前読んで、大変勉強になったのを覚えています。
無くしたので、他の本と一緒に買おうかと思うのですが、どうせならVC++.net
関連の本がいいと思っています。サンプルも欲しいです。
何かお勧めはありますでしょうか?
516 :
デフォルトの名無しさん:2007/03/01(木) 22:50:39
VC++2003 のリソースエディタで作成したポップアップメニューについて質問です
やりたいことは簡単でポップアップメニューのサブメニュー(横に開いたやつ)を
状況(その時の変数値など)に応じてグレーアウト(Enable が FALSE の状態)したいだけです
OnUpdateXX(メニュー名) で pCmdUI->Enable(FALSE) することで
普通のポップアップメニューをグレーアウトすることはできました
しかし、ポップアップメニューのサブメニューに同じようなことをやってもうまくいくません
サブメニューを選択して初めて OnUpdateXX と OnXX が走っているようです
どうにかして同じようにサブメニューをグレーアウトさせることはできないでしょうか?
スレ違い。書籍スレへどうぞ。
518 :
デフォルトの名無しさん:2007/03/01(木) 23:19:43
そんなことおっしゃらずに教えて頂けないでしょうか?
>518
ここはMFCスレ。.netやりたいならそういうスレで聞けば?MFCなら標準講座でいいだろうし。
なんで.NETだと思うんだ?
>>516 OnUpdate〜に頼らず、自分でグレーアウトさせる。
522 :
デフォルトの名無しさん:2007/03/02(金) 14:04:34
VC++6.0使っています。
MFCでAPIである
SetWindowText(hWnd ,"(@_@)");
を使いたいのですが、MFC上でこの関数を実行すると
ウィンドウハンドルの引数が省略されてしまい、コンパイルできません。
MFC上で、任意にウィンドウハンドルを指定してSetWindowText関数を
使う方法はありますでしょうか?
スコープ演算子
525 :
デフォルトの名無しさん:2007/03/02(金) 14:32:43
>>523 >>524 ありがとうございます。
勉強しながらなので、
お教えいただいたヒントを元に
答えを探ってみたいと思います。
526 :
デフォルトの名無しさん:2007/03/02(金) 14:39:48
>>523 >>524 どこに対してスコープを設定すればよいのか
見当もつかなかったので、試しに関数の頭にスコープ演算子だけつけてみたら
なぜかうまくいきました。
>>522 >MFCでAPIである
WindowsのAPIなのかMFCクラスのメンバー関数なのかはっきりしる。
すでに解決済
CListBoxなどのコントロールでの文字列の扱いは
TCHAR(LPCTSTRとか)になってますが
実行時にマルチバイトでCListBoxを使うか
UNICODEで使うかを選択することはできないものなんですか?
マクロはコンパイル時に展開されるから
マクロ使わないで使い分ければいい
531 :
529:2007/03/04(日) 15:45:56
>>530 すいません。その辺知識不足なんですが、
Win32APIで例えるとANSI版とUNICODE版があって、
それを使い分けれるってことですか?
いいえ、MBCS版とUNICODE版です。
知識はいらない
MFCのソース見るだけ
ライブラリが違うな
535 :
529:2007/03/05(月) 21:33:00
ソース見たところ、
MBCS版とUNICODE版を同時に使える仕様にはなってない感じですが…。
よくわからんです。
とりあえず素直に別々にコンパイルして
本体を98系とNT系に分けて用意する方が楽っぽいですね。
実行時に切り替える必要はない
>>509 の人です。
VS2005で作ったMFCプログラムを同様にVS2005のセットアップウィザードを作ったsetup.exe
で実行してFramework2.0をインストすれというメッセージが出たものです。
結論からいうと、このsetup.exeを使わないで~~~.exeだけをコピーして動作させたら動きました。
MFCはスタティックリンクしました。ということで容疑者はセットアップウィザードらしいことが
判明。まあ使わなければいいという短絡的な結論になりました。
あほか
容疑者はおまえだよ
セットアッププロジェクトをきちんと作れば何の問題もない
539 :
デフォルトの名無しさん:2007/03/09(金) 00:20:07
MFC にtemplateを組み合わせたフレームワーックってあります?
例えばCCOMBOBOXにSetItemDataPtr使ってある型を足してく場合とかに
をやってくれるようなtemplate関数とかが用意してあるやつとか
MFCのコントロールとtemplateを組み合わせるのって普通はしないものなんでしょうか?
上記のある型を設定した後にプログラムからSetItemDataptrで設定した型のある値を指定したら
SetCurSel あたりで指定した項目に対応するやつを選択状態にしてくれるようなやつとか
540 :
デフォルトの名無しさん:2007/03/09(金) 00:25:10
ダイアログ以外だとポトぺタってできないんですか?
ポトペタしたいなら.NETの方がいいよ
VB6の間違いだろ
FormViewは?
VC++のエディタのようなウィンドウを作ろうとしています。
(テキスト表示の右側に●とか矢印が出るウィンドウ)
それで、自分なり考えたのですが、
1. CEditView からビューを作成。
2. OnCreateで左側のマージンを空ける。
3. OnDrawとかで●とか矢印を書く。
でも、そもそもOnDrawが呼ばれません。
他のアプローチがあれば教えていただけないでしょうか?
ちなみに当方WindowsのGUIプログラミングはド素人です。
CEditViewの中はCviewにeditコントロールを貼り付けてあるだけで
位置調整に関係するのはCEditView::CalcWindowRectあたりか
>>544 CEditView なんぞ使ったらだめ。
CView に全部自前で実装しろ。
どのみち、ど素人にできるテーマではない。
その前にいろいろ勉強してから出直して来い。
548 :
544:2007/03/11(日) 00:45:00
>>545-547 レスありがとうございます。
>>545 こんなメンバがあったのですね。しらなんだ orz
勉強になります。
>>546 ごめんなさい。今勉強中で行き詰まったので、ちょっと甘えてみました。
>>547 てか、行番号のところに●とか矢印描画したらやりたいことそのままではないですか!!
まだ、ちゃんとソース見られてませんが、これからじっくり追って行きたいと思います。
ありがとうございます。
良スレ発見!!
549 :
548:2007/03/17(土) 14:50:17
__,,..、、- - - .、、...,,___
,,、‐''"~ ̄  ̄``''‐、、
/ \
/ ヽ
/ ヽ
/ / ~~` '' ‐- 、、 ,,__ __ ,,..、、 -‐ '' "~~\ ヽ
| / __  ̄ __ ヽ |
.| { ´ ‐- ....__ __... -‐ ` } .|
.| 〉,,・^'' - .,, ~ i ~ __,,.- ^`・、.〈 |
./ ̄| /,/~ヽ、 `'' ‐--‐ ,.| 、‐-‐'' "~ _ノ~\,ヽ | ̄ヽ
| (` | / ヽ,,_____`‐-、_、..,,___ノ八ヽ___,,.._-‐_'"´___,, ノ ヽ .|'´) |
| }.| ./' \二二・二../ ヽ / ヽ、二・二二/ 'ヽ | { |
.| //| .| / | |. \ | |ヽヽ|
.| .| | .| / | |. \ | | | .|
|ヽ.| | / .| |. ヽ .| .|./ .|
| .| | / | | ヽ | | / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヽ .| | / .| | ヽ | | / | 用件を
.ヽ.| | / '二〈___〉二` ヽ | |./ <
| | `-;-′ | | | 聞こうか…
iヽ|. ,,... -‐"`‐"`'‐- 、、 |/i \_________
| ヽ /...---‐‐‐‐‐----.ヽ / .|
| ヽ. ,, -‐ ''"~ ~"'' ‐- 、 / |
.| ヽ ! ./ .|
,,| ヽ. | ./ |、
|\. ヽ / /.|
.|. \. ヽ、____ ___/ / .|
' `  ̄ ̄ ´ '
CDialogBarのダイアログで
List Controlを利用しているのですが
カラムを初期化するタイミングはどれがよろしいのでしょうか?
CDialogの場合はOnInitDialogがあったんですが
CDialogBarには無いみたいで
551 :
デフォルトの名無しさん:2007/03/18(日) 10:07:39
>>550 Create()の中で、CDialogBar::Create()呼び出し後にやってます
CPropertySheetEx/CPropertyPageEx(PSH_WIZARD97)を利用して、
各ページの上部ヘッダ部に画像付きのウィザードを作成しています。
Windows Vista上で、この方法で作成したウィザードを実行すると、
なぜか各ページの上部の画像が表示されなくなってしまいます。
(Windows XPでは問題なく表示されます)
これを回避する方法はありますでしょうか?
Vistaを見捨てる
Vistaの互換性の問題なのか、
>>552のプログラムがトンチキなのか
555 :
デフォルトの名無しさん:2007/03/21(水) 19:50:40
先生、MFCでアプリ作ってたらエロイ人が
「.NETのメニューみたいにかっこよくしろ」
とか言ってきました。
そもそも2ちゃんねるで聞くなんてww
最新スレ50しか読んでないが、質問主は殆ど玉砕だな
昔の2ちゃんねるは玉石混在で光るものもあったが、今は石しかない
プログラム技術@2ch掲示板なんて止めて、
質問主を煽る技術@2ch掲示板として、スレッドも一つか二つにまとめたらどうよ
本気で困ってたら2chなんかで聞かないって
特にム板はクズの集まりだしな
【審議中】
∧,,∧ ∧,,∧
∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U ( ´・) (・` ) と ノ
u-u (l ) ( ノu-u
`u-u'. `u-u'
手前の二人に耳が無いのが気になる
>>556-557 トンチキな質問をして煽られたのか。
>>559 「手前」と思わせといて、実は下。
つまり、上に乗っかってる奴で隠れている。
>>556 _,,:-ー''" ̄ ̄ ̄ `ヽ、
,r'" `ヽ.
__,,::r'7" ::. ヽ_
゙l | :: ゙) 7
| ヽ`l :: /ノ )
.| ヾミ,l _;;-==ェ;、 ,,,,,,,,,,,,,,,_ ヒ-彡|
〉"l,_l "-ー:ェェヮ;::) f';;_-ェェ-ニ ゙レr-{ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ヽ"::::''  ̄´.::;i, i `'' ̄ r';' } | 久々にトンチキ
. ゙N l ::. ....:;イ;:' l 、 ,l,フ ノ | 玉石混在で光るものもあった
. |_i"ヽ;:...:::/ ゙'''=-='''´`ヽ. /i l" < のが、昔の2chなんだよな
.| ::゙l ::´~===' '===''` ,il" .|'". | 今は石しかないから困る
.{ ::| 、 :: `::=====::" , il | \________
/ト、 :|. ゙l;: ,i' ,l' ノト、
/ .| \ゝ、゙l;: ,,/;;,ノ;r'" :| \
'" | `''-、`'ー--─'";;-'''" ,| \_
>>559 pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
コナミの麻雀ゲームの名前なんだっけ
真・麻雀だろ、スーファミの
mobile fan club の略
携帯で月額料金を支払って登録すると会員になるファンクラブのこと
会員になると
チケットの先行予約やデジタル会報の閲覧
待受け画像や着うた、着メロ、ムービー等のサービスを利用できる。
Mass Flow Controlerの略称。
気体の流量制御装置のこと。
真空装置などに微量、あるいは一定流量の気体を導入する時などに使用される。
569 :
sage:2007/03/29(木) 01:36:44 BE:830995788-2BP(0)
質問です。
XP, Vista 上で動くプログラムを書いているのですが、
ダイアログやその他のUI系フォントとして、XPだと
MS Gothic 系 に、Vista だと主に メイリオ にしたいと考えて
います。
名前直指定とかは行わず、テーマとかシステムに
即したコードにしたいのですが、そもそもMFCのダイアログに
使われるフォントを、うまく切り替える方法すら分かりません。
そもそも、OSのフォントの扱いからしてよく分かってないのですが、
ここから調べていきたいと考えています。
なにかいい解決策がないでしょうか?
MFCのダイアログの文字って
リソースで指定するんじゃないんの?
571 :
569:2007/03/29(木) 01:53:07 BE:363560674-2BP(0)
>>570 その通りで、リソースで指定しています。ひとまず、ダイアログの
プロパティにて、"Use System Font" を true にしています。
そうすると、フォント名が"MS Shell Dlg" になります。
あと、開発環境を忘れていましたので、書いておきます。
VS2005 pro sp1
xp sp2, vista
ダイアログのフォントを変えたい場合は CDialog::CreateIndirect を使う。
それかダイアログを表示した後でコントロールごとにフォントを変更する。
親ダイアログの初期化処理が行われていることを知らせるために、
ポップアップダイアログを作って、プログレスバーで処理中が
わかるようにしようとしています。
プログレスバーは処理が行われていることが分かればよく、
タイマイベントに応じて単純にカウントアップするだけです。
具体的な手順として
@親ダイアログのOnInitDialogで、プログレスバーをもつ子ダイアログを作成
A子ダイアログのタイマイベントを起動(SetTimer)
B親ダイアログの初期化処理
(この間に、子ダイアログのWM_TIMERイベントでプログレスバーをカウントアップ)
C子ダイアログのタイマイベントを終了(KillTimer)
D親ダイアログのOnInitDialog終了
としています。
しかし意図した通りには動作しません。
原因として、Aで起動したタイマイベントが、Dのあとに動作を開始しているためです。
(Cの処理をコメントアウトしたところ、親ダイアログの表示後に、
OnTimerイベントが呼び出されていることを確認しました。)
そこで質問なのですが、
(i) Aで起動したタイマが、実際はDのあとまで起動されない理由と、
(ii) Aで起動したタイマを、Aのタイミングで動作させる方法
です。わかる方いらっしゃったらお願いします。
>574
ありがd。
ただ、子ダイアログを別スレッドにしても、
メッセージポンプ自体が動いてないのだとすると、
子ダイアログの描画がイベントはちゃんとおこなわれるのん?
(゚д゚)読まぬ!
読みたくないんだい
>>573 (ii)どうしてもタイマ使いたいってんなら
>>574の通り
親のOnInitDialog()の進行状況を表示したいだけなら
親側からユーザー定義メッセージをSendMessage()してやればよい
これ一番単純
このスレ死んでんのかと思ってたよ
>>573が態々ネタ創作したようにも見えるが
タイマを使うのが、コード書く分には一番楽だなあ、ぐらいの考えです。
スレッド化はしてみたけど、どうにもうまく動かないところ。
別のところでこけてるのだろけど、いまのとこ原因不明です。
進行を知らせるダイアログをシングルトンで実装して、
MFCクラス、一般C++クラスを問わず、時間のかかる処理のときは、
動作中であることを気軽に示せるようにして、↓みたいな使い方を考えてます。
LoadingDialog->inst()->starg()
//時間のかかる処理
LoadingDialog->inst()->stop()
普通に考えたら時間のかかる処理を別スレッドにする。
プログレスバーはステータスバーに表示
>>580 逆に考えるんだ。
GUIスレッドはあくまでもGUIに徹し、時間の掛かる処理はワーカスレッドで行なう。
それがイベントドリブンということだ。
質問は普通のプログラムの作りかたじゃなくて楽したいということか
だったらどうでもいいや
あと、よく考えたらWinRarなんかはダイアログにプログレスバーだな
あれはダイアログ側で時間のかかる処理か
>>571 XP用とヴィスタ用の両方のダイアログを作る
OS種別でどっちかを使う
>>556です
>>573 整理した方がいいよ
ワーカースレッドのタイミングで描画させようとすると君のようなパラドックスに嵌ります
この場合ワンクッション置いて、子ダイアログの遷移を親ダイアログがGETできるようにすれば
いいと思う、(インラインでGET関数を記述すればいい、SET関数も必要になると思う)
あくまでも主体は親で子は遷移を知らせるだけ(描画できるタイミングを通知)
一見普通に処理しているように見えてもワーカースレッドのタイミングで描画を行う
プログラムは間違いなく破綻します。
>>586 >>585だが
なんだよ、マジレスしてるのにww
いいよ585の反対で実装してごらん面白いことになるよww
それから
>>573は簡単だからタイマー割り込み使うって書いてたけど
MFCでタイマーの使い方ってネットでたまに見かけるけど
まともな使い方してない場合が多いよMSDNのコードも漏れ的には不満なんだが
>>586です
「
>>556です」とか突然言い出すからネタで返しただけ。気にするな。
で、まともじゃないタイマーの使い方の説明キボンヌ。何か気になる。
589 :
デフォルトの名無しさん:2007/04/11(水) 13:37:48
各種コントロールを乗せた、WS_CHILD スタイルのダイアログ リソースを用意して、
CControlBar 派生クラスの OnCreate で CDialog::Create を呼び出して
コントロールバーの中にダイアログを入れています。
このとき、ダイアログ上のコントロールのメッセージは、
どうやって受け取ったらよいでしょうか?
int CFooControlBar::OnCreate(.....)
{
......
// コントロールを乗せたダイアログをリソースから読み取る
m_hogeDlg.Create(IDD_HOGE_DIALOG, this);
m_hogeDlg.ShowWindow(SW_SHOW);
}
m_hogeDlg のメッセージを受け取るには?
590 :
586:2007/04/11(水) 19:42:13
>>588 マジレスはもうおしまい後は自分で考えてねww
それではそっけないのでヒントは 「一意」
サービスしすぎww以上
>
>>589 C++から勉強しなおした方がいいYOというか
585で説明してるしww
皆さん結果を求めたいがために焦りすぎ、実装する以上もっと気の細かい
シーケンスが必要ですww
質問「何々の関数に、赫々しかじかの引数を与えましたが結果がでません」
答え「準備不足です」
591 :
556:2007/04/11(水) 19:44:18
592 :
デフォルトの名無しさん:2007/04/12(木) 09:38:16
CListCtrlについて質問です。
ある関数で、CStringの文字列を引数として渡し、リスト内に同じ項目が
存在しない場合、追加処理を行っています。
LVFINDINFO listInfo;
listInfo.flags = LVFI_STRING;
listInfo.psz = inStr;
// Itemを検索
int findItem = listCtrl.FindItem(&listInfo);
このとき、FindItemを使って検索するときに大文字と小文字を別物として検索することはできますか?
今のままだと、AAAの後にaaaを追加しようとしたときに既に追加されていると判断され、
リストにはAAAしか存在しない状態になってしまいます。
>>592 FindItemで見つけた後、一致しているかどうか自分でチェックしたら?
つ仮想リストビュー
596 :
592:2007/04/13(金) 14:43:38
ありがとうございました。FindItemで見つけた後strcmpで再度比較することで対応しました。
ただ、3つ以上重複した場合(aaaa,AAAA,AAAA, aaAAなど)、の場合、
AAAAのが2つ重複して追加される問題があるので
仮想リストビューにする方法も含めて、何か対応を考えて見ます
597 :
デフォルトの名無しさん:2007/04/13(金) 23:24:35
見つかった文字列+1を指すポインタアドレスを引数として再起呼び出しをすれば如何?
メッセージを投げたいオブジェクトを生成するために
安易に画面も持たないのに CDialog を継承したクラスをCreate してたり
するんだけど、(要は他のオブジェクトからメッセージを投げるのに、
有効なm_hWndが欲しいだけ)
CDialog じゃなくて CWnd を継承して有効な m_hWnd をもつ
オブジェクトを生成する手段ってあります?
CWndを継承すればいいじゃない。何が問題なんだ?
600 :
598:2007/04/14(土) 16:07:09
>>599 CWnd を継承したオブジェクトを Create しても
h_hWnd は 0x0000 なので CDialog を Create してます
なにか、画面に関係しないで CWnd を Create して 有効な
h_hWnd を得られれば文句無いんですが
うちでは問題なく作成できるから、あなたのコードに問題がある。
602 :
デフォルトの名無しさん:2007/04/14(土) 18:04:49
コントロールバー (CControlBar) にツールバー (CToolBar) を乗せることはできないでしょうか?
>>598 ::CreateWindowExでメッセージonlyウィンドウ作って、
CWnd::SubclassWindow使えばいいんじゃね?
仮想リストビューってSetItemCountEx()で設定できるのは
1億件までですよね?ドキュメントにはDWORDの最大数まで
サポートしているようなことが書いてありますが、
実際にそこまで設定することは出来ますか?
SetItemCountExを辿っていくとSendMessageで投げていますが、
1億を越える数字を設定するとSendMessageがFALSEを返すので
APIのバグのような気もしますけど。
>>604 >ドキュメントにはDWORDの最大数までサポートしているようなことが書いてありますが
実際はメモリ量とか空間の限界とかあるから無理。
SetItemCountEx の仕様見ると int になってるけど
そりゃまあ実際に限界があるのは仕方ないけど、
なんで「一億」にしてあるのかがわからん。
100000001件にすると表示されないのな。ワロス。
MSDNに書いとけよ。これじゃアメリカ国民全員の名前を
リストコントロールで表示することは出来ないじゃん。
マイクロソフトのくせに自国民の数すらサポートできない
コントロールを作るなんて非難の対象だな
大丈夫、マイクロソフトなんて国はないから自国民は一人もいないので。
610 :
598:2007/04/15(日) 08:16:10
>>601>>603 ありがとうございます
今は休み中にてVSEしかないのでMFCが無いので試せないので
明日にでも試そうと思います
ちなみに画面を持たないCWndオブジェクトをCreate()する場合、
どんな引数が望ましいのでしょうか?
非表示ウインドウでもhWndはあるだろ
なかったらShowWindowで表示することもできない
ShowWindow
指定されたウィンドウの表示状態を設定します。
BOOL ShowWindow(
HWND hWnd, // handle to window
int nCmdShow // show state of window
);
パラメータ
hWnd
ウィンドウのハンドルを指定します。
nCmdShow
ウィンドウの表示状態を指定します。
質問です。
MFCで作成したソフトを公開したいのですが、VS.net2003の入っていないパソコンで
自分の作ったソフトを実行してみると、
mfc71d.dll msvcp71d.dll msvcr71d.dll
が必要です、とでてきます。
これらのdllは勝手に配布しても大丈夫なのでしょうか?
いいえ、デバッグ版を勝手に配布してはいけません。
>>613 mfc71.dll などdがついていないものなら配布しても大丈夫なのでしょうか?
>>614 MSに訊け。つーか付属ドキュメントくらい読め。
>615
便乗で質問なんだが、その手の質問は
MSDN購読してなくても答えてもらえるの?
そういう重要なことを正規ユーザーが知らないはずがない。
無料のexpressユーザー?と思ったけど
MFCなら製品版使ってるんだろうし、どうやって手に入れたんだろう?
618 :
デフォルトの名無しさん:2007/04/16(月) 17:40:12
すいません。くぐっても答えが見つからないので教えてください。
MFC AppWizerdで作ったDLLを
Win32 Application(SDK)から呼び出せますでしょうか?
DLLの作りによる
620 :
デフォルトの名無しさん:2007/04/21(土) 20:43:01
…そのまんまやなw
>>617 > 正規ユーザーが知らないはずがない
いや、キッチリとは知らんよ俺は
VC4,VC6,VS8の正規ユーザーなんだけどさw
そらあほだ。
電車乗ったことあるけどキップの買い方知らないとかそういうレベル
地方の人は知らないかもしれないけれど、今や切符を買わなくても電車に乗れるからねぇ。
喩えの誤謬に突っ込む莫迦ありき。
いや、寧ろ誤謬と思ってないからこそ。
実際、知らなくても利用できると言いたかった。
他のソフトならいざ知らず、開発ツールでそんなやつがいるとは驚きだw
_bstr_t strData[3];
strData[0] = "0000";
strData[1] = "1111";
strData[2] = "2222";
COleSafeArray sa;
sa.CreateOneDim(VT_BSTR, 3, strData);
_variant_t va = sa;
とやってみると、_variant_tのコンストラクタで例外が出てしまいます。
sa.CreateOneDim(VT_BSTR, 3, strData);
sa.CreateOneDim(VT_BSTR, 3);
とすると通過するので、CreateOneDim()にstrDataを渡す方法が
間違ってるのかなと思うんですけど、
_bstr_t配列はどうやって渡すものなんでしょうか。
それとも、CreateOneDim()には_bstr_t配列は渡せない?
> sa.CreateOneDim(VT_BSTR, 3, strData);
> sa.CreateOneDim(VT_BSTR, 3);
> とすると通過するので
sa.CreateOneDim(VT_BSTR, 3, strData);
の部分を
sa.CreateOneDim(VT_BSTR, 3);
とすると通過するので
のミスです。失礼しました。
よろしくお願いいたします。
_bstr_tの配列≠BSTRの配列
>>630 ということは、_bstr_t配列のままだとCreateOneDim()に直接は渡せないということですよね。
SAFEARRAYとかはまったくの未知で、このへんの使いかたって、
ネット上を探してもなかなか見つからないのですが、
_bstr_t配列やCString配列からCreateOneDim()に渡すBSTR配列を作る方法って、ご存知無いでしょうか。
ソース見るかメモリダンプして内部構造調べてみれば?
切符買わないってどうやるの?
オレはもう何年も切符買ってないなあ
Suicaとパスネットでやってきたが、最近はパスネットもいらなくなったし
オートチャージで入金もない。
車はETCで料金所はとまらないし、旅行先でレンタカー
借りるときもETC車載かどうかを気にしてる
飛行機もfelica携帯使ってチェックインもカウンターに行かないし
並ぶことがほとんどなくなった
636 :
デフォルトの名無しさん:2007/04/27(金) 23:24:51
で、これらは相談か?
いいえ相談ではありません
日本語の練習です
VC6 MFCです
プロジェクトの設定の、デバッグ、C/C++、リンクにプロジェクトオプションがあるのだが
コマンドラインからビルドする場合この引数をどの様に渡したらいいの?
CL をコマンドラインから起動するときは、次の構文でオプションとファイル名を指定します。
CL [option...] file... [option | file]... [lib...] [@command-file] [/link link-opt...]
msdev MyProject.dsp /MAKE "MyProject - Win32 Debug" /REBUILD
とかは?
642 :
デフォルトの名無しさん:2007/04/30(月) 22:58:55
おそらくかなり初歩的な質問なのですが、ダイアログから別ダイアログを開くためにはどうすればよいのでしょうか?
VBのShowのようなコマンドがあるのかと思ったのですが、よくわかりませんでした。
よろしくお願いします。
CAboutDlgを参考に
>>642 インスタンス生成してから
a) Create() して ShowWindow()
b) DoModal()
のどちらでも。つか、MSDNくらい嫁。
VC6 MFCです
メニュー→ツール→オプション→ディレクトリ配下の
インクルードファイル、ライブラリファイルは何処に保存されているのしょうか?
C:\program Files\Microsoft Visual Studio配下はgrepしてみましたがありませんでした
レジストリに記録されているのでしょうか?
知ってる人いたら教えてホスイ
パスの順番でファイルを検索する。
>>645 ちょっと探してみたがレジストリの
HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Build System\Components\Platforms\Win32 (x86)\Directories
に入ってるみたいだよ
>>647 >>645ですが
神が降臨しました、ありがとう実は現在ではVC6 MFCのUIが非常に悪いので
秀丸のマクロと融合させてできる限りの操作を秀丸中心にお行おうと思っていたところです
そういう訳で探していました、本当にありがとね
処でMFCで作成したプログラムはコマンドラインからビルド、コンパイルまで出来るのでしょうか?
(rcファイルはVCで作ってあると仮定してです)?
そりゃあできるっしょ。
プロジェクトのプロパティで、コンパイルとリンクのコマンドライン見られなかったっけ
それ参考にしたらいいと思う。
>>649 サンクスです、取り合えず今レジのバックアップを保存したところです
これからゴリゴリとマクロを書いていきますww
全然見当はずれの方向に進んでるみたいだけど
相当頭堅そうだから本人のやりたいようにやらせて置くのが一番だな
わざわざレジストリの場所教えてやったやつはかわいそう
652 :
デフォルトの名無しさん:2007/05/01(火) 21:19:12
Platform SDKについてるMFCのソースをビルドすれば
OSについてるものとまったく同じDLLが出来上がるんですか?
おい、Platform SDKはもう無くなったって、誰か教えてやれ。
VC2005 MFCです。
複数のモードレスダイアログを入れ子のような感じで作成したいのですが
孫のウィンドウを作成したところで正常に動作しなくなってしまいました。
実際のコードは下のように書いています。
//ビューでマウスがクリックされたら子ウィンドウとしてモードレスダイアログを生成
void CtestView::OnLButtonDown(UINT nFlags, CPoint point)
{
CTestDlg *testdlg;
testdlg = new CTestDlg();
testdlg->Create(CTestDlg::IDD);
testdlg->SetParent(this);
testdlg->ShowWindow(SW_SHOW);
CView::OnLButtonDown(nFlags, point);
}
//ビューで作成した子ウィンドウのボタンが押されたら、孫のモードレスダイアログを生成
void CTestDlg::OnBnClickedButton1()
{
CTestDlgB *testdlg;
testdlg = new CTestDlgB();
testdlg->Create(CTestDlgB::IDD);
testdlg->SetParent(GetParent());
testdlg->ShowWindow(SW_SHOW);
}
何か根本的な勘違いをしてしまっているのでしょうか?
初歩的な質問ですいません、よろしくお願いします。
655 :
654:2007/05/02(水) 17:52:31
少し変えて試してみたコードをそのまま書き込んでしまいました。
testdlg->SetParent(GetParent());
↓
testdlg->SetParent(this);
でした。
「正常に動作しなくなってしまいました」を説明してくれ。
解決の重要な手がかりなんだから。
関係ないけど
モーダルならそういう風にローカル変数でもいいけど
モードレスだと関数抜けた後のことが気になる。
ローカル変数ではないでしょ。
PostNcDestroy で delete this が入ってるか、メッセージで何とかしてるのかと
659 :
654:2007/05/02(水) 21:03:30
>>656 すいません、説明不足でした。
わかっている限りだと2パターンの変な挙動をしていて
1つはダイアログのウィンドウ自体は生成されているようでウィンドウの移動などはできるのですが
再描画のコードが動作していない時のような感じになる事があるのと(必ずというわけでも無いようです)
生成した孫ウィンドウがアクティブな間は何の問題も無く動作しているように見えるのですが
一度、子のウィンドウをアクティブにしてしまうとアプリケーション自体がフリーズしたような
状態になってしまうといった感じです。
念のためSDIの新規プロジェクトを作り直して見ても結果は同じでした。
>>657,658
一応 PostNcDestroy で delete this をしていました。
こういう場合でもスタティックかグローバル変数にしておいた方が安全なのでしょうか?
>659
思いつきで書いただけだから
「関係ないけど」と断ってる
>>659 ttp://msdn2.microsoft.com/en-us/library/ms633541.aspx >if hWndNewParent is not NULL and the window was previously a child of the desktop,
> you should clear the WS_POPUP style and set the WS_CHILD style before calling SetParent.
>Windows 2000/XP: When you change the parent of a window, you should synchronize the UISTATE of both windows.
なんでSetParent使ってるの?
ダイアログリソースに子スタイル設定して、Createで親指定すればいいのに。
あの最低な質問かもしれないですが、万が一という可能性もあるかもしれないので
質問させてください
MFCでコンソールアプリって作成出来ないですよね、バージョンは問いません。
いや、普通にできるが。
>>663 え〜まじっすか?
新規作成→プロジェクトからはMFC ActiveX ContorolWizard or MFC AppWizard(dll) or MFC AppWizard(exe)しかないのだけど?
これじゃあコンソールアプリは作成できないよね?
>>664 Win32コンソールプロジェクトを選択して、詳細でMFCサポート追加しろ。
CStringを返す関数から戻ってきたクラスは自分で廃棄しないでも良いですか?
CStringを返すと、呼び出し側ではそれのコピーを受け取るだろう。
よくこういう仕様のクラスあるけど腐ってるよね?>CString
一見便利そうに見えるけどインスタンスがハッキリしないから
すげー扱いづらい
こういう仕様デフォにする奴ってアフォだろ
なげー文字列をCStringで扱うとアフォかってほど遅くなる
結局、使えない
○○○
○(・ω・)○ ソンナコトイワレテモ
○○○ ウチ、ボン・デ・ライオンヤシ
.c(,_uuノ
>>669 >インスタンスがハッキリしないから
君が何を言っているのか判らないよ…
理解できてないだけじゃ?
>>669 せめて他の文字列を取り扱う手段と比較してから結論を出してくれ。
なんか、C/C++以外の言語と勘違いしてんじゃね?
674 :
デフォルトの名無しさん:2007/05/07(月) 18:55:30
リソースエディタでダイアログボックスを作って、
CDialogを継承した派生クラスを作りました。
コントロールは、追加したメンバ変数を操作して
扱えましたが、ダイアログ自身はどうやれば操作
できるのでしょうか。
タイトルバーの文字列を変更する方法を模索中です。
this->SetWindowText("タイトル文字列");
を試すと異常終了だし。
宇宙天地 與我力量 降伏群魔 迎来曙光
我が左手に封じられし鬼よ
今こそその力を、示せえーー!!
うおおおおおおーーー!!!
俺の生徒に、手を出すなあーーー!!!!
>>676 「Visual C++ Runtime Error [中止][無視][キャンセル]」
のような感じ文面のダイアログが出て終了。
本来ならそれで正解のはずということでしょうか。
何らかのプログラム上のミスが原因で異常終了が出てるのではないか
という意味でしょうか。
SetWindowTextをどこで呼び出してる?
コンストラクタの中とかじゃダメだよ。
ちゃんとウィンドウが作成されてCDialogオブジェクトに
アタッチされてからじゃないと。
679 :
デフォルトの名無しさん:2007/05/07(月) 20:40:02
>>672 じゃ、mallocで確保した領域に突っ込んだ文字列でいいよ
これで想像付く?
後付けであれがないこれがないごちゃごちゃいうなよぶっ殺すぞ
>>678 エディットコントロールやスタティックテキストの値を変更している直後
で呼び出してます。
SetWindowTextで正解で、やはり何かプログラム上のミスでしたか。
わかりました、ありがとうございます。
CDialogもCWndの派生クラスだしな
そもそもエラーで止まったところで何エラーなのか調べなさいよ
イヤです
>>679 想像も何も、あんたが比較して実際に遅いかどうか判断しなさいよ。
>>683 CStringは糞だろ
文字列に1文字ずつ足していくとどんどん遅くなってく類だろw
どうやって足しているのか興味深いなぁ。
まさかとは思うが、CString foo = ""; for (;;) {foo = foo + '-'; std::cout << foo << std::endl;} とかしちゃってるんだろうかw
横レスだけど、それで突然思い出したから自分用のメモ代わりに書いとく。
CString hoge, hoge2;
strcpy(hoge.GetBuffer(20), "this is a test.");
hoge=""; //クリアしたつもりだけど何故かクリアされていない
int length=hoge.GetLength(); //この値は確かにゼロ
hoge2=hoge; //でもhogeもhoge2も"this is..."が入る
hoge="AAA"; //これなら上書きされる
int length2=hoge.GetLength(); //この値は3
hoge=""; //今度はきちんとクリアされる
>>685 mStr += strbuff;
mStrはCString型のメンバ変数、strbuffは引数からうけとったchar*
メソッド実行するたびに鬱になるw
後、CStringの変数を引数に突っ込んで中身を変更したいときとかウザイ
transUnko(char* unko,char* chinko)
ってときにいちいち移し変えなきゃいけねぇじゃん
それか
transUnko(CString *unko,char *chinko)
作らなきゃいけねぇじゃん(俺の知識だと)
後、
strXXX系の関数でいい感じにすでにこさえてあるC言語自分ライブラリ使いたいときも面倒
つーか、気軽に文字列型として扱えないところがウンコだね
うにこーど?いらねぇってw対応予定ねーよ。マジでw
って書いてみたけどさ、
もし簡単にできるにしてもできることがわかりにきぃ
ねっとりべっとりしてやがんだこのクラス
つかいにくーい!
MFC以外でもCString使いたいという話をよく聞くし、
MFCの中では評判いいクラスだと思う。
慣れないと使いにくいのは確か
>686
CString::GetBuffer
解説
GetBuffer 関数から返されるポインタを使って文字列の内容を変更するときは、
次に他の CString メンバ関数を使う前に、ReleaseBuffer 関数を呼び出す必要があります。
MFCを使うDLLの遅延ロードってNGなのかな?
というのも、delayimp.libの中ではAfxLoadLibrary()ではなく、
LoadLibrary()を使っているから、どうなんだろう??
もともと遅延ロードってのは、セグメントを分けてれば Windows がちゃんとやってくれたんだよな。
MFCが自動的にやってくれるようになっただけで。
GetBuffer 関数から返されるポインタを使って文字列の内容を変更するときは、
次に他の CString メンバ関数を使う前に、ReleaseBuffer 関数を呼び出す必要があります。
CString hoge, hoge2;
strcpy(hoge.GetBuffer(20), "this is a test.");
hoge=""; //クリアしたつもりだけど何故かクリアされていない
int length=hoge.GetLength(); //この値は確かにゼロ
hoge2=hoge; //でもhogeもhoge2も"this is..."が入る
↑↑↑ここでコンパイル時にエラー出してくれりゃいいのに
hoge="AAA"; //これなら上書きされる
int length2=hoge.GetLength(); //この値は3
hoge=""; //今度はきちんとクリアされる
>>692 逆だな。ReleaseBuffer()する前にそうやってバッファを変更できないようにするためにGetBuffer()があるんだ。
つまり、fclose()しないでfopen()し直して、ファイルが更新されていないって文句言うようなもんだ。
>>687 少なくとも、レガシーな文字列とCStringを混在させて使うのが間違い。
型が違うのだから、相互にそのまま使えないのは当然だと思うが。
例えばprintf()に渡すように文字列を変更しないならキャストオペレータのお蔭で手間要らずなんだし。
Ex.
void printSample(const char * foo) {printf("%s\n", foo);}
CString bar = "Bar";
printSample(bar);
文字列を変更する関数は参照でも渡せばいいし。
Ex.
void buildString(CString & foo) {foo += foo;}
CString bar = "Bar";
buildString(bar);
いまいち、>692 がなにをしたいのか、全くわからん。
C++の事を何か勘違いしてるんじゃないだろうか。
レガシー大好きっ娘に何言っても無駄
ATLやWTLってSTLやBOOST、LOKIと親和性ありますか?
ないよ
STLと親和性高いWin32GUIライブラリがあった気がするんだが思い出せない
699 :
デフォルトの名無しさん:2007/05/08(火) 23:45:24
リストビューオブジェクトに一次元配列を直接セットする方法はないでしょうか?
いまはループで回してsetItemでセル一個ずつにセットしてます。
もっと効率がいい方法があればいいのですが。
よろしくお願いします。
>>694 >C++の事を何か勘違いしてるんじゃないだろうか。
いやいや、
>↑↑↑ここでコンパイル時にエラー出してくれりゃいいのに
なんて書くくらいだから
勘違いとかそういうレベルじゃない。
ATL/STLはSTLと一緒に使える
704 :
デフォルトの名無しさん:2007/05/09(水) 21:51:00
>>701 ちょっと期待してたんだけど、全然更新されてないね…
706 :
デフォルトの名無しさん:2007/05/13(日) 01:32:28
707 :
デフォルトの名無しさん:2007/05/13(日) 01:41:34
>>706 少しはまともな奴がいるっぽいけど
雑魚ばっかで話にならない
所詮妄想ばっかり先行してる烏合の衆か。
将棋部分に興味ないとかまったくわかんないとかレスが出るだけで俺は参加したくない。
馬鹿じゃねぇの
突破口だけいうと
フリーで将棋プログラム公開してる人に頼み込んで
画像表示部分だけちょいっと弄らせてもらって好きな絵表示できるようにしてもらったほうが
ナンボか可能性ある。
>>708 どこを見たのか分からんが結構な物言いだな、特に前半
ちらっと覗いてみたが、そんなレスはなかったと思うが
710 :
デフォルトの名無しさん:2007/05/13(日) 03:27:34
>>709 だいたいこの状況じゃ
一番苦しいのってまちがいなくメインプログラマーでしょ?
絶対やんねぇよ
ゲーム製作をなめてる
絵のことしか興味ないならビューワーでも作ってろっての
好き勝手要望出すだけの立場の奴等なんかプログラマーは殺意しか湧かない
ゲーム製作現場だって金もらえるからしょうがなく仕事してるのがプログラマーだ
この状況でソフト作ったらまちがいなくすべて俺の手柄だと俺だったら思うね。ていうか間違いねーよ。
それなのにオープンソースにします?はぁ?ふざけろ
だからさ、こういうのやるつもりなら企画をする人間が間違いなくメインプログラマーを張れる人間でなければ絶対に頓挫する
ゲーム製作で一番大変なのはまちがいなくプログラマーだ
実際身動きとれないでしょ?
どういうシステムにしてどういう形のデータが必要になるのか?
プログラマーがいなくてもここまではできますっていう部分あるか?
欠片も浮かばねーだろ?一歩も身動きがとれないでしょ?
うん、しかも金の流れが気になるー
偉そうにリーダー気取ってる奴の懐にいくらか入ってんじゃねーの?
ブログとも繋がってるしな
>Q、バグ多すぎってレベルじゃねーぞ!!
> A、バグ報告は多ければ多いほど、プログラム修正の参考になります。
なりません。
手伝うどころか、優越感を得るための突っ込み先になってるな
大人気ないぜ
>>713 興味が先行してうっかりこれのメインプログラマーになっちゃった奴が可哀想だなと
VC++ 2005で開発を行っています。
CListCtrlで「大きいアイコン」表示をした時、スクロールの方向はどうしても、横スクロールになってしまいますが、
これを縦スクロールに変更したいと思っています。
どうやれば、縦スクロールに変わるのでしょうか。
よろしくお願いします。
717 :
デフォルトの名無しさん:2007/05/13(日) 14:43:03
>717
馬鹿には使えないからあきらめましょう
教えるだけ無駄だな
>717
OnFileNewを呼ぶ
>>717 どちらかというと、CDocument::OnNewDocumentでどうにかすべきじゃね?
723 :
717:2007/05/13(日) 16:19:03
とりあえず解決しました。
CMainFrameにメッセージを割りあてたのが間違いでした。
CWinAppにプロテクトのOnFileNewがあってこれがデフォルトの処理のようです。
CxxAppに割り当てて、もとからあった
ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew)を削除したら目的の動作になりました。
OnFileNewがプロテクトメンバだったので無いとか呼べないとか思ってしまったようです。
>>715 なるほど、このスレの住人に対する優越感だったってわけか
なんかよくわからんこと言ってるけどそのwiki誰に金入ってるかわからんぞ
>>725 アフィってこと?
そんな感じに見えないんだけど……。
可哀想だと思う事が優越感だって、わからんのかね
>>728 質問に答えないで笑うだけとは、お前、アフォにしか見えんな
そんなに貶めたいなら、向こうで文句言ってくればいいだろうに
こっちに問題を持ち込むなよ
>>730 反応するよりましだと思うが
まあいいや、お前がいなくなったらまたこよう
なんか、大変な事になってる……
俺はただ単に、アフィしてるような場所ならいかないけど、そうじゃないなら手伝っても良いかなって思っただけなんだけど
だからそういう話はあっちでやってくれ頼む
>>716 LVS_ALIGNTOP。
プロパティウィンドウなら、表示-Alignment-Topを選択。
>>735 ありがとうございます、一発で解決しました。
737 :
デフォルトの名無しさん:2007/05/17(木) 01:56:51
CMenu の TrackPopupMenu でポップアップ表示状態で処理がいったん停止している状態のプログラムがあるとします
これに対して外部からの通信などによって破棄処理がキックされたとします
すると TrackPopupMenu の後の処理が終わっていないためなのかエラーとなって不正終了してしまいます
これを防ぐにはどうしたら良いでしょうか?
(≒ OnDestroy でポップアップを正常に終了させるにはどうしたら良いでしょうか?)
( つまり TrackPopupMenu の後の処理を実行させるということです)
VK_ESCAPE をポップアップの親ウィンドウに SendMessage することなどを考え付いたのですが、
それでもうまくいかずにほとほと困っております
何かご存知でしたら教えてくださいm(_ _)m
>ポップアップ表示状態で処理がいったん停止している状態
にならないようにする=時間のかかる処理の合間にメッセージループを回すようにする
>>738 TrackPopupMenu の動作を知らんのか
>>737 >TrackPopupMenu の動作云々の前にお前が何をしたいのかが解らんなw
CStringのFormatMessageはFORMAT_MESSAGE_FROM_SYSTEM使えないですか?
CString::FormatMessageのソース見ればわかる
744 :
デフォルトの名無しさん:2007/05/22(火) 00:53:15
>>741 情報ありがとうございます
ところで、その関数はどのように使用すればよろしいですか?
インターネットで検索してみたのですが、適切な情報が見つからなかったのですが……
746 :
デフォルトの名無しさん:2007/05/22(火) 22:37:22
>>745 ありがとうございます
英語ですか……
中学の時英語は常に1or2だった自分には辛いですねorz
Win32APIに(*´Д`)ハァハァできるようになれば、すぐ読めるようになるよ♪
マニュアル英文だから変な構文も使われていないし、まともに日本語訳する必要も無い。
CMainFrame::OnInitMenuPopup()で
メニューのポップアップ内を動的に作ろうとしてるんですけど、
このポップアップ項目の種類(たとえば「お気に入り」とか)は
どうやって調べればよいのでしょうか。
ポップアップ項目自身にはIDは付けられませんよね。
メニューの複数箇所やコンテキストメニューにも
同じ「お気に入り」ポップアップを置きたいので、
OnInitMenuPopup()の中で「お気に入りかどうか」を判断したいのですが。
749 :
デフォルトの名無しさん:2007/05/25(金) 18:33:49
誘導されてきました。
通信受信プログラムで受信データをエディットコントロール(複数行表示)に表示しているのですが、
以下のコードでは、エディットコントロールに文字列を追加する際に必ずスクロールされてしまいます。
スクロールされない方法を教えてください。
LineScrollで戻すと、1行書くごとに「下へスクロール→上へスクロール」となり、上下にスクロールが発生してしまい
とても見づらくなってしまいます。
「スクロールなし」でエディットコントロールに文字列を追加できないものでしょうか?
int iLen = edit->GetWindowTextLength();
edit->SetSel(iLen, iLen);
edit->ReplaceSel("Hello\n");
WinXP & Visual Studio 2003 & mfc7です。
751 :
デフォルトの名無しさん:2007/05/25(金) 19:09:59
>>750 そ、そんなところに... (^^;)
やってみます。
ただいま、印刷のテストをしてます。
ネットで見つけたサンプルコードで、印刷はできたのですが、
ものすごく遅いのです。
3000*3000の画像をプリントするのに、1時間かかります!
WindowsXPですが、他のアプリから印刷する場合は数分で印刷できるので、
プリンタやOSやドライバの問題ではなく、プログラムの仕方の問題だと思うのですが、
単純にプリンタ用のpDCに画像を送るだけでは速くはならないのでしょうか?
以下は、ネットで見つけたサンプルコードで、このままでパターンが印字されます。
〜View::OnFilePrint(){
CPrintDialog myPtDlg(FALSE); HDC myPtDC; CDC myDC; DOCINFO myDocInfo;
if(myPtDlg.DoModal() == IDOK){
myPtDC = myPtDlg.GetPrinterDC(); myDC.Attach(myPtDC);
myDocInfo.cbSize = sizeof(myDocInfo); myDocInfo.lpszDocName = NULL; myDocInfo.lpszOutput = NULL;
myDocInfo.lpszDatatype = NULL; myDocInfo.fwType = 0;
myDC.StartDoc(&myDocInfo); CDC* pDC=GetDC();
myDC.StartPage();
for(y=0;y<3000;y++){ for(x=0;x<3000;x1++){
myDC.FillSolidRect(x,y,1,1,RGB(x,y,+y));
} }
myDC.EndPage();
myDC.EndDoc(); ReleaseDC(pDC); ::DeleteDC(myPtDC);
} }
すみません
>>753の訂正です。CDC* pDC=GetDC(); は不用でした。
>>753のコードをいじれば画像も印刷できるのですが、遅いです。
たとえば、下のように記述すると速いのですが、
for(y=0;y<30;y++){ for(x=0;x<30;x1++){
myDC.FillSolidRect(x,y,100,100,RGB(x,y,x+y));
} }
大きい画像の場合は、1ドットずつ描くしかないですよね?
いいえ
>>754 なんで大きい画像だと1どっとずつやるしかないの?
>>756 1ドットずつやらないで済む方法があれば、それを知りたいわけです。
頭悪いな
ドットインパクトプリンタの話はスレ違いだぞ
試しに3000*3000のビットマップ印刷してみれば?
>>760 みたとこアホの子なので問題の切り分けなんて無理でしょう
1ドット書くのにFillSolidRect使うアホ
もうちょっと頭使ってもバチ当らないよねw
3Dを使うゲームよりドット絵のゲームが好きだ!!!!
>>766 ∧_∧
( ・ω・) <俺にそんなこと言われてもね
( MFC )
./ つ
( / ̄∪
∧_∧
( ・ω・) <どっちかっていうと俺の出番じゃね?
( GDI+)
./ つ
( / ̄∪
∧_∧
( ・ω・) <いやいや俺だろ
(DirectX)
./ つ
( / ̄∪
>>755-766 そんなことを言ってる貴方たちも、本当は知らないのでしょう?
それとも印刷に関しては企業秘密かなんかですか?
自分が苦心して見つけた方法を、簡単に他人に話したくない気持ちはわかりますよ。
一緒に問題を解決しようという気持ちはないわけですか?
自分が知ってる方法が、最善だという確信があるわけですか?
BitBltを使う方法はもちろん知ってます。
ただ、それだと若干手順が増えますのでね。
>>768 だから俺がBitBltって教えてやったじゃんw
おぬしなにやつじゃ
>>768 何様だよお前w
BitBlt抱えて空へ羽ばたけよw
>そんなことを言ってる貴方たちも、本当は知らないのでしょう?
適材適所なので、あんたの求めるケースの適切解は内容が判らない限り説明しようが無い。
>それとも印刷に関しては企業秘密かなんかですか?
企業秘密にならない範囲でなら説明するに吝かではない。
>自分が苦心して見つけた方法を、簡単に他人に話したくない気持ちはわかりますよ。
勝手に判られても困る。寧ろ、それが判ると言い張るならもう少し言葉を選べ。
>一緒に問題を解決しようという気持ちはないわけですか?
ないな。
>自分が知ってる方法が、最善だという確信があるわけですか?
いいや、あくまでも適材適所。
>BitBltを使う方法はもちろん知ってます。
>ただ、それだと若干手順が増えますのでね。
増えるから何? 手順が増えてもそれが適切解なら選択すべきでは?
#適切解かどうかは知らんが。
>>772 >>ただ、それだと若干手順が増えますのでね。
>増えるから何? 手順が増えてもそれが適切解なら選択すべきでは?
そうですか。
だらだら、手順が増えていいなら、どんなこともできますよ。
一応、なるべく、簡潔なコードで、よりよい効果を期待してプログラムをしてるわけで、
コードの増えるBitBlt以外にも方法があるかどうか知りたかったのですが、
BitBltが最善なら、それで行くことにしますよ。
ダメだこりゃ
馬鹿な・・騙りじゃなかったのか
apiを無駄に3000*3000回呼んでも見た目が大事だよな
>>773 おお、成長したじゃんw
1ドット書くのにFillSolidRect使ってたアホの言葉とは思えないねw
まあ、昔は大きな画像をプリンタDCに BitBlt出来なかったって事はある。
だから、ひとつひとつFillRectしたような実装や、大きいBitmapを小さく小分けしてBltしたりとか、
そりゃ小技を使ったよ。
それ、いまでも、ダメなのかな。
いくらか小分けにすればいいだけであって1ドットずつはやらんよなw
もっと簡潔なやり方があるに違いない病だな
WinMainの記述はどこのフォルダのなんと言うファイルに書かれていますか?
appcore.cpp(96): // in non-running state until WinMain
appmodul.cpp(19): // export WinMain to force linkage to this module
appmodul.cpp(21): extern int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
appmodul.cpp(25): _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
appmodul.cpp(28): // call shared/exported WinMain
appmodul.cpp(29): return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
appterm.cpp(27): // Standard cleanup called by WinMain and AfxAbort
makefile(402): $D\winmain.obj $D\barcore.obj $D\bartool.obj $D\bardlg.obj \
wincore.cpp(3553): // Standard init called by WinMain
winfrm.cpp(762): nCmdShow = pApp->m_nCmdShow; // use the parameter from WinMain
winmain.cpp(18): // Standard WinMain implementation
winmain.cpp(21): int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
alpha\mfc42.prf(961): ?AfxWinMain@@YAHPAUHINSTANCE__@@0PADH@Z
alpha\mfc42u.prf(761): ?AfxWinMain@@YAHPAUHINSTANCE__@@0PAGH@Z
intel\mfc42.def(1341): ?AfxWinMain@@YGHPAUHINSTANCE__@@0PADH@Z @ 1576 NONAME
intel\mfc42.prf(466): ?AfxWinMain@@YGHPAUHINSTANCE__@@0PADH@Z
intel\mfc42d.def(949): ?AfxWinMain@@YGHPAUHINSTANCE__@@0PADH@Z @ 1190 NONAME
intel\mfc42u.def(1334): ?AfxWinMain@@YGHPAUHINSTANCE__@@0PAGH@Z @ 1569 NONAME
intel\mfc42u.prf(321): ?AfxWinMain@@YGHPAUHINSTANCE__@@0PAGH@Z
intel\mfc42ud.def(946): ?AfxWinMain@@YGHPAUHINSTANCE__@@0PAGH@Z @ 1187 NONAME
785 :
デフォルトの名無しさん:2007/06/02(土) 01:03:00
ちょっと聞く場所違うかもしれないけど
VC6.で作ったデフォルトのmfcのプログラムで
メニューからファイルを開こうとすると異常に時間かかる(5秒くらい)
しかも時間かかるのは初回のみでデバッグの時だけ
exeファイル直接実行すると時間も時間もかからずすぐ開ける
エラーも警告も無し
理由がさっぱり解らない。助けて
出力に大量になんかでてないか?
ソースも出さずにエスパーしろと?
VC6.で作ったデフォルトのmfcだったら試してやってもいいけど
とりあえずうちではもんだいなし
>>786 ソースはvcが生成した奴だから自分は一切
手を加えてない。
>>789 はい、ありがとうございます。
どー考えてもPC自体に原因があんだね。
症例だけを見て同じ人いたらと思いここに書いたが、ふう
なんか解決するにはめんどくさそうなので全部再インスコかな。
もう一台PC持ってないの?
手を加えたかどうかなんて聞いてない
出力ウィンドウに何か出てないか聞いている
デフォルトのCWndでファイル開いたってしょうがないと思うんだが
CViewか
デバッグしてて出力知らないなんてありえない・・・
>>796 VS2005なら、メニューの 表示-出力 で表示されるウィンドウの事。
デバッグ時に読み込んだDLLとか、TRACEの出力とか表示されているだろ。
悪い デバッグしないから知らない
デッバグしないのにデバッグの時の動作が気に入らないとw
DLL読み込むのに時間がかかったんだよ多分(笑)
でもデバッグしないなら問題ないじゃん、原因や理由を考えるレベルじゃないんだからさ
好きなだけ再インストールでもなんでもしてればぁ
>>799は違う人なんだが、、デバッグしてるって
出力ってこの下のウインドウの事か。何かって言われても
まあ確かにDLLを沢山ロードしましたって出てる
それくらいで後は
スレッド 0xEE4 終了、終了コード 0 (0x0)。
こんなの。
すっげぇデジャビュw
気になったんで動かしてみたら
俺のPCの場合はVC6でこさえてなんもいじってないMFCのプログラム動かしてたらOSごと落ちたw
なんだっけ?これ
なんかアクロバット絡みのファイルオープンダイアログのバグってなかったっけ?
なんか初期化関数おいてやらないと落ちる奴
違うかなぁ・・・なんかあった気がするのは覚えてるんだけど・・・うーん
まあ、とりあえず俺の環境でもVC6でこさえたMFCのプログラムはなんかおかしい
違う症状なので同じ原因かはわからんけど
他のもんもちょっとみてみようかな
いつからこんなんなったんだろう・・・
>>802 OSごと落ちたんすか、キてますね・・・
アクロバットってあのreaderの事?
確かにあのダイアログ開く時に最初の一回だけだから
コンストラクタのどこかかなとは思ったけど
cidaemon.exe
動いてない?
807 :
デフォルトの名無しさん:2007/06/03(日) 19:29:42
呼び出し側でポインタ壊してるんじゃないの
質問です。
アプリのGUIスレッドで例外が発生したら、プログラム全体を出来るだけ
安全に終了させたいと考えております。
いくつかスレッドが動いていて、今現在何個のスレッドを動作させているか
直接は変数等に控えていない状態で、MFC・Win32APIを用いて、全スレッドを
列挙後、強制終了させたいのですが、この列挙する関数が見つかりません。
このような用途に使えそうな関数はあるのでしょうか?
WinXP SP2
VS2005
C++
あります
MFCにはないと思う。
自分でグローバルな変数にでも保存しておくのがいいんでない?
>>810 列挙して強制終了がTerminateThreadの事だったら
何もせずシステムに殺してもらうのと大して変わらんと思うぞ
814 :
デフォルトの名無しさん:2007/06/10(日) 20:25:44
ファイルハンドルをつかんでいるときに、
そのファイルが削除されるタイミングを検知できれば、
ファイルハンドルを解放しようと思います。
その方法を知っている方いますか?
MFCの話か?
816 :
sage:2007/06/10(日) 22:05:05
デバイスのチェックはCWnd::OnDeviceChange()があるので、
MFCでないかなぁと思って。
817 :
814:2007/06/10(日) 23:05:25
やっぱりWin32板逝って来ます。
誰か教えてください
UNICODEビルドのdllからMBCSビルドのdllの関数を呼び出す時の
CString型の変換なんですが、MBCSビルド側のDLLに
・名前を設定する関数
・名前を参照する関数
があるとして
名前を設定する場合は
USES_CONVERSION;
CString strName = _T("名前");
mbcsdll->SetName(W2A(strName));
としてNameをANSIに変換して設定できています。
Nameを参照する際にはCString*を渡す必要があるんですが
CString Name;
mbcsdll->GetName(&Name);
この時のNameへのポインタはどのように型変換して渡すんでしょうか?
このままだと参照できませんでした。
変換をどうやったらいいのか解らず弱っています。
CString Name;
CStringA NameA;
mbcsdll->GetName(&NameA);
Name = NameA;
でどう?
回答ありがとです
ただCStringAはVC7からのATLではないですか?
自分VC6なんです(=TェT=)
VC6での型変換方法をご存知ないでしょうか
中がcharなCStringオブジェクトへをポインタを渡せばいいと思うのよ。
7だと
typedef ATL::CStringT< wchar_t, StrTraitMFC< wchar_t > > CStringW;
typedef ATL::CStringT< char, StrTraitMFC< char > > CStringA;
typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;
だからCStringAと書いたんだけど、6のCStringはどういう定義なんだろう。
それのTCHARをcharに置き換えて変数作ればいいと思う。
>818の後、A2W(Name.GetBuffer())はよくないよね。
DLL間でMFCオブジェクト渡すのはいろいろ注意が必要だけど
そこんとこ分かってるのかな?
>>822 う、「MFCオブジェクト」の意識ありませんでした。すいません。
そういえば自分がやるならインターフェースはプリミティブなものにしちゃうなぁ。
824 :
デフォルトの名無しさん:2007/06/14(木) 23:10:56
すみません。
FindWindowなどで取得した特定の種類のコントロールのウィンドウハンドルを、
それに対応するMFCの「C〜」クラスに割り当てて、
「C〜」クラスの機能関数を使うことはできるのでしょうか?
もしできるようでしたらやり方を教えて欲しいです。
よろしくお願い致します。
可能
ウインドウを扱うクラスといったらあれしかないだろ
>824
attachとか見てみて
質問です。
ツリーコントロールにイメージリストを設定。
あるタイミングでツリーのフォントサイズを変更するとき
イメージのサイズも変更したい考え、
一度イメージリストをDeleteImageList()で削除し、
再度Createする際にサイズを変更し設定したんですけど
イメージが消えてしまいました。
なにかいい方法はありましたらご教授をお願いします。
そんなことMFCスレで質問されても
>>827 最初にサイズ別にCImageList を2つ作って切り替えたいときにCTreeCtrlにSetImageListする。
モーダルダイアログの親って、コンストラクタでしか指定できないものなんですか?
ダイアログ終了後も値を内部で持っておくために、
ダイアログオブジェクトをグローバルで一つだけ持ち続けて、
いろんな箇所からモーダル表示させたいんですけど、
DoModal()の前に親を再指定できる箇所が見当たらないんです。
ウインドウ作った後で親は変えられるよ
>>830 CWndから派生してるから親はどうとでもなるが
親を変える必然性が解らん
デフォで出来るAboutAppのダイアログにEditBoxとその値用変数を一個追加
ダイアログをグローバル変数にしてMainFrameとAppから呼ぶようにしてみたが普通に動いたし
変数の変は常に保持されていた。デフォなので親はNULL
メッセージを送るなら送りたい相手のハンドルが入手できれば良いわけだし
モーダルだからWindowが残ることもないし
>>832 メーラのように子のフレームウィンドウを何個も表示するアプリなので、
ダイアログの親をNULLにしたままだと、メインウィンドウの上に出てきてしまうんです。
ダイアログ側からもGetParentFrame()を使って
DoModal()をコールしたフレームウィンドウにアクセスしたいので、
できればダイアログの親をDoModal()時に変更できればと思ってます。
モーダルなのにずっと使いまわす感覚がわからん
ダイアログオブジェクトをグローバルにして
別々のウインドウからDoModalしたらぶつかるんじゃないか?
>>834 前回指定された情報をそのまま次回も再表示したいので、
ダイアログオブジェクトをグローバルにしておけば
ダイアログ内のメンバをそのまま使い回せると思ったのですが、
おとなしく毎回ダイアログから値を取って別の場所に残しておき、
次の表示時に一つずつ入れ直してしまうべきなのですかね。
>>835 もちろん、モーダル表示中は他のウィンドウも操作不可にしています。
WinXP、VC6MFCです
マウスを右クリックしたタイミングで特定のプログラム(実装)を
右クリックメニューに追加したいのですがどうしたらできますか?
何をしたいのかさっぱりわからん
もっと具体的に
>>837 >マウスを右クリック
どこでだよ。
シェル拡張の話か?
多分、右クリメニューに自分のプログラムのコマンドを追加したいんだろう
その右クリメニューはどういう状況で出すのか聞いてるのでは
ひょっとしてホームのSendToで充分な話なのか…。
>>837 AppendMenu, InsertMenu
MDIアプリケーションで、
CToolbarを2つ作成し、CFrameWndの右と下に
ドッキングさせると、
┌───────────┬┐
│ ││
│ ││
│ ││
│ ││
│ ││
├───────────┴┤
└────────────┘
のように、下のツールバーが右のツールバーに
かぶさるようにドッキングされますが、
┌───────────┬┐
│ ││
│ ││
│ ││
│ ││
│ ││
├───────────┤│
└───────────┴┘
のように、右のツールバーが下のツールバーの上に
かぶさるようにドッキングすることって可能でしょうか?
できたよ
846 :
844:2007/06/28(木) 01:31:16
どうやって見つけたんだよ
常に波動拳を出してる人なんだろう
850 :
デフォルトの名無しさん:2007/07/01(日) 05:04:01
ちょっと質問
自分、初級PG(MFC使ったこと無い)ですが
最近入ってきた中途の人が
「MFCは楽、簡単」
って言ってる人が居るんだけどそうなんですか?
MFCって要するに巨大な関数群、ライブラリな訳ですよね?
使い易い関数や便利な関数は沢山あれど
結局はそれをどう使うかですよね?
それは結局標準的なC言語の関数をどう使っていかに組むか
っていうのと変わらないと思うんですけど・・・
それとも自分の知らないMFCの機能が有って
楽で簡単になるんですか?それってC言語の仕様が変わったりするって事ですか?
誰か分かり易く教えてください。
851 :
デフォルトの名無しさん:2007/07/01(日) 05:31:05
852 :
デフォルトの名無しさん:2007/07/01(日) 05:35:59
OLEサポートが組み込まれたフレームワーク。
関数群でもクラスライブラリでもない。
何か勘違いしてると思うのでMSDN調べるといい。
めんどくさいことを楽して簡単にするためのクラスライブラリなのは確か
楽するためにウィザードがついている
VCからMFCを取ったらほとんど何の価値もないから
無償版として提供されている。
>>850 C言語の標準関数で、文字列の末尾から5文字を取得する関数を書いてみろ
MFCなら簡単にできるぞ
// 余り難しくないが
sprintf(buf, "%.5s", strlen(str) < 5 ? str : str + strlen(str) - 5);
// MFCはC++なんだから較べるならstd::stringじゃね?
MFCを使っている時にMFCの文字列クラスを使うと便利だけど
文字列を扱う目的だけでMFC使うやつはあんまりいないと思う
文字列クラス欲しいだけならstd::basic_string<>でいいだろ
858 :
デフォルトの名無しさん:2007/07/01(日) 11:05:24
ブラウザを作る際に、
MFCの他にWTLやATLを使う方法があるというのを
聞いているのですが、
VC++6.0 MFCを使って作る場合の
メリット、デメリットについてご存知でしたら
教えて頂けませんでしょうか。
(早く作れる、移植性が悪い など)
SleipnirはMFCを使って作られている。
860 :
デフォルトの名無しさん:2007/07/01(日) 11:38:49
OLEが組み込みサポートされている。
ドキュメントビュー構造が利点にも欠点にも。
古臭い。
861 :
デフォルトの名無しさん:2007/07/01(日) 13:17:30
>>859 ありがとうございます。初めて知りました。
SleipnirがMFCとは知りませんでした。
MFCは業務で使ったことがあり、私は
変えたいところは
上書きして対応できるし工数が減るので
使えると思っていたのですが、
なぜだかMFCアレルギーというか
異様に嫌っている人がいて、
使わないほうがいいみたいな風潮が
を出しているために、戸惑っていました。
DonutはWTLを使っているみたいですね。
>>860 ありがとうございます。
ドキュメントビュー構造というのは、SDI/MDIで
出てくるControl/View/Modelの
ことでしょうか。
862 :
デフォルトの名無しさん:2007/07/01(日) 13:50:33
>>861 ブラウザを作る話か。
勘違いしてた。
なら話は簡単。
MFCはブラウザをサポートしてる。
これがメリット。
デメリットはMFCだってこと。
漏れもMFCアレルギー者だったが業務でVC6を使うようになり
すっかり気に入ってしまった、C言語の拡張、高機能版という認識でいる、MFCの関数をあまり知らなくても
Cでゴリゴリ書けばいいし、後で等価のMFCの関数に気付いたら修正すればよろし
>>863 置き換えた関数の一例を挙げてくれ。
漏れは逆に、MFCはリソースエディタとDDXくらいしか使ってないんだよね。
基本的に、GUIべったりじゃないところはCStringさえ使わないようにしていたし。
>>864 そうだね例えばSDKでFindFirstFile使ってフォルダ検索処理してたのをMFCの
CFileFindを使ったりとかだね、ラッパ関数なんで速度的にも満足してるな
ファイルダイアログで選択したファイルをたくさん処理するのってどうしたらいいの?
ファイルダイアログから文字列で貰うのって限界なかったっけ?
VBとかだと何個読みこんでも大丈夫みたいなんだけど
>>866 VBは使ったことないからどうなってるのかしらんが
OPENFILENAMEのlpstrFileにOFN_ALLOWMULTISELECTの場合はExtra NULL characterで区切られとると書いてあるだろ
>>867 いや、問題は最大長の話なんだけど0xFFFFが限界じゃなかったっけ?
それで読むとさ、パスが長いとショボイファイル数しか読み込めないんだけど
一体みんなどうやっているのかと疑問だったんだ
CFileFind自体は関数ではないけど、つっこむべきか悩む。
870 :
デフォルトの名無しさん:2007/07/01(日) 17:34:39
>>869 いや、たぶん素で書いてるんだと思うよ。
>C言語の拡張、高機能版という認識でいる
ということらしいから、言語とライブラリの違いがわかってなさそう。
このスレ自体釣りなんじゃないかと疑ってしまうけどね。
MFCって言うと、ドラッグアンドドロップのようなOLE関連の操作を
フレームワークに閉じ込めた部分が一番大きいと思うんだけど、
そういう話が一切出てこないところを見ると、ほんとに使ってるやついるのかと
疑問がわいてくるよ。
MFCにあってWin32APIにない機能ってある?
GDI+をWin32APIとみなしていいかどうか・・・
>>871 ・ファイルオープンダイアログのファイル無限読み込み
・トラッカークラス
・メモリデバイスコンテキストの管理
がわかんない(MFC使わないと)
>>870 「ドキュメント編集」という骨格を使うならそうだろうけど、
漏れみたいにダイアログしか使わない用途ならOLEなんかもどうでもいいね。
>864にも書いたけど、ダイアログに部品をペタペタ貼るだけだからなぁ。
#んで、某社のActiveXの糞仕様に悩まされたりして。
875 :
デフォルトの名無しさん:2007/07/01(日) 19:32:54
クラスを基本とするアーキテクチャでは
単体のグローバル関数で構成されるほうが不自然なのに
両方関数単体であることを比較条件にするのも
よくわからないけどな
876 :
デフォルトの名無しさん:2007/07/01(日) 20:13:53
MFCが嫌われた原因の1つとして
まず最初に随所に出てくるAfxの意味を
先に説明しないから
気持ち悪い状態で進まらざるを得ない
せいもあったかもねぇ。
877 :
デフォルトの名無しさん:2007/07/01(日) 21:01:19
「Anal Fucking seX」というのは冗談として、おそらく「Application
Framework eXtention」とかじゃないのかな。けど、名前に意味はないよ。
マクロにしろ、関数にしろ、定数にしろ、ソースが公開されているの
だから、どこでどう定義されているか調べればよいだけ。選択して右
クリックすれば、定義位置へジャンプする便利なメニューがあるでそ。
俺はAplication Framwork(s)→afxって聞いたけど。
879 :
デフォルトの名無しさん:2007/07/01(日) 22:26:40
>>868 OpenFileDialogなんか使っているくせに0xFFFFで不足とかショボイとか笑わせんなよ
881 :
デフォルトの名無しさん:2007/07/01(日) 23:33:00
>>880 >>879 ではないが、出来合いのモン(コモンダイアログ)に文句を言うなら、
自前で作れば良かろうと言っているんでは?
>>881 いや、それだとエクスプローラ上で選択されたもんをもってくる手段がわからん
みんなここから自作してんの?もしかして?
883 :
デフォルトの名無しさん:2007/07/02(月) 13:57:13
>>874 ダイアログはMFCの機能じゃないだろ。
MFCは便利だよ。
printfとかあるし。
885 :
874:2007/07/02(月) 14:17:36
>>883 CDialogを使っていると言うだけの話と思ってくれていいよ。
>>885 え?CDialogしか使ってないのに
>>874みたいなこと書いてるの?
そりゃ失礼。
ママー変なおじさんが来たよ〜〜〜
887 :
874:2007/07/02(月) 14:57:01
あーやっぱり……
888 :
デフォルトの名無しさん:2007/07/02(月) 15:23:35
隊長、噂でVS2005のMFCってグリッドコントロールが準備されてるってのは本当デツカ?
VC6で簡単にエクセルのようなグリッドコントロールが使いたいのですが・・・
>>889 VC6には、FlexGridのMSバンドル版である、MS-FlexGridがバンドルされていたと思いますが。
Excel(つーかMSOfficeSuite)をインストール済みなら、Excel由来のコントロールも使えると思うし。
俺も
>>874 同様、CDialog (とコントロールの派生クラス) だけの為に
MFC 使ってるんだが、そんなオカシイこと言ってるか?
いいんじゃね?
893 :
デフォルトの名無しさん:2007/07/03(火) 16:05:18
ウィンドウがダイアログでも
CDialogだけってことはあまりないだろ
配置するコントロールもMFCクラスだし
文字列操作とかファイル操作とか
見えない処理でもMFCクラスを使う
機会はある。
>>894 ここ数日煽りばっかりやってるけど
何か嫌なことでもあったの?
自前のライブラリでWin32APIのみでMFCカバー完了したんだけど
使ってみたいひといる?
あんただれ?
とんでもない。わたしゃ神様だよ。
神光臨!
蟹工船!
>>896 どうせならMFCだけでなく、ATL::CWindowからATL::CWindowImplあたりのカバーをしてくれ。
そうすればVC++以外でWTLが使えるようになる。
>>897 解説キボンの前にどこまで考えたのまったく考え付かないわけ?
まったく考えつかない場合目茶低レベルなので以下の質問に答えて欲しい。
TreeViewとかTreeCtrlとかは使ったことあるの?
あるならそれを自前で実装するとしたらどうすればいいか考えてみればいい。
FileDialogも似たようなもの。
TreeViewもヒントにならない場合初歩にも達していないので以下の質問をさせてもらう。
普通のViewに好きなようにアイコンは表示できるのできないの?
これができないならお手上げ、できるなら上の質問に答えられるレベルになればなんとかかんとか思いつくようになれるだろ
良い実装になるかどうかしらんが解説キボンなどと書かなくはなるだろ
ネチネチしてるのは梅雨だけで十分。
しかしMFCのタイマ機能は貧弱にも程があるよな
MFC設計者アホだろ
MFCのタイマー機能って何?
つーか、あれ、SDKそのままで手を加えてないだけだと思うが。
>>903 え?いきなりtreeの話始めてるけど
基本方針ってどういうのを想定して言ってるの?
話が全く見えないんだけど?
つまり、FileDialogをどうにかこうにかして使うんじゃなくて
既存FileDialogはもう全く駄目なので自分が望む理想のFileDialogを自作するって言ってる?
スレッドから起動してるモーダルダイアログを他スレッドから落とす方法ってありますか?
WM_CLOSE、EndDialogどれも落ちる気配が無いです…
>>908 2048?マジすか?
なんもできないじゃないですかw
やっぱり自分で作るしかないですかね
複数選択させることがあまりないからなあ
これ対応するにはカスタムテンプレートじゃなくてフックのほうを使うのかな
CArrayクラスを使って
char szItem[定数][可変長];
これと等価のものはどの様に書いたらイイデツカ
>>912 std::vector<std::vector<char> >
それCArray違う。
といいつつこれも違うんだが、CStringArrayを勧めてみる。
915 :
デフォルトの名無しさん:2007/07/08(日) 11:29:41
VisualStudio2003なんですがCButtonにSetIconするとボタンの外観が
クラシックスタイルになってしまいます。
アイコンつきのボタンをXPスタイルで表示させるにはどうすればいいんでしょうか?
>>915 1. オーナードロー+Theme系APIで全部自前描画
方法としては一番正しそう。だが面倒。
2. NM_CUSTOMDRAWで中身描画部分だけオーバーライド
BS_BITMAP/BS_ICONはオフにしておくこと。
2005だと手作業で追加作業が必要だったので、念のためメモしとく。
*このメッセージはCC6.0以降でしか送られてこない事に注意
// BEGIN/END_MSG_MAP
ON_NOTIFY(NM_CUSTOMDRAW, コントロールID, ハンドラ)
// ハンドラ
afx_msg void Handler (NMHDR * pNotifyStruct, LRESULT * result)
// ハンドラ実装
const NMCUSTOMDRAW& nmcd = *(const NMCUSTOMDRAW *)pNotifyStruct;
if ( dwDrawStage == CDDS_PREPAINT ) {
// ここでnmcd.hdcに自前描画
*result = CDRF_SKIPDEFAULT;
}
else {
*result = CDRF_DODEFAULT;
}
>>916 レスありがとうございます
自前で描画するしかないんですねorz
Theme系APIについて全く無知なので先は険しそうです
>>821 たしかVC6はCStringはクラステンプレートになっていなかったはず。
VC6です。
現在、複数のコントロールバーの状態を、CFrameWnd::SaveBarStateを使わずに、
アプリケーションのINIファイルやレジストリとは無関係の任意のINIファイル、
任意のセクションに、WritePrivate系の関数で保存できないかと試行錯誤しています。
CDockStateの解説を見てみたところ、Serializeで保存できると書いてあったので、
CMemFileでメモリ上にシリアル化し、そのバイト列をそのまま
WritePrivateProfileStructで吐き出してしまう方法を思いつきました。
以下のようなコードになっているのですが、CMemFileを使うこと自体も初めてで、
このような方法でよいものなのか、わからない状態なのです。
こういう方法でコントロールバーの状態を保存した場合、
なにか問題の起こる可能性はありますでしょうか?
もしくは、もっと的確な方法はありますでしょうか?
CDockState state;
GetDockState(state);
CMemFile file;
CArchive ar(&file, CArchive::store);
state.Serialize(ar);
int bufSize = file.GetLength();
BYTE* pBuf = file.Detach();
CString strBufSize;
strBufSize.Format(_T("%d"), bufSize);
WritePrivateProfileStruct(_T("SECTION"), _T("BUFFER"), pBuf, bufSize,
_T(".\\DockState.ini"));
free(pBuf);
CFrameWnd::SaveBarStateのソース見たら簡単にできそうな気がする
921 :
デフォルトの名無しさん:2007/07/10(火) 11:27:58
MFCでDLLを作成している場合のDLLMainの引数のHINSTANCEは
どのように取得したらよいでしょうか?
theApp.m_hInstance
をGetModuleFileNameに渡してみたのですがDLLも
パスが取得できず、呼び出し元のパスが取得されてしまいます。
よろしくお願いします。
デバッガ持ってないの?
AfxGetInstanceHandle()
924 :
デフォルトの名無しさん:2007/07/10(火) 12:54:28
Win32 APIを便利なクラスライブラリ化したものが
MFCでしょ?(マイクロソフトの製品)
.NET Frameworkクラスライブラリは、何からできてるの?
USRDLL バージョンというのは何でしょうか?
>>924 Win32に相当するのが.NET Framework
少なくとも現状は、.NET FrameworkはMFCやATL/WFC等に代わるライブラリ
で、.NET Frameworkは下請けとしてWin32 APIを呼んでいるはず。
そうでなければ、.NET Frameworkと同じ仕掛けを使えば、システムコール
を使わずにシステムを直接操作できる「セキュリティホール」が存在する
ことになる。
マイクロソフトは、将来的にはMFCやWin32APIを捨てて、.NET Frameworkを
ネイティブなAPIにしたいようだけど、そうなればWindowsエミュレータを
提供しない限り、過去のWindows資産は動かなくなるわけで、下手をすると
Windowsで大きくなってきたMicrosoftの足元をすくうことにもなりかねない。
MFCでスプリットウィンドウを作成してみようと、ヘルプを参考にCMainFrame::OnCreateClientに次のように書きました。
(長くなるのでエラー処理は省いています。)
m_wndSplitter.CreateStatic(this, 1, 2);
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(100, 100), pContext);
m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CSplitWndTestView), CSize(0, 0), pContext);
上記のような左右分割のスプリットウィンドウは問題ないのですが、
m_wndSplitter.CreateStatic(this, 2, 1);
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(100, 100), pContext);
m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CSplitWndTestView), CSize(0, 0), pContext);
上記のような上下分割のスプリットウィンドウを作成仕様とすると、CSplitterWnd::IdFromRowColの下記Assertに引っかかってしまいます。
ASSERT(col < m_nCols);
ちなみにASSERTだけが問題らしく、リリースビルドの場合は問題なく動作しています。
何か書き方に問題がありますでしょうか?
環境はWindowsXP SP2 + Visual Studio 6.0 SP6です。
>>927 >.NET FrameworkはMFCやATL/WFC等に代わるライブラリ
いや Framework っつーくらいで、実行環境だから。
>ネイティブなAPIにしたいようだけど、
諦めたとか言ってなかったっけ?
つかスレ違いだ。
>928
デバッガ持ってないの?
ASSERT(col < m_nCols);
の意味を考えればすぐわかりそうなもんだが。
>>916 >>915=
>>917です。その後の経過を報告します。
まず[1.]の方法を試してみましたが、
ボタンの上にポインタがあることを検知できないことに加えて、
Theme系のAPIを使うと、当然ながらWin2k上で動かない、
という問題が発覚しました。
次に[2.]の方法を試してみましたが、
こちらはXP上ではそれっぽく表示され、
2k上ではアイコンなしのボタンとして表示されます。
理想はXPでも2kでもアイコンが表示され、かつXP上ではXPのスタイルに
なることなんですが、現状の選択肢だと[2.]の方法で妥協するか、
全部古いスタイルに統一してしまうか、になりそうです。
それとまた質問なんですが、DrawThemeBackground関数に渡す
BP_PUSHBUTTON とか PBS_NORMAL 等はどこに定義されているんでしょうか?
今回は0,1,2...と渡して実際に動かして試しました。
>>932 tmschema.h
uxtheme.hの頭の方に、どこで定義されているかは書いてあるんだけどね。
CC6.0以降は自前描画、それより前はBS_ICON+SetIcon、
と使い分けるのが無難かな。多少面倒だけど。
>>932 [1]では、Windows 2000ならテーマAPIではなく、
GDIのDrawFrameControlかDrawEdgeで枠を書けばいい。
ますます面倒くささに拍車がかかるけど。
>>933,
>>934 レスありがとうございます。
基本的に
>>933氏のアプローチに沿うかたちになりました。
まずLoadLibraryとGetProcAddressをつかってOpenThemeData関数をコール、
テーマが取得できたらカスタムドローイベントでアイコン部分を描画。
Openしたテーマ自体は使わずにすぐにClose。
テーマが取得できない、あるいはライブラリをロードできない場合は
CButtonをBS_ICONで作り直して普通のアイコンつきボタンにする。
これで一応期待した動作になりました。
なんかCButtonがCreateされたあとはBS_ICONをON/OFFできないみたいなので、
DestroyWindow→Createで作り直すような形になってしまいましたが、
こういうものなんでしょうか。
936 :
デフォルトの名無しさん:2007/07/13(金) 13:26:29
VC++2003です。
CEditのLineLengthで指定行の文字のバイト数が取得できると思ったんですが、
int len = m_edit1.LineLength(m_edit1.LineIndex(i));
MSDNによると指定された行の長さ (バイト数)と書いてあるので
例えば「あいうえお」とすれば10が返ってくると思ったんですが、実際には5が返ってきます。
これだと全角文字はGetLineで一行取り出す、ということが出来ないんですが、こんなもんなんでしょうか。
全角文字含んだ行も普通に取れてるけど
unicodeか
939 :
デフォルトの名無しさん:2007/07/13(金) 13:45:51
ええ、ホントですか?
おかしいな、と思い新しいプロジェクトでテストしてみたら、本当ですね・・
ちゃんと10が返ってきてます・・・・おかしい、何かがおかしい、
すみませんでした。
940 :
デフォルトの名無しさん:2007/07/13(金) 13:47:40
ASSERT(sizeof(TCHAR) == sizeof(WCHAR));
942 :
デフォルトの名無しさん:2007/07/13(金) 14:22:02
943 :
デフォルトの名無しさん:2007/07/13(金) 14:31:53
944 :
デフォルトの名無しさん:2007/07/13(金) 14:32:33
>>943 はい、止まりました。マルチバイトだからですよね。
CEdit::LineLengthのソース見てみると単にEM_LINELENGTHをsendしてるだけ。
EM_LINELENGTHの方は
>the return value is the length, in TCHARs
って書いてあるから、MFCの方が間違ってるっぽい。
つーか、
>>939で解決、、、元質問者の勘違いでFAなのでは
947 :
936:2007/07/13(金) 16:15:39
CEdit::LineLengthがMBCSならばバイト数が返り、UNICODEなら文字数が返るのが普通なのは分かったんですが、
それでもなぜうちだとMBCSにも関わらず文字数が返るのかが分からなかったんです。
いろいろ調べたら、どうやらXPスタイルに問題があるようでした。
XPのSP2(もしかしたら他も)でビジュアルスタイルを適用していると、エディットボックスの挙動が変わるらしいです。
ビジュアルスタイルを外してテストしたらちゃんとバイト数が返ってきました。
でも古臭いのはイヤなので、改行コードやらなにやら自分で取得して一行単位の処理したいと思います。
一日中悩みました。
948 :
936:2007/07/13(金) 16:20:41
>>945 ソースまで見てくれてありがとうございました。
僕も見ましたが随分簡単なソースだったんですね。
Editコントロールは行単位で読み書きすると時間かかるから
読みたい行数が多い時はGetLine使わない方がいい
だからGetLine使わずに行処理する方法も考えることになる
だけどGetLineは行の正確なバイト数は知らなくてもいいだろ
バッファは大目に用意しとけばいいし
エディットコントロールの最大を超えることはないし
その発想はないわw
すいませんが質問です
CDialogBar内のコンボボックスでリターンキーを押下したときに
イベントを発生させたいのですが、
どうやってCDialogBar内のコンボボックスのリターンキー押下の
メッセージ拾えばいいですか?
>>952は自決しました
PreTranslateMessageでできました
スレ汚しスマソ
スレが血塗れに!
侍だな
今までMFCでダイアログベースのプログラムしか組んだことがありません
この度MDIのプログラムを作りたいのですが、SDIやMDIの場合リソースファイルを
自分で書かないといけないものなのですか?
ダイアログベースの場合はツールボックスからD&Dして作っていて簡単だったんですが
不便ですよね
MDIで何を作りたいの?
FormViewとか知らんの?
お恥ずかしい限りです、会社ではシリアル関係の実装ばかりやっていて
およそSDIやMDIは知らなくても出来たのでFormViewとか全くの無知です
やりたい事はMDIベースのダイアログからボタンを押したら
グラフのダイアログ(ビューかな?)やテキスト入力の出来るダイアログを出すことです
掲示板で聞かないとわからないようなことじゃないし
普通に勉強すればいいよ
>>959 サンクス
>>958の書込み読んでFormViewを検索して、SDIでもMDIでも新しいプロジェクトの作成から
基底クラスを良く考えて選べば出来そうですね余りにも同じようなプログラムばかり
組んだり改造しているんで世間知らずでしたww、よってこの質問は取り下げます
しね
もうくるな
そんな初心者追っ払うほどの話かなぁ・・・
MDIの話でもドキュメントテンプレートの理解までもってってくれる
入門書はみたことないしドキュメントテンプレート理解できないと結構ハマルと思うんだ、俺。
MDIってアプリの余白部分が無駄食ってしょうがないと思ってるの漏れだけ?
SDIやダイアログonlyのアプリで複数インスタンス立ち上げ可能な創りの方が合理的だろ
何で自分だけと思うんだろう・・・
このスレまだあったのかw
俺はとっくの昔にMFCなんてクズライブラリは見限って
C#とオブジェクト指向で楽チンなプログラミングライフを
送っているというのにお前らときたら大変だなw
同情を禁じ得ない。
いや、昔からの人は今はほとんど同じようなもんじゃない?
このスレにいるのは回答側にまわってるだけさ。
967 :
デフォルトの名無しさん:2007/07/24(火) 00:40:15
独自のDDVとDDXを定義するにはどうしたらよいのでしょうか?
CEditとかはWizardだとCStringとかにしか定義できません。
参考ページとかでもよいので教えてください。
968 :
デフォルトの名無しさん:2007/07/24(火) 01:00:20
すいませんほかにも
UpdateDataではすべてが更新されてしまいますが
コントロールを指定して一つ一つValidateするにはどうしたらよいでしょうか?
Failを呼び出すとメッセージボックスが出てきてしまいますが
これを独自のエラー表示とするにはどうしたらよいでしょうか?
(たとえばToolTipとかLavelに表示)
UpdateDataのソース読んだらわかりそうなものだけど、MSDNの解説読んだ?
>DDX_ プロシージャと DDV_ プロシージャの書き方、
>ClassWizard を拡張して独自のルーチンを使う方法についても説明します。
970 :
デフォルトの名無しさん:2007/07/26(木) 03:19:30
MFCってもう終わりなの?
VC6.0使いつづけて6年・・・
統合環境の中では軽い方だし最高なのに
MFCはともかく、VC6.0は終わりでいいと思う。
秀丸作者がVC5使ってるんじゃなかったっけ?
おれも
VC2002がすげー糞だったから、VC6.0を使い続けている人が多そうだな
俺的にはVC2005が割と良かったからそろそろバージョンアップしてもいいと思うが
2005 Expressと.NET Frameworkでいい気がしてきた
.NET使うならC#でいいだろ
どう考えても
VS2005MFCでダイアログベースのプログアムです、メインのダイアログのボタンを押すと、
別のダイアログが現れますそのダイアログにはリストボックス、OKボタン、キャンセルボタンが張り付けてあります、
そのリストボックスに、継承関係の無い別クラスから、ファイルを読み出しながら
SendMessage関数でデータを送出してリストボックスに表示させたいのですが可能でしょうか?
日本語でおk
非同期で処理するなら、別スレッドでファイルを読みつつ、
ダイアログ側はタイマーで随時その内容を取り込むって感じだな。
>>978サンクスです
非同期で行うとデータの取りこぼしとか起きないでしょうか?
SendMessage関数のならデータを投げて戻り値も見てるから大丈夫なのかな?
何がわからなくて質問してるかわっぱりわからん
たまたま思いついた方法が可能かどうかということ?
漠然と思いついたこと書かれてもイメージつかめない
MFCでSendMessage使うことなんかある?
apiを直に呼ぶ場合は別ね
>>980 すみません曖昧で、データを投げるダイアログのハンドルの取得方法が
分かんなくて困っています、あとその上に貼っているリストボックスのハンドルの
取得方法も教えていただけないでしょうか、宜しくお願いします
>>981 MFCではSendMessageは使わないものなの、となると
MFCでは一般的にはどんな風に行うのでしょうか?
>>982 >データを投げるダイアログのハンドルの取得方法
メインダイアログに問い合わせる
(全く他所からなら AfxGetMainWnd()->SendMessage()とかで )
>その上に貼っているリストボックスのハンドルの取得方法
リストボックス貼っているダイアログに、これまたSendMessageで問い合わせる
32bit vistaのVS2005 stdで組んでいます。
OnNewDocument()でメッセージを表示したいのですが、コンパイル時に定義がない旨の
エラーが出てます。何が悪いのでしょうか。
該当部分は、こんなコードです。
CHogeDoc::OnNewDocument(){
if (中略
AfxMessageBox("ここでファイルを読み込みます"); //定義がどうこう言われてエラーが出る。
return TRUE;
}
表示されるエラーです。
hogedoc.cpp(42): error C2665: 'AfxMessageBox' : 2 オーバーロードのどれも、すべての引数の型を変換できませんでした
afxwin.h(5031): 'int AfxMessageBox(LPCTSTR,UINT,UINT)' の可能性があります。
afxwin.h(5033):または 'int AfxMessageBox(UINT,UINT,UINT)'
ちなみに、AfxMessageBox("ここでファイルを読み込みます",MB_OK)もダメでした。
TEXTマクロかL使えば?
>983
普通はCDialogとCListBox 使うと思う
そういう話ではない
CBitmapについての質問です。
VC2005、WinXPProを使用しています。
BITMAP stBitmap;
::ZeroMemory(&stBitmap, sizeof(stBitmap));
stBitmap.bmBits = pBuf; //ビットマップデータ(これはあってることを確認してます。)
stBitmap.bmBitsPixel = 24;
stBitmap.bmPlanes = 24;
stBitmap.bmWidth = nWidth;
stBitmap.bmHeight = nHeight;
CBitmap* pBitmap = new CBitmap();
VERIFY(pBitmap->CreateBitmapIndirect(&stBitmap));
return pBitmap;
ってな感じの関数を作って動かしているのですが、VERIFYのところで、とまってしまいます。
つまり、CreateBitmapIndirectが失敗しているらしいのです。
どうして、失敗しているのか確認する手段はないでしょうか?
よろしくお願いします。
991 :
986:2007/07/31(火) 06:09:36
あれっ?
麻雀格闘倶楽部のスレじゃないの?
plane=24はすげーな。
16色の時はbppが1でplaneが4のやつがあったなあ・・・
今更だがCControlBar派生のカスタムコントロールバーができたヽ(´∀`)ノ
なんでも入るしマウスでサイズ変更も自在うひょ
.・・・やっぱ.NETのが楽だな、重いけど(゚д゚)