編集終了したコンボボックスのハンドルを取得するには?
環境 VC6,WinXP SP2
複数あるコンボボックスとエディットボックスで構成されたダイアログボックスが
あり、メッセージループでRETのメッセージが流れてきたら、どのコンボから来
たかを判定し、コンボボックスの入力値をエディトボックスにセットするコードを
検討しています。
そこで、RETがどのコンボボックスから来たかを判定しようとしてい
ますが、うまく行きません。 どなたがご伝授いただきたい。
1.GetDlgItemでコンボボックスのhWndを取得(cbohWnd)。
2.GetFocus()で編集中のhWndを取得(EdithWnd)
3.GetParent(EdithWnd)で親ウィンドウを取得しようとしますが、
このコードはコンパイル時に「不正な引数」ということでエラーになり
ます。
WM_COMMAND CallBackは
BOOL TSendDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl)
としています。
※他作の物を使いやすいようにアレンジしていますが、ハンドラがウィザード
を使って作成されていないので、VC初心者の私では、うまく行きませ
んでした。
てことはMFCじゃないってこと?
メッセージループだったらMSG構造体にウィンドウハンドルがあるけど。
>2.GetFocus()で編集中のhWndを取得(EdithWnd)
これだと(EdithWnd)にフォーカスがあることになる。
>RETがどのコンボボックスから来たか
そもそも
>RETのメッセージ
って何?
既にフォーカスとかが(EdithWnd)に移動してしまった後で
どこから送られた通知かどうかは
RETのメッセージにそういうパラメタがないのならば
受け取り側ではどう頑張っても判らないんじゃないの。
推測で回答するけど
コンボボックスを操作して変更があったらエディットコントロールに文字を入れる
ということをしたいなら
ユーザが操作するならそのコンボボックスにフォーカスが当たっているはず。
コンボボックスをユーザが変更すれば通知メッセージが来るのでわかりますよ。
プログラムでコンボボックスの内容を変えた場合は
フォーカスはコンボボックスにないけれど
プログラムはどのコンボボックスを操作しているか当然知っているわけだし。
>てことはMFCじゃないってこと?
>メッセージループだったらMSG構造体にウィンドウハンドルがあるけど。
→そうでした。
メッセージループも作者が作っていました。
(他者作品を力不足の私が都合あって変更しています。)
>そもそも
>>RETのメッセージ
>って何?
→該当コンボボックスで編集終了時にRETキーを押すと
WM_COMMAND CallBack関数
BOOL TSendDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl)
のwIDに「IDOK」の値が入っていました。
これを「RETのメッセージ」と書きました。判りにくくてすみませんでした。
>ユーザが操作するならそのコンボボックスにフォーカスが当たっているはず。
→そう思い、GetFocus()でハンドルを取得したつもりが、コンボボックスでなく、
そのコンボボックスの子ウィンドウ?のEditのハンドルが返ってきていました。
SPY++でウィンドウを見たら、コンボボックスの下にEditがありました。 この
hWndを取得していました。(この値を仮にEdithWndとします)
そこで、GetParent(EdithWnd)で親ウィンドウ、つまり、目的のコンボボックスの
ハンドルを取得しようとしましたが、このコードはコンパイル時に「不正な
引数」ということでエラーになりました。
>コンボボックスをユーザが変更すれば通知メッセージが来るのでわかりますよ。
→メッセージループが独自で作られているため、通知メッセージが判りませんでした。
(力不足です)
そこで、API関数で、編集中(フォーカスを持っている)のコンボボックスを探せないかと、
四苦八苦しています。
どーも PATIQ です
>そこで、GetParent(EdithWnd)で親ウィンドウ、つまり、目的のコンボボックスの
>ハンドルを取得しようとしましたが、このコードはコンパイル時に「不正な
>引数」ということでエラーになりました。
まずは、このエラーをなくしたら良いかも知れませんけど、
エラー時の情報が少なすぎてなんとも言えませんけど。
いろいろ調べていたら自力で解決できました。
アドバイス頂いたwclrp・PATIQさん有難うございました。
見方を変えて
GetWindow(GetDlgItem(IDC_COMBO1), GW_CHILD)
を使ってできました。
1.該当コンボボックスの子ウィンドウハンドルを取得。
2.フォーカスが当たっているエディトボックスのハンドルを取得
3.両者が一致しているかで、コンボボックスにフォーカスが
当たっているかを判断。
当たっていたら、その内容を代入したいエディットボックスに転送
HWND hwndEdit = GetWindow(GetDlgItem(IDC_COMBO1), GW_CHILD);
HWND hwndNow = (HWND)GetFocus();
if(hwndEdit == hwndNow)
{
コンボボックスの内容を該当エディットボックスに代入
}