ComboBoxのEditBoxへのキー入力判定 – プログラミング – Home

通知
すべてクリア

[解決済] ComboBoxのEditBoxへのキー入力判定


sunyopu
 sunyopu
(@sunyopu)
ゲスト
結合: 23年前
投稿: 68
Topic starter  

CFormViewの子コントロールであるCComboBoxのEditBox部分に対する
キー入力をアプリケーション側で処理したいのですが、それがうまくいきません。

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

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

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

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

よろしくお願いします。


引用未解決
トピックタグ
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

まず自分でエディットボックスクラス(CEdit)の派生クラスを作ります。

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

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

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


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

サブクラス化してはいかがでしょうか。
コンボがドロップダウンスタイルであれば
エディットはコンボの子ウィンドウで取得できたと思います。

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

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

m_wndEdit.SubclassWindow(pWnd->m_hWnd);

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

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


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

すんません、思いっきりかぶりましたぁ~。(^^;


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

かぶるのは、仕方ない気がします・・
私も良くかぶりますし・・・(^^;


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

>かぶるのは、仕方ない気がします・・
>私も良くかぶりますし・・・(^^;

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

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

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


返信引用
sunyopu
 sunyopu
(@sunyopu)
ゲスト
結合: 23年前
投稿: 68
Topic starter  

ご回答、ありがとうございます。

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

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

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

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


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

ES_WANTRETURN スタイルは関係ありませんか?


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

最終手段です

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


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

>最終手段です

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

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


返信引用
sunyopu
 sunyopu
(@sunyopu)
ゲスト
結合: 23年前
投稿: 68
Topic starter  

お教えいただいた方法で、Enterキーの入力を
検知することができました。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました