Tabストップ
ダイアログウィンドウの中のコントロールに対してTab移動ができない。
普通にWindowを作って、そこからダイアログを作成した場合はTab移動できる。
ダイアログに来たメッセージかを判断するIsDialogMessageをメッセージループに書くとTab移動ができるようになった。
WM_COMMAND
なぜか、エディットコントロールだけ、選択時にWM_COMMANDメッセージが複数回やってくる。
ラジオボタンとか、プッシュボタンとかはちゃんと1回だけなのに。
ダイアログウィンドウの初期化
普通ダイアログを作ったときはWM_INITDIALOGメッセージがやってくる。
だが、ダイアログウィンドウの場合、やってくるのはWindowと同じWM_CREATEメッセージ。
ここで初期化のためにGetDlgItemでコントロ-ルのハンドルを取得しようとするが、できない。
Windowからダイアログを作った場合はちゃんと取得できている。
ならばと、ハンドルを取得しなくてもコントロールを操作できるSendDlgItemMessageを使ってみたが、反応しない。
コントロールのプッシュボタンを押したときに同じことをやってみると、GetDlgItemもSendDlgItemMessageもうまくいく。
が、これではエディットボックスの読込みはできても、ラジオボタンの初期化は結局できないまま。
ちなみに、
WM_CREATEはCreateWindowがreturnする前に届く
WM_INITDIALOGはダイアログが表示される前に届く
というタイミングの違いがある。
試しにCreateWindowがreturnした後に適当なメッセージ(まあWM_INITDIALOGが妥当だと思う。どうせシステムからは送られて来ないし)を送って、そこで初期化してみるとうまくいった。
考えてみると、この方法ならWM_INITDIALOGメッセージを処理しているので、そのまま通常のダイアログプロシージャにも使える。
なぜか、wsprintfが%fを正しく処理してくれない。
アクセラレータも動作しない。
wsprintfについて
そもそもwsprintfは小数点数を扱えないみたいです。
sprintfなどprintf系の関数を使うのがいいです。
MSDNライブラリ