さて、ダイアログボックスに貼り付けるコントロール類は、CreateWindow関数で作ることも可能です。
エディットコントロールなどは、メインウィンドウのクライアント領域にCreateWindow関数で作ることがよくあります。
その他にBUTTON, COMBOBOX, LISTBOX, MDICLIENT, SCROLLBAR, STATICなどなど・・・。
作り方は
CreateWindow("クラス名", "", WS_CHILD | WS_VISIBLE | ..., X, Y, W, H, 親, (HMENU)ID, hInst, NULL);となります。コントロール類は特殊な子ウィンドウなのでWS_CHILDとなります。また、WS_VISIBLEを 忘れると見えません。メニューハンドルのところは、適当なIDを定義しておきます。子ウィンドウはメニューを持つことができないのでIDに流用しているのですね。
さて、このコントロール類は、いつ作れば良いのでしょうか。たいていは、最初から存在しますね。 と、いうことはWM_CREATEメッセージが来た時に、作っておくのがよいでしょう。 また、親のウィンドウサイズが変更になった時、コントロールの位置とか大きさも変更したい場合がよくあります。これは、WM_SIZEメッセージが来た時に、位置、サイズを変更します。
コントロールウィンドウのサイズ変更には、MoveWindow関数が便利です。
とりあえずは、クライアント領域にいろいろなコントロールをCreateWindow関数で作ってみてください。これが、できたならば、そのコントロールからのメッセージを受け取る練習をしてみてください。
ここで、注意すべき重要なことがあります。あるウィンドウで起きたイベントに対しては、そのウィンドウのプロシージャにメッセージが届きます。しかし、親が興味を引きそうなメッセージは、その親にも「通知メッセージ」として送られます。通知メッセージには、WM_COMMANDの形で来るものと、WM_NOTIFYの形で送られてくるものの2種類があります。WM_COMMANDはすでに何回も使っていますね。
p455にWM_NOTIFYメッセージの解説がありますので、これはぜひともマスターしておいてください。