Dialog

WTLでDialogのModal表示を行った場合、MFCとは勝手が違ってくる。その事をちゃんと理解してなかったので嵌って時間を浪費してしまった。ModalDialog上にCEditListBox (http://www.codeproject.com/wtl/WTL_EditListBox.asp) を置いて、入力後にエンターキーやキャンセルキーを押したらダイアログが閉じてしまうのを直せなかった。

http://tech.groups.yahoo.com/group/wtl/message/10633
http://blogs.msdn.com/oldnewthing/archive/2004/02/27/81155.aspx
http://techtips.belution.com/ja/vc/0015/
http://support.microsoft.com/kb/102589/ja
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/dialogboxes/dialogboxprogrammingconsiderations.asp

Windowsが行うModalDialogの処理のとこで、一部のキーのメッセージがDispatchされる前に改変されちゃってるんだろうな…。

思い通りの挙動を実現するにはどうすれば良いんだろう?思いつく方法は、

  1. MFCのように、元はモードレスウィンドウだけど親ウィンドウを無効化してメッセージループを自分で回す方式でモーダル処理を実現する、別のCDialog型を作る。
  2. hook
  3. 既定の動作から逃げるために idがIDOKやIDCANCELのWM_COMMAND(BN_CLICKED)を処理しない。

面倒くさいので最後の手段しか自分は取れないけど、なんだか嫌なのでダイアログを使うのは止めよう…。