ComboBoxのEditBoxへのキー入力判定

[戻る]
sunyopu 2002/03/26(火) 10:37:45
CFormViewの子コントロールであるCComboBoxのEditBox部分に対する
キー入力をアプリケーション側で処理したいのですが、それがうまくいきません。

環境は、VC++6.0で、MFCを使用しています。

作業手順は、
リソースエディタで FormView表示の元になるダイアログ、ComboBoxを作成。
ClassWizerdで、Windowメッセージハンドラを追加。
(MFCプログラミングのオーソドックスな手法のみ使用している)

EditBoxに対するEnterキー入力を処理したいのですが、
ClassWizerdで、ComboBoxコントロールに対する WM_CHAR や WM_KEYDOWN の
メッセージハンドラを追加しプログラムを実行後、実際にキー入力しても
それらのハンドラがコールされません。

同じFormView上にあるCListBoxコントロールでは、上記がうまくいくのですが...

よろしくお願いします。

不良PG 2002/03/26(火) 11:27:27
まず自分でエディットボックスクラス(CEdit)の派生クラスを作ります。

コンボボックスから子ウインドウであるエディットボックスを取得して
自分で作った用意したエディットボックスクラス派生クラスで取得したエディットボックスを
サブクラス化してあげて、派生クラスでWM_CHAR や WM_KEYDOWNを処理すれば良さそうです。

ただ、これは、ドロップダウンコンボボックス限定です。

参考メンバ関数
CWnd::GetWindow(GW_CHILD)
CWnd::SubclassWindow(...)
CWnd::GetSafeHwnd()

Bun 2002/03/26(火) 11:47:08
サブクラス化してはいかがでしょうか。
コンボがドロップダウンスタイルであれば
エディットはコンボの子ウィンドウで取得できたと思います。

コードはOnCreateあたりに記述すればよろしいでしょうか。

CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);
CWnd *pWnd = pCombo->GetWindow(GW_CHILD);

m_wndEdit.SubclassWindow(pWnd->m_hWnd);

m_wndEdit はViewのメンバでCEditの派生クラス

はずしていたらゴメンナサイ。(試していません)

Bun 2002/03/26(火) 11:48:47
すんません、思いっきりかぶりましたぁ〜。(^^;

不良PG 2002/03/26(火) 11:57:17
かぶるのは、仕方ない気がします・・
私も良くかぶりますし・・・(^^;

Bun 2002/03/26(火) 12:22:13
>かぶるのは、仕方ない気がします・・
>私も良くかぶりますし・・・(^^;

フォローありがとうございます。
内容が一致していてよかったっす。(^^;

>CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);
>CWnd *pWnd = pCombo->GetWindow(GW_CHILD);

ついでなんで、キャストは不要ですねェ。>わし
このほうが楽かな?
CWnd* pParent = GetDlgItem(IDC_COMBO1);
CWnd* pWnd = pParent->GetWindow(GW_CHILD);

sunyopu 2002/03/28(木) 10:44:24
ご回答、ありがとうございます。

お教え頂いた方法で、EditBox部分の WM_CHAR、WM_KEYDOWN 
メッセージ処理ができるようになりました。

ただ、Enterキーの入力に対しては、WM_CHAR、WM_KEYDOWN
のメッセージハンドラがコールされません。

自分が実装したい処理というのは、EditBox部分に数値を
入力後、Enterキー入力で他のウィンドウ表示を入力値に
合わせてリフレッシュするというものです。

たびたびですが、よろしくお願いします。

Bun 2002/03/28(木) 10:51:20
ES_WANTRETURN スタイルは関係ありませんか?

不良PG 2002/03/28(木) 11:28:25
最終手段です

CWnd::PreTranslateMessage
でWM_KEYDOWNをトラップすればいいのでは・・

Bun 2002/03/28(木) 11:59:52
>最終手段です

IsDialogMessage()で処理されちゃうんですね。多分。

やっぱ、プレトラ(PreTra...)しかないんでしょうか?

sunyopu 2002/03/29(金) 10:04:41
[[解決]]
お教えいただいた方法で、Enterキーの入力を
検知することができました。

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

古いスレッドには追加発言できません。