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がまだ良く分かっていない初心者です。宜しくお願いいたします。
MFCのソースコードを見ると、CFormViewもダイアログ生成APIを使って生成されているようです。
なので、コンボボックス等の載っているダイアログのハンドルが欲しければ、CFormView のハンドルで良いです。
具体的には m_hWnd です。(GetSafeHwnd()を経由しても良いですが)
以下の例では、CFormView 上のボタン(でなくても良いけど)のハンドルを取得し、ボタンのテキストを変更してます。(無理やりな例でごめんなさい)
HWND hwndButton = ::GetDlgItem(m_hWnd, IDC_BUTTON1);
::SetWindowText(hwndButton, "hoge");
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を間違えているか、忘れているのでしょうか?
宜しくお願いします。
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
Blueさん いつも有難うございます。
HWND hCombo = this->GetDlgItem(IDC_COMBO1)->GetSafeHwnd();
と書いても同じように取れました。
::はグローバルな関数のときに使うのですか。 まだこの辺が良く分かっておりません。
なお、CALLBACK関数の中でAddStringを使うと何故かエラーとなってしまいましたので、Direct Xのサンプル通りにするためにハンドル取得が必要でした。C++2005の文法でやさしくて判りやすい本のお勧めお教えくだされば幸いです。
今持っていますのは、林晴彦さんのC++2005明快入門のビギナー編とシニア編でして、基本的な文法が良く分からず本に書いてあるのを拾い集めてプログラムしています。
ちなみに、恥ずかしながら、私が作っているプログラムは私のブログ(上記ホームページ)を、お暇なときにご覧下さい。皆様、有難うございました。今日は、この続きのプログラムに挑戦します。
お陰で、旨くサウンドカードの列挙がコンポボックスに表示されました。
今度は、列挙されたのを指定するプログラムに取り掛かります。
有難うございました。
>C++2005の文法でやさしくて判りやすい本のお勧めお教えくだされば幸いです。
文法がよく分からないということであれば、Visual C++の解説本ではなく、
C++言語自体の書籍で勉強する必要があります。
C++が分からないことにはMFCやDirectXを使いこなすことはできません。
紅輝さんがお持ちの本はVisual C++の解説本なので、文法の解説はないと思います。
↓ここにC++関連書籍の紹介があります。
http://proger.blog10.fc2.com/blog-entry-35.html
この中で初心者向けは「独習C++」だけです。それ以外は、中級者以上向けです。
「独習C++」は初心者向けの定番のようですが私は読んだことがありません。
isshiさん
どれもこれも難しそうな本ですね。
インターネットで見ても、内容が良く分からなかったので、今度、大きな書店で、じっくり探してみます。
情報有難うございました。
ツイート | ![]() |