- ベストアンサー
MFCでのウィンドウ生成
http://www7.plala.or.jp/bunpan/htmldata/program/mfc/fol_001/mfc00112.html ここにMFCによるウィンドウ生成方法が載っています。 クラスを定義して、MyCreate() をコールすることで、ベタなウィンドウを作成できますよ。とありますが、引数UINT nIDは何を与えれば良いのでしょうか? ************************* int CxxxWnd::MyCreate( dwStyle, rect, pParentWnd, nID, pContext ); DWORD dwStyle; // (I) 作成するウィンドウのスタイルを指定してね。 const RECT ▭ // (I) 作成するウィンドウのサイズを指定してね。(参照受け渡し) CWnd *pParentWnd; // (I) 親ウィンドウのクラスのオブジェクトのアドレスを指定してね。 UINT nID; // (I) ID を指定します。 CCreateContext *pContext; // (I) ウィンドウの作成コンテキスト。(NULL でいーんじゃん?)
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
IDはウィンドウを識別するための値です。MFCではウィンドウハンドルであるHWNDをラッピングしていますが、ウィンドウ生成時に割り当てたIDからウィンドウをハンドルを取得したりできます。 任意の値を指定してもいいと思いますが、0とか1はダイアログなどでキャンセルボタンとOKボタンに割り当てるのが一般的なので、100とか、1000とかでいいと思います。 生成されたウィンドウの子ウィンドウとかは別のIDにすれば問題ありません。 たとえば、 トップウィンドウ - ボタン1 - ボタン2 のようにトップウィンドウの子ウィンドウにボタンを2つ生成する場合は、 トップウィンドウのID : 1000 ボタン1のID : 1100 ボタン2のID : 1101 とかです。 ボタン1とボタン2を同じIDで生成することも可能ですが、イベントなどはIDを元に送られてくることもありますので、お勧めできません。 あとで、トップウィンドウからボタン1を無効化したいときは、GetDlgItemにボタン1のIDを指定して GetDlgItem(1100)->EnableWindow(FALSE); とすることが可能です。
その他の回答 (5)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>>#ヘルプを見る癖をつけましょうね。 >今回の事例の場合は、まさにヘルプのどこを見よと言われているのでしょうか? コードそのものについては、ヘルプのどこというより、C++の考え方そのものなので、文法をしっかり理解していくしかないでしょうね。 MFCを使い込んでいくのであれば、C++をしっかり勉強する必要があります。 MFCについて理解を深めるのはそれからでも遅くありません。 なんで、ヘルプを見てほしいのは、 >引数UINT nIDは何を与えれば良いのでしょうか? というところですね。 MyCreateの引数は、そのまま参考urlのCWnd::Createに渡しています。 で、ヘルプには、nIDに関して”子ウィンドウの ID を指定します。” という記述があります。 これを見ていたら”子ウィンドウのIDってなに?”て質問になりませんか? せっかくCreateをCreateExに変えるようなコードに変更されてるようですし。”引数になにを与えれば良いか良く分かりません。”なんていわないでくださいね。 ここまで自分は認識しているよっていうのが質問文から読み取ることができれば、より適切な回答が多くの人からもらえると思いますよ。
お礼
回答ありがとうございます。 以後気をつけたいと思います。
- darksky
- ベストアンサー率66% (38/57)
いきなりヘルプを読んでも理解するのには時間がかかります。 以下のような書籍をお読みになった方がよろしいかと思います。 http://www.ascii.co.jp/books/detail/4-7561/4-7561-1749-X.html MFCによるWindowsプログラミング http://www.ascii.co.jp/books/detail/4-7561/4-7561-2174-8.html Inside Visual C++ Version 5
お礼
回答ありがとうございます。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>問題ありのコード >CMyWnd p_MyWnd; > >p_MyWnd.MyCreate2(); >解決したコード >CMyWnd *p_MyWnd; >p_MyWnd=new CMyWnd; >p_MyWnd->MyCreate2(); 両方とも問題ありです。 上のほうのコードでは、これを呼び出している、関数が終了すると、CMyWndのインスタンスが自動的に破棄されるためにすぐに消えてしまいます。 下のほうのコードですと、newで作成しているので関数が終了してもインスタンスは消えないのですが、今度は逆にdeleteをすることが出来ません。メモリリークを起こすことになります。 解決方法としては、一番手っ取り早いのは CMyWnd p_MyWnd を呼び出し元のクラスのメンバ変数にすることです。 #ヘルプを見る癖をつけましょうね。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_mfc_cwnd.3a3a.create.asp あと、サンプルはあくまでもサンプルなので100%鵜呑みにしないように。MSのヘルプでも。
お礼
回答ありがとうございます。 確認したところメモリリークを起こしてました。 (始めてメモリリークの確認ということをやりました) >#ヘルプを見る癖をつけましょうね。 今回の事例の場合は、まさにヘルプのどこを見よと言われているのでしょうか? 元々ヘルプは見た上で質問しているのですが、まだレベルが低いので、何を言わんとされているのかが分かりません。 よろしくお願いします。
- darksky
- ベストアンサー率66% (38/57)
親ウィンドウのポインタですが、自分のプログラム中のメインウィンドウなら通常はNULLです。 CMyWnd *p_MyWnd; p_MyWnd=new CMyWnd; p_MyWnd->MyCreate2(); このウィンドウにボタンを貼り付けたい場合は、 CButtonクラスのCreateを呼び出しますが、その時の親の指定方法は、p_MyWnd か CMyWndクラスのメンバ関数中に呼び出すのであれば、thisと記述できます。 親の指定はこんな感じです。 プログラム中のはじめてのメインウィンドウの親はNULL、 メインウィンドウに子ウィンドウを作るときの親はメインウィンドウです。 親ウィンドウのポインタの取得方法ですが、子ウィンドウが親ウィンドウのポインタを取得するには、 CWndクラスのGetParent()を呼び出します。CWndから派生したクラス中からのみ利用できます。
お礼
回答ありがとうございます。 thisを使えば良さそうです。
- darksky
- ベストアンサー率66% (38/57)
1.ウィンドウは生成されますが、一瞬で消えてしまいます。どうしてなのでしょうか? このコードはどこに記述していますか? CWinApp::InitInstanceなら戻り値をTRUEにする必要があります。 2.pParentWndとpContextには何を与えれば良いのでしょうか? pParentWndは、親のウィンドウのCWnd方のポインタ です。無ければNULLでもOKです。 pContextは通常NULLでもいいですよ。基本的な問題を解決してからマニュアルを読んでください。 http://www7.plala.or.jp/bunpan/htmldata/program/mfc/fol_001/mfc00112.html のサイトで紹介されている例は、通常MFCで開発する場合はあまり使う方法ではありません。 通常のMFCの場合は、CFrameWndの派生クラスがメインウィンドウになります。また、CWndからの派生クラスなども作成しますが、これらは子ウィンドウとして作成するのが普通です。 低レベルの処理の仕方を知っておくことはいいと思いますが、MFCでプログラムを記述するなら、MFCの基本的なウィンドウの作成方法から勉強したほうがいいと思います。
お礼
darkskyさん 何度もありがとうございます。 今、ウィンドウの生成についていろいろなパターンを勉強しています。 今回の一瞬で消えてしまう問題はようやく解決しました。 問題ありのコード CMyWnd p_MyWnd; p_MyWnd.MyCreate2(); 解決したコード CMyWnd *p_MyWnd; p_MyWnd=new CMyWnd; p_MyWnd->MyCreate2(); >pParentWndは、親のウィンドウのCWnd方のポインタです。 最後に教えてほしいのですが、親ウィンドウのポインタはどうすれば取得出来るのですか? よろしくお願いいたします。
補足
お礼のを投稿した後で気になったので調べたのですが、 問題ありのコードでも、文法的には問題ない?と思うのですが、どうなのでしょうか?
お礼
回答ありがとうございます。 ************************** // ウィンドウを作成します。 check = Create( (LPCTSTR) UNIQUE_WND_CLASS_NAME, (LPCTSTR) NULL, dwStyle, rect, pParentWnd, nID, pContext ); ************************** 教えて頂いたことは分かりましたが、pParentWnd,nID,pContextの nID以外もなにを与えれば良いか良く分かりません。 とりあえず、NULL,NULL,NULLとしましたが、Createではエラーが出たため、 check = CreateEx( dwExStyle, (LPCTSTR) UNIQUE_WND_CLASS_NAME, _T("Test window"), dwStyle, rect, NULL, NULL, NULL); としました。 1.ウィンドウは生成されますが、一瞬で消えてしまいます。 どうしてなのでしょうか? 2.pParentWndとpContextには何を与えれば良いのでしょうか? 以上、2点についてよろしくお願いいたします。