.m_hWndとGetDlgItem()で取得したハンドル

解決


KISKE  2006-02-18 21:28:31  No: 60788

.m_hWndに格納されている値って
そのコントロールのハンドルではないのでしょうか?
ここの過去ログに
"コンボボックスのハンドルは(CComboBoxクラス).m_hWnd"
って書いてあったのですが、
GetDlgItem()で取得したハンドルと一致しないので・・・

そもそも .m_hWnd  って何が入っているんでしょうか?

初歩的な質問ですみません。
ちなみに環境はVC2003です。


RAPT  2006-02-18 23:07:53  No: 60789

> GetDlgItem()で取得したハンドルと一致しないので・・・
どうやって調べました?
# 見た感じ、MFC不使用、かな?

SDK+WTLで、
  CComboBox m_cmb;
  m_cmb = GetDlgItem(IDC_COMBO1);
  ATLASSERT( m_cmb.m_hWnd == GetDlgItem(IDC_COMBO1) );
ってな感じ?


KISKE  2006-02-19 05:39:43  No: 60790

SDKでもMFCでもやってみました。

MFCの場合はこんな感じで
CString tes1;
CString tes2;

tes1.Format("GetDlgItem = %d",GetDlgItem(IDC_COMBO1));
tes2.Format("m_hWnd = %d",m_cbo_main.m_hWnd);

AfxMessageBox(tes1);
AfxMessageBox(tes2);

ぜんぜん違う値なんですよねぇ。
なんなんでしょうか・・・


επιστημη  2006-02-19 05:50:26  No: 60791

そのGetDlgItem()がCWndから(直接/間接的に)導出されたクラスのメソッド内で呼ばれたものなら違って当然です。
CWnd::GetDlgItem()は CWnd* を返します。 HANDLEではありません。


RAPT  2006-02-19 11:21:48  No: 60792

そう、だから、環境が重要。VC++6/ATL3.0の場合、
ATL::CWindow::GetDlgItem() は HWND 型ですし。

MFCの場合、CWnd::GetSafeHwnd() を調べてみてください。


KISKE  2006-02-20 07:06:31  No: 60793

なるほど!
理解が浅すぎました。

ありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加