CFormViewの子コントロールであるCComboBoxのEditBox部分に対する
キー入力をアプリケーション側で処理したいのですが、それがうまくいきません。
環境は、VC++6.0で、MFCを使用しています。
作業手順は、
リソースエディタで FormView表示の元になるダイアログ、ComboBoxを作成。
ClassWizerdで、Windowメッセージハンドラを追加。
(MFCプログラミングのオーソドックスな手法のみ使用している)
EditBoxに対するEnterキー入力を処理したいのですが、
ClassWizerdで、ComboBoxコントロールに対する WM_CHAR や WM_KEYDOWN の
メッセージハンドラを追加しプログラムを実行後、実際にキー入力しても
それらのハンドラがコールされません。
同じFormView上にあるCListBoxコントロールでは、上記がうまくいくのですが...
よろしくお願いします。
まず自分でエディットボックスクラス(CEdit)の派生クラスを作ります。
コンボボックスから子ウインドウであるエディットボックスを取得して
自分で作った用意したエディットボックスクラス派生クラスで取得したエディットボックスを
サブクラス化してあげて、派生クラスでWM_CHAR や WM_KEYDOWNを処理すれば良さそうです。
ただ、これは、ドロップダウンコンボボックス限定です。
参考メンバ関数
CWnd::GetWindow(GW_CHILD)
CWnd::SubclassWindow(...)
CWnd::GetSafeHwnd()
サブクラス化してはいかがでしょうか。
コンボがドロップダウンスタイルであれば
エディットはコンボの子ウィンドウで取得できたと思います。
コードはOnCreateあたりに記述すればよろしいでしょうか。
CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);
CWnd *pWnd = pCombo->GetWindow(GW_CHILD);
m_wndEdit.SubclassWindow(pWnd->m_hWnd);
m_wndEdit はViewのメンバでCEditの派生クラス
はずしていたらゴメンナサイ。(試していません)
すんません、思いっきりかぶりましたぁ~。(^^;
かぶるのは、仕方ない気がします・・
私も良くかぶりますし・・・(^^;
>かぶるのは、仕方ない気がします・・
>私も良くかぶりますし・・・(^^;
フォローありがとうございます。
内容が一致していてよかったっす。(^^;
>CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);
>CWnd *pWnd = pCombo->GetWindow(GW_CHILD);
ついでなんで、キャストは不要ですねェ。>わし
このほうが楽かな?
CWnd* pParent = GetDlgItem(IDC_COMBO1);
CWnd* pWnd = pParent->GetWindow(GW_CHILD);
ご回答、ありがとうございます。
お教え頂いた方法で、EditBox部分の WM_CHAR、WM_KEYDOWN
メッセージ処理ができるようになりました。
ただ、Enterキーの入力に対しては、WM_CHAR、WM_KEYDOWN
のメッセージハンドラがコールされません。
自分が実装したい処理というのは、EditBox部分に数値を
入力後、Enterキー入力で他のウィンドウ表示を入力値に
合わせてリフレッシュするというものです。
たびたびですが、よろしくお願いします。
ES_WANTRETURN スタイルは関係ありませんか?
最終手段です
CWnd::PreTranslateMessage
でWM_KEYDOWNをトラップすればいいのでは・・
>最終手段です
IsDialogMessage()で処理されちゃうんですね。多分。
やっぱ、プレトラ(PreTra...)しかないんでしょうか?
お教えいただいた方法で、Enterキーの入力を
検知することができました。
ありがとうございました。