コンボボックスのハンドルを取得するには

解決


紅輝  2007-04-04 21:02:06  No: 64846

VC++ 2005 MFC フォームビュー形式の画面にコンボボックスを貼り付けています。
Direct X SDKサンプルのenumdevice.cppを参考にしてサウンドカードの列挙と設定を行いたいのですが、
HWND hSoundDeviceCombo = GetDlgItem(hDlg, IDC_SOUND_DEVICE_COMBO);
に記載されているhDlgの設定が良く分かりません。  
Direct Xサンプルでは、ダイアログ形式でして、
INT_PTR CALLBACK MainDlgProc(HWND hDlg, UNIT msg, WPARAM wParam, LPARAM IParam);
のように、どうやらWinMainの
DialogBox(hInst, MAKEINTRESOURCE(IDD_MAIN), NULL, MainDlgProc);
から呼ばれているようです。
フォームビュー形式の場合は何処に、どのように設定するのでしょうか?
HWNDがまだ良く分かっていない初心者です。宜しくお願いいたします。


kuronuko  2007-04-05 02:10:17  No: 64847

MFCのソースコードを見ると、CFormViewもダイアログ生成APIを使って生成されているようです。
なので、コンボボックス等の載っているダイアログのハンドルが欲しければ、CFormView のハンドルで良いです。
具体的には m_hWnd です。(GetSafeHwnd()を経由しても良いですが)

以下の例では、CFormView 上のボタン(でなくても良いけど)のハンドルを取得し、ボタンのテキストを変更してます。(無理やりな例でごめんなさい)
HWND hwndButton = ::GetDlgItem(m_hWnd, IDC_BUTTON1);
::SetWindowText(hwndButton, "hoge");


紅輝  2007-04-05 17:52:55  No: 64848

kuronukoさん  ご連絡有難うございます。
::OnInitialUpdate(HWND m_hWnd)関数の中に、
HWND hSoundDwviceCombo = GetDlgItem(m_hWnd, IDC_COMBO1); 
を書き込んで、デバッグしてみると、
error C2664: 'void CWnd::GetDlgItem(int,HWND *) const' : 1 番目の引数を 'HWND' から 'int' に変換できません。(新しい機能 ; ヘルプを参照)
1>        この変換が可能なコンテキストはありません。と表示されました。
なお、OnInitialUpdate()としても同じでした。
この1ヶ月、あれこれ試していると、このエラー表示が出ることがありました。何か#includeを間違えているか、忘れているのでしょうか?
宜しくお願いします。


Blue  2007-04-05 18:03:07  No: 64849

MFCの場合、ダイアログクラスから単に
GetDlgItem等を呼び出すと、

CWnd::GetDlgItem

がよばれると解釈されます。
Win32APIを呼び出すのであれば、グローバルな関数と解釈させるために
頭に :: を着けるとよいでしょう。
(つうか、kuronuko さんのコードは::がついているやんけ。)

> HWND hSoundDwviceCombo = GetDlgItem(m_hWnd, IDC_COMBO1); 
HWND hSoundDwviceCombo = ::GetDlgItem(m_hWnd, IDC_COMBO1); 

ただ、CWnd::GetDlgItemの内部でも似たようなことをしているので

HWND hCombo = this->GetDlgItem(IDC_COMBO1)->GetSafeHwnd();

で同じ値が取れるかと思います。
ただ、本当にHWNDの値が必要なのでしょうか?
CWnd::GetDlgItemからCComboBox*の値を取得すれば十分そうですが。

CComboBox* pCombo = static_cast<CComboBox*>(this->GetDlgItem(IDC_COMBO1));

// 例
pCombo->AddString(_T("ほげ"); // コンボボックスのリストに追加

[MSDN]CComboBox
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/_mfc_ccombobox.asp


紅輝  URL  2007-04-05 18:46:48  No: 64850

Blueさん  いつも有難うございます。
HWND hCombo = this->GetDlgItem(IDC_COMBO1)->GetSafeHwnd();
と書いても同じように取れました。
::はグローバルな関数のときに使うのですか。  まだこの辺が良く分かっておりません。
なお、CALLBACK関数の中でAddStringを使うと何故かエラーとなってしまいましたので、Direct Xのサンプル通りにするためにハンドル取得が必要でした。C++2005の文法でやさしくて判りやすい本のお勧めお教えくだされば幸いです。
今持っていますのは、林晴彦さんのC++2005明快入門のビギナー編とシニア編でして、基本的な文法が良く分からず本に書いてあるのを拾い集めてプログラムしています。
ちなみに、恥ずかしながら、私が作っているプログラムは私のブログ(上記ホームページ)を、お暇なときにご覧下さい。皆様、有難うございました。今日は、この続きのプログラムに挑戦します。


紅輝  2007-04-05 20:43:27  No: 64851

お陰で、旨くサウンドカードの列挙がコンポボックスに表示されました。
今度は、列挙されたのを指定するプログラムに取り掛かります。
有難うございました。


isshi  2007-04-06 01:34:59  No: 64852

>C++2005の文法でやさしくて判りやすい本のお勧めお教えくだされば幸いです。
文法がよく分からないということであれば、Visual C++の解説本ではなく、
C++言語自体の書籍で勉強する必要があります。
C++が分からないことにはMFCやDirectXを使いこなすことはできません。
紅輝さんがお持ちの本はVisual C++の解説本なので、文法の解説はないと思います。

↓ここにC++関連書籍の紹介があります。
http://proger.blog10.fc2.com/blog-entry-35.html

この中で初心者向けは「独習C++」だけです。それ以外は、中級者以上向けです。
「独習C++」は初心者向けの定番のようですが私は読んだことがありません。


紅輝  2007-04-07 05:58:51  No: 64853

isshiさん
どれもこれも難しそうな本ですね。
インターネットで見ても、内容が良く分からなかったので、今度、大きな書店で、じっくり探してみます。
情報有難うございました。


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

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






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