メインとなるウィンドウ(親)のクライアント領域に子ウィンドウを貼り付けそこにデータを表示させています。内容的にはエクセルのような表形式になっていてセルを選択でき、方向キーで選択を移動できます。
移動は子ウィンドウでWM_KEYDOWNが拾えなかったので親ウィンドウでWM_KEYDONWを子ウィンドウにSendMessageして子ウィンドウで処理させています。このやり方に少々疑問も感じますがとりあえずここまでは期待通りに動いてくれています。
ここからが問題なのですが、データを修正する時に子ウィンドウにEditBox(孫)を作成し直接入力できるようにしましたが、入力が終わりエディットボックスを破棄した後、以前のように方向キーでの移動が出来なくなってしまいました。親ウィンドウでWM_KEYDOWNを拾えていないようです。でも、最小化などにより一度親ウィンドウがフォーカスを失うと再び正常に戻ります。
EditBoxはサブクラス化してリターンキーで閉じるようになってます。
良い解決方法がありましたらお願いします。
環境:VC++6.0(SDK) WindowsMe
No.3ベストアンサー
- 回答日時:
>ただ、以前のようにWM_KEYDOWNでWM_CLOSEを"SEND"した場合、(EditBoxプロシージャ内の)どこでSetFocusしてもだめだった理由がいまひとつ理解できていないのでちょっとすっきりしませんが...。
ウィンドウプロシージャから見たSend時の処理の流れ
WM_KEYDOWNの受け取り
↓
WM_CLOSEの受け取り
↓
WM_CLOSEに対する処理
↓
WM_KEYDOWNに対する処理
Post時の処理の流れ
WM_KEYDOWNの受け取り
↓
WM_KEYDOWNに対する処理
↓
WM_CLOSEの受け取り
↓
WM_CLOSEに対する処理
これで違いはわかりますか?
Sendしてしまうと、WM_CLOSEの処理が行われた後で
WM_KEYDOWNに対する内部処理がエディットのウィンドウプロシージャ内で行われます。
ここはブラックボックスなので、何が行われているかは
わからないですが、フォーカスに関係するような処理でも
行われているのでしょう。
ありがとうございます。
順を追って流れを見ると違いがはっきり分かりました。
taka_tetsuさんのおかげで基本的かつ重要なことを学べました。
No.2
- 回答日時:
>EditBox破棄後、EditBoxにあったフォーカスは親(子)ウィンドウには戻りませんでした。
参考までに、何が持ってました?
ハンドル値がわかればSPYで調べられますよね。
>サブクラス化したEditBoxのプロシージャ内でリターンキーによりEditBox自身を閉じた時に
>SetFocusしてもだめでした。
どのタイミングでSetFocusしました?
WM_KEYDOWN?WM_DESTROY?
タイミングをずらせばいいのであれば、WM_DESTROYのときに親ウィンドウにWM_USERかなんかをPOSTしてあげれば何とかなると思います。
>>...POSTしてあげれば何とかなると思います。
今まで何も考えずにSendMessageばかり使ってましてそれでも何とかなっていたのでPostとSendの違いを深く理解していませんでした。
taka_tetsuさんの言葉をきっかけにPostMessageについて調べ直し、直ちに制御を返すことに気づき使ってみました。
結果、WM_CLOSEをSendではなくPostしたらSetFocusするまでもなく親ウィンドウにフォーカスが移り、キー操作もちゃんと拾えるようになりました。(初歩的なことでお恥ずかしい)
ただ、以前のようにWM_KEYDOWNでWM_CLOSEを"SEND"した場合、(EditBoxプロシージャ内の)どこでSetFocusしてもだめだった理由がいまひとつ理解できていないのでちょっとすっきりしませんが...。
いずれにしても解決への糸口を提供していただきまして今回の件だけでなく今後のデバッグのためにも参考になりました。
No.1
- 回答日時:
>移動は子ウィンドウでWM_KEYDOWNが拾えなかったので
子ウィンドウは、もしかしてスタティックなコントロールとか使用していませんか?
>入力が終わりエディットボックスを破棄した後、以前のように方向キーでの移動が出来なくなってしまいました。親ウィンドウでWM_KEYDOWNを拾えていないようです。
キーで動かないのは子ウィンドウがキーボードフォーカスを持ってない体と思われます。なんで、エディットを破棄した後にSetFocusすれば平気かも。
それでもだめなときは、キーボードフォーカスはどこにあるかGetFocusで調べてみてください。
このときに、デバッグ用にメッセージボックスなどフォーカスの移動が
発生するようなものは表示させないでくださいね。
ありがとうございます。早速、GetFocusで調べてみました。EditBox破棄後、EditBoxにあったフォーカスは親(子)ウィンドウには戻りませんでした。ご指摘のとおりEditBox破棄後、別のタイミングでSetFocusすれば元に戻りましたが、サブクラス化したEditBoxのプロシージャ内でリターンキーによりEditBox自身を閉じた時にSetFocusしてもだめでした。今の状態だと 編集する → リターンキーで編集を終える → 方向キーが使えない ということになってしまいます。
ちなみに子ウィンドウはCreateWindowで作ったWM_CHILDのタイトルなしのウィンドウです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 起動中のアプリ、ソフトの取得 3 2022/12/28 11:13
- Word(ワード) Microsoft Word2023で、修正箇所を表示させたい 1 2023/02/09 10:07
- Chrome(クローム) Google Chromeのブラウザ(PC)ウインドウの移動について 3 2022/07/19 15:14
- Mac OS Macのショートカットの省略形 2 2023/01/26 03:22
- その他(ソフトウェア) Figma 1 2023/06/23 14:22
- その他(Microsoft Office) windows10で作業を終了する際の「保存しますか はい いいえ」を表示させずに自動で保存する方法 6 2023/03/15 11:29
- その他(OS) Windowsで大量の画像サイズを半自動で変更する方法 6 2023/02/17 08:45
- Windows 10 2つのウィンドウ選択時の表示について 10 2023/07/25 08:48
- モニター・ディスプレイ どうかどなたか教えてください。 2 2023/08/17 02:40
- モニター・ディスプレイ 回答お願いします。 1 2023/08/17 02:58
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
ラジオボタンの初期指定
-
最大化時のフルスクリーン
-
親ウインドウにあるOKボタンを...
-
Alt+P,Alt+NをPostmessageで送...
-
作成したウインドウのサイズを...
-
【VB2008】 マウス操作の一時的...
-
最大化と最小化ボタン
-
EXCEL2016で新しいウィンドウを...
-
勝手にウィンドウが開いて止ま...
-
他アプリの操作(メニューバー)
-
ゲームでは結局どっちが良いの?
-
VBで外部プログラムを位置のみ...
-
Outlook2003で終了直後に強制終...
-
Console.WriteLine で表示されない
-
MDI(自作メモ帳)の子ウィンドウ...
-
VS2005環境でのSHBrowseForFold...
-
Excelでの項目名固定
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
勝手にウィンドウが開いて止ま...
-
ゲームでは結局どっちが良いの?
-
ラジオボタンの初期指定
-
VBA .Value=.Value ?
-
Excelの上下を固定したい
-
ExcelのBOOKが消えた!
-
他のアプリケーションの終了処理
-
Vba LongPtrについて教えてくだ...
-
作成したウインドウのサイズを...
-
UWSCで特定のChromeのタブをア...
-
[VBA] UserForm を Excel の W...
-
MFC ダイアログ上のID取得につ...
-
Alt+P,Alt+NをPostmessageで送...
-
「&HFFFF」「&H1A」とは?
-
ExcelVBAでAPIを使って外部ウイ...
-
親ウインドウにあるOKボタンを...
-
EnumChildWindowsの使い方(VBA)
おすすめ情報