お世話になっています、たいちうです。
下記の仕組みについてご説明いただけないでしょうか。
環境:Windows NT4 VC++6.0 SP5
1.MFC、ダイアログベースで、ダイアログを作成。
2.デフォルトのコントロールを全て削除。
3.エディットボックスを貼り付け、ビルド、実行。
4.リターンキーを押すと終了。
OnOK()やPreTranslatemassage()で終了させないようにすることはできるのですが、
どのような仕組みでOnOK()が呼ばれているのでしょうか?
コールスタックを見ると、_AfxDispatchCmdMsgやCCmdTarget等が書かれています。
キー入力をダイアログが先に処理して、OnOKを呼んでいるのでしょうか?
(だとすると、何故ボタンにフォーカスがある時にOnOKが呼ばれないのでしょうか?)
それとも、エディットボックスが処理した後、
ダイアログに何らかのメッセージを送っているのでしょうか?
別の原因かも知れませんが、エディットボックスでリターンを押すと、
他のボタンに関連付けられた関数が呼ばれることもあり、
不信を感じています。
MSDNで調べてますがよく判りません。どなたか判りやすく教えていただけないかと、
虫のいいことを思い、書かせてもらいました。
それと、皆さんはリターンキーの処理は、OnOKとPreTranslateMessage、
あるいは他の方法を、どのように使い分けているのでしょうか?
>キー入力をダイアログが先に処理して、OnOKを呼んでいるのでしょうか?
多分
IsDialogMessage()がメッセージを処理します。
(この関数はPreTranslateMessage()内で呼ばれるようです)
処理内容
enter : WM_COMMAND msg, wParam= IDOK or デフォルトボタンのControlID
>(だとすると、何故ボタンにフォーカスがある時にOnOKが呼ばれないのでしょうか?)
キーをダイアログが処理するか、コントロールに渡すかは
WM_GETDLGCODEメッセージで判定されます。
Bun様、dairygoods様、回答有り難うございます。
ダイアログのPreTranslateMessageが最初に処理するわけですね。
具体的な処理は、CWnd::PreTranslateMessageの中のマクロが
手におえず、判りませんでしたが。
フォーカスを持ったコントロールがメッセージを受け取ると、
勘違いしていました。
CDialog::PreTranslateMessageは、メッセージとフォーカスを持つ
子Windowによって、自分で処理するか、メッセージを渡すかを決めると。
今日も助けていただきました。
有り難うございました。
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/winui/winui/windowsuserinterface/windowing/dialogboxes/dialogboxprogrammingco
nsiderations.asp
ここの
Dialog Box Keyboard Interface の部分に他のキーについても書かれています。