一、Windows模态对话框—「OK」和「Cancel」按钮
ABOUT2有两个按键,分别标记为「OK」和「Cancel」。在ABOUT2.RC的对话框模板中,「OK」按钮的ID值为IDOK(在WINUSER.H中被定义为1),「Cancel」按钮的ID值为IDCANCEL(定义为2),「OK」按钮是内定的:
DEFPUSHBUTTON "OK",IDOK,35,212,50,14 PUSHBUTTON "Cancel",IDCANCEL,113,212,50,14
在对话框中,通常都这样安排「OK」和「Cancel」按钮:将「OK」按钮作为内定按钮有助于用键盘接口终止对话。一般情况下,您通过单击两个鼠标按键之一,或者当所期望的按钮具有输入焦点时按下Spacebar来终止对话框。不过,如果使用者按下Enter,对话框窗口消息处理程序也将产生一个WM_COMMAND消息,而不管哪个控件具有输入焦点。wParam的低字组被设定为对话框中内定按键的ID值,除非另一个按键拥有输入焦点。在后一种情况下,wParam的低字组被设定为具有输入焦点之按键的ID值。如果对话框中没有内定按键,那么Windows向对话框程序发送一个WM_COMMAND消息,消息中wParam的低字组被设定为IDOK。如果使用者按下Esc键或者Ctrl-Break键,那么Windows令wParam等于IDCANCEL,并给对话框程序发送一个WM_COMMAND消息。所以,您不用在对话框程序中加入单独的处理键盘操作,因为通常终止对话框的按键会由Windows将这两个按键动作转换为WM_COMMAND消息。
AboutDlgProc函数通过呼叫EndDialog来处理这两种WM_COMMAND消息:
switch (LWORD (wParam)) { case IDOK: iCurrentColor = iColor ; iCurrentFigure = iFigure ; EndDialog (hDlg, TRUE) ; return TRUE ; case IDCANCEL : EndDialog (hDlg, FALSE) ; return TRUE ;
ABOUT2的窗口消息处理程序在程序的显示区域中绘制矩形或椭圆时,使用了整体变量iCurrentColor和iCurrentFigure。AboutDlgProc在对话框中画图时使用了静态区域变量iColor和iFigure。
注意EndDialog的第二个参数的值不同,这个值是在WndProc中作为原DialogBox函数的传回值传回的:
case IDM_ABOUT: if (DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc)) InvalidateRect (hwnd, NULL, TRUE) ; return 0 ;
如果DialogBox传回TRUE(非0),则意味着按下了「OK」按钮,然后需要使用新的颜色来更新WndProc显示区域。当AboutDlgProc收到一个WM_COMMAND消息并且消息的wParam的低字组等于IDOK时,AboutDlgProc将图形和颜色储存在整体变量iCurrentColor和iCurrentFigure中。如果DialogBox传回FALSE,则主窗口继续使用iCurrentColor和iCurrentFigure的原始设定。
TRUE和FALSE通常用于EndDialog呼叫中,以告知主窗口消息处理程序使用者是用「OK」还是用「Cancel」来终止对话框的。不过,EndDialog的参数实际上是一个int值,而DialogBox也传回一个int值。所以,用这种方法能比仅用TRUE或者FALSE传回更多的信息。