• ベストアンサー

ウィンドウハンドルの取得方法について

よろしくお願いします。 WIN98 VC++6.0 MFC にて 色々勉強しておりますが、今だにウィンドウハンドルの取得方法が良く分かりません。 SDKのサンプルを見ると、なるほどそうするのか。と思いますが、MFCになると分からなくなります。 たとえば、 ウィザードのデフォルトに従いダイアログベースでのプロジェクトを作成し、ボタン1と2を配置します。 以下のコードでボタン1を非表示にできます。 void CPppDlg::OnButton2() { CWnd* pButton1 = GetDlgItem (IDC_BUTTON1); pButton1->ShowWindow(SW_HIDE); } このコードにおいて、 1.SDKの BOOL ShowWindow( HWND hWnd, // handle to window int nCmdShow // show state of window ); を用いて引数が2個の形式に書きかえることは可能でしょうか? 2.可能であれば、具体的にはどう記述すれば良いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • darksky
  • ベストアンサー率66% (38/57)
回答No.1

void CPppDlg::OnButton2() { HWND hButtonWnd; hButtonWnd = ::GetDlgItem(m_hWnd, IDC_BUTTON1); ::ShowWindow(hButtonWnd, SW_HIDE); } か void CPppDlg::OnButton2() { CWnd* pButton1 = GetDlgItem (IDC_BUTTON1); ::ShowWindow(pButton1->m_hWnd, SW_HIDE); } CWnd::m_hWndは、HWNDを格納するめの変数です。

VitaminBB
質問者

お礼

回答ありがとうございます。 自分でトライした時は、::が抜けていたことが、うまく行かなかった原因の一つでした。 教えていただいたコードをみて、少し理解が進んだと思います。 続けて申し訳ないのですが、以下のような場合は益々手におえず教えて頂きたいのですが。 CSetDlgのボタンの押下で以下のように記述して、CTestDlgを表示させる場合、 CTestDlg* ctDlg = new CTestDlg; ctDlg->Create(CTestDlg::IDD, this); ctDlg->ShowWindow(SW_SHOW); 1.この時、thisはCSetDlgを指しており、CTestDlgの親はCSetDlgで良いのでしょうか? 2.また、thisをNULLにした場合、CTestDlgからCSetDlgのハンドルを取得するにはどうすれば良いのでしょうか? (親子関係が無いため取得出来ないように思えるのですが) どうかよろしくお願いいたします。 小生明日から帰省します。 行き違いになりお礼が遅れたら申し訳ありません。

その他の回答 (3)

  • darksky
  • ベストアンサー率66% (38/57)
回答No.4

質問いただいた件は、gimmickさんがコメントした通りです。 MFCの場合は、C+SDKで直接APIを呼び出した場合と違う動作が実装されていることもあります。 ドキュメントを読んでも意味がわからないことが多いですが、 ctDlg->Create(CTestDlg::IDD, this); でブレークポイントを設定して、ステップ実行でMFCのソースを確認してみるといいかもしれません。

VitaminBB
質問者

お礼

回答ありがとうございます。 MFCのコードが山ほど実行されているのが確認できました。 本当にありがとうございました。

VitaminBB
質問者

補足

MFCになると、急にウィンドウハンドルが分からなくなることに対する答えの1つとして、良いサイトを見つけたので、自分および同じ悩める人のために載せておきます。 http://www.kab-studio.biz/Programing/PragmaTwice/Main/033.html

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.3

#2です。 >1.この時、thisはCSetDlgを指しており、CTestDlgの親はCSetDlgで良いのでしょうか? CSetDlgもCTestDlgもクラスなのでこの表現は正しくありません。「ctDlgの親ウィンドウが作成元のCSetDlgのインスタンスである」という事でしたら、そのとおりだと思います。 >2.また、thisをNULLにした場合、CTestDlgからCSetDlgのハンドルを取得するにはどうすれば良いのでしょうか? CDialog::Create()の第2引数についてですが、MSDNによると「NULL を指定すると、ダイアログ オブジェクトの親ウィンドウはメイン アプリケーション ウィンドウになります。」とあります。なので、CSetDlgのインスタンスがメインウィンドウだった場合は親ウィンドウとして取得できます。そうでない場合は、多分取得できません。そういう場合は、CTestDlgのメンバ変数を追加してウィンドウハンドルかウィンドウオブジェクトのポインタを保持しておけばよいと思います。

VitaminBB
質問者

お礼

回答ありがとうございます。 ウィンドウハンドルに関して、今具体的に困っていることが有るわけでは無いので、漠然とした質問しか出来なく申し訳ありません。 今回色々教えていただき、少しずつですが理解できたと思います。 今後ともよろしくお願いいたします。

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.2

CWnd::GetSafeHwnd()でウィンドウハンドルを取得できます。具体的なコードは以下のようになります。(わかりやすさのため、多少冗長にしています。) 例1 HWND hWnd = this->GetSafeHwnd(); HWND hWndButton1 = ::GetDlgItem(hWnd, IDC_BUTTON1); ::ShowWindow(hWndButton1, SW_HIDE); 例2 CWnd* pButton1 = this->GetDlgItem(IDC_BUTTON1); HWND hWndButton1 = pButton1->GetSafeHwnd(); ::ShowWindow(hWndButton1, SW_HIDE);

VitaminBB
質問者

お礼

回答ありがとうございました。 #1さんと同時に回答を頂きましたので、#1さんのお礼に追加質問させていただきました。 そちらにも目を通していただけると大変助かります。 明日より帰省しますので、回答のお礼が遅くなりましたら申し訳ありません。

関連するQ&A