第九章 对话框
模态对话框
对话框有两类,一中是【模态】一中是【非模态】,模态对话框是指当我们结束这个对话框时,才能对同一个程序中的另一个对话框进行交互,不过这时我们可以切换到其他程序。而非模态对话框则不具有这种性质。
当我们建立一个对话框后,会生成一个建立的模板,比如:
ABOUTBOX DIALOG DISCARDABLE 32, 32, 180, 100
STYLE DS_MODALFRAME | WS_POPUP
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK",IDOK,66,80,50,14
ICON "ABOUT1",IDC_STATIC,7,7,21,20
CTEXT "About1",IDC_STATIC,40,12,100,8
CTEXT "About Box Demo Program",IDC_STATIC,7,40,166,8
CTEXT "(c) Charles Petzold, 1998",IDC_STATIC,7,52,166,8
END
·其中DIALOG DISCARDABLE 是关键字,后四个数字是对话框的位置和大小,位置是相对于父窗口显示的。
·然后是STYLE
·FONT 字体
当然这些东西我们也可以在对话框属性里面调整。
如果我们想在对话框中用我们自定义的控件,比如一个椭圆形的OK按钮,我们可以使用一个子窗口来实现:
·先在main函数里注册一个类,”ok_button”
·然后我们就可以在上述的模板中,添加一个控件:”ok_button”,可以写成如下形式:
CONTROL "OK",IDOK,"ok_button",WS_GROUP | WS_TABSTOP,73,79,32,14
·这样,我们就可以在dialog中创建一个自定义的按钮了
对话框的处理程序
BOOL CALLBACK DialogProc(HWND , UINT , WPARAM , LPARAM );
对话框的处理程序和窗口消息处理程序的区别:
·窗口消息处理程序WndProc返回LRESULT,而DialogProc返回BOOL
·如过WndProc不处理这个消息,那么将会呼叫DefWindowProc,而DialogProc如果不处理传回FALSE
·对话框程序不需要处理WM_PAINT 或 WM_DESTROY消息,对话框程序不接受WM_REATE消息,而是哎WM_INITDIALOG消息处理期间对对话框进行初始化工作。
激活对话框
如果我们显示叫一个定义好的对话框,我们可以这样做:
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG),hwnd,DialogProc);
即使程序在显示对话框时,WndProc也可以接收消息。我们可以从对话框程序内部给WndProc发送消息:
SendMessage(GetParent(hDlg), …);
当我们需要控制对话框的控件时,我们可以使用函数来通过对话框句柄和控件ID来获得控件的句柄:
GetDlgItem(hDlg,ID);
非模态对话框
非模态对话框可以让我们在同一个程序中在不同的对话框中切换。模态对话框是用DialogBox来创建的,而非模态对话框则是用CreateDialog来建立的。
非模态对话框与模态对话框有几点区别:
·非模态对话框通常包含一个标题列和系统菜单按钮。
·非模态对话框消息要通过程序式的消息队列,要将这些消息传送给对话框消息窗口处理程序,则必须改变消息队列。
·非模态对话框使用DestroyWindow而不是EndDialog来结束非模态对话框。(如果使用了Close按钮来结束对话框,我们必须处理WM_CLOSE消息,windows内的对话框窗口消息处理程序并不处理WM_CLOSE消息。
while(GetMessage(&msg,NULL,0,0))
{
if(hDlgModeless == 0 || !IsDialogMessage(hDlgModeless,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);}}
如果消息是发给对话框的,那么IsDialogMessage将它发送给对话框消息处理程序,并传回TRUE。只有hDlgMedeless为0或者消息不是该对话框消息时,才必须呼叫TranslateMessage函数。