|
reateDialog呼叫与对话方块模板一起,被Windows有效地转换为一个CreateWindow呼叫。该CreateWindow呼叫的功能与下面的呼叫相同:
hwnd = CreateWindow (TEXT ("HexCalc"), TEXT ("Hex Calculator"), WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 102 * 4 / cxChar, 122 * 8 / cyChar, NULL, NULL, hInstance, NULL) ;
其中,cxChar和cyChar变数分别是系统字体字元的宽度和高度。
我们通过让Windows来进行CreateWindow呼叫而收获甚丰:Windows不会在建立弹出式视窗1後就停止,它还会为对话方块模板中定义的其他29个子视窗按键控制项呼叫CreateWindow。所有这些控制项都给父视窗的视窗讯息处理程式发送WM_COMMAND讯息,该程序正是WndProc。对於建立一个包含许多子视窗的视窗来说,这是一个很好的技巧。
下面是使HEXCALC的程式码量下降到最少的另一种方法:或许您会注意到HEXCALC没有表头档案,表头档案中通常包含对话方块模板中,需要为所有子视窗控制项定义的识别字。我们之所以可以不要这个档案,是因为每个按键控制项的ID设定为出现在控制项上的文字的ASCII码。这意味著,WndProc可以完全相同地对待WM_COMMAND讯息和WM_CHAR讯息。在每种情况下,wParam的低字组都是按钮的ASCII码。
当然,对键盘讯息进行一些处理是必要的。WndProc拦截WM_KEYDOWN讯息,将左箭头键转换为Backspace键。在处理WM_CHAR讯息时,WndProc将字元代码转换为大写,Enter键转换为等号键的ASCII码。
WM_CHAR讯息的有效性是通过呼叫GetDlgItem来检验的。如果GetDlgItem函式传回0,那么键盘字元不是对话方块模板中定义的ID之一。如果字元是ID之一,则通过给相应的按钮发送一对BM_SETSTATE讯息,来使之闪烁:
if (hButton = GetDlgItem (hwnd, wParam)) { SendMessage (hButton, BM_SET |