第14章对话框资源及其应用对话框资源通常有如下功能:发送消息如警告消息、提示框消息接收输入如用户输入的消息提供消息如常见的“关于”对话框一种弹出式窗口对话框模式对话框非模式对话框不允许用户在关闭对话框之前切换到应用程序的其他窗口允许用户在该对话框与应用程序其他窗口之间的切换2.显示对话框3.构造对话框消息处理函数4.关闭对话框1.定义对话框资源模态对话框的编程方法创建对话框首先应在应用程序的资源描述文件中定义对话框:对话框名DIALOG[载入特性选项]X,Y,Width,Height[设置选项]{对话框的控件定义}1.定义对话框资源对话框样式可用组合样式,下面定义了含标题栏的弹出式对话框:STYLEDS_MODALFRAME|WS_POPUP|WS_CAPTION与菜单资源相同位置及外型尺寸常用的有CAPTION(标题)和STYLE(样式)14.1模态对话框2.显示对话框在定义对话框资源后,可调用DialogBox函数在窗口中显示对话框intDialogBox(HINSTANCEhInstance,//当前应用程序的实例句柄LPCTSTRlpszDialogName,//对话框资源的名称HWNDhwndParent,//拥有该对话框的窗口句柄WNDPROClpDialogFunc)//对话框处理函数的地址3.构造对话框消息处理函数对话框接收的消息都在相应的对话框消息处理函数中处理BOOLCALLBACKDlgProc(……,……,……,……){switch(message){caseWM_INITDIALOG:return1;caseWM_COMMANDswitch(LOWORD(wParam)){case…;break;case…;break;…}break;}return0;}对话框处理函数主窗口函数函数的返回值BOOL值LRESULT值WM_PAINTWM_DESTROYWM_CREATE不需处理处理未定义处理过程的默认处理若收到此消息,返回FALSE(return0)调用DefwindowProc对话框消息处理函数具有与主窗口函数相似的参数,但两者存在不同在对话框消息处理函数中常响应以下两类消息:(a)WM_INITDIALOG消息完成其初始化操作,在功能上与主窗口函数的WM_COMMAND消息相似。(b)WM_COMMAND消息通过查看消息字参数(wParam)中的低位字节,与控件标识(ID)相比较,以确定产生交互请求的控件并据此转入相应的处理过程处理。4.关闭对话框调用函数EndDialog可以关闭对话框EndDialog(hdlg,nResult);消息框是模态对话框的特殊形式,调用MessageBox生成消息框intMessageBox(HWNDhwnd,//拥有消息框的窗口LPCTSTRlpszText,//消息框中显示的字符串LPCTSTRlpszCaption,//作为标题的字符串DWORDdwType//指定消息框的内容)从对话框返回到DialogBox函数的值对话框句柄标识说明MB_ABORTRETRYIGNORE含有Abort、Retry和Ignore按钮的消息框MB_ICONSTOP含有停止图标的消息框MB_OK含有一个OK按钮的消息框MB_OKCANCLE含有OK和CANCLE按钮的消息框MB_YESNOCANCLE含有YES、NO和CANCLE按钮的消息框这些标识可以组合使用【例14-1】该对话框含有标题栏、系统菜单、简要信息及一个按钮控件。14.2模态对话框应用实例#includewindows.h#include“14_1.hHINSTANCEhInst;LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);BOOLCALLBACKDlgProc(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(……,……,……,……){HWNDhwnd;MSGMsg;HACCELhAccel;WNDCLASSwndclass;charlpszMenuName[]=Menu;charlpszClassName[]=模态对话框;charlpszTitle[]=模态对话框样例;wndclass.style=0;……wndclass.lpszClassName=lpszClassName;if(!RegisterClass(&wndclass)){MessageBeep(0);returnFALSE;}hwnd=CreateWindow(……,……,……);ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);hInst=hInstance;hAccel=LoadAccelerators(hInst,lpszMenuName);while(GetMessage(&Msg,NULL,0,0)){if(!TranslateAccelerator(hwnd,hAccel,&Msg)){TranslateMessage(&Msg);DispatchMessage(&Msg);}}returnMsg.wParam;}LRESULTCALLBACKWndProc(……,……,……,……){switch(message){caseWM_COMMAND:switch(LOWORD(wParam)){caseIDM_NEW:break;caseIDM_OPEN:MessageBox(hwnd,文件已经打开!,文件打开,MB_OK);break;caseIDM_SAVE:MessageBox(hwnd,文件保存成功!,文件保存,MB_OK);break;caseIDM_SAVEAS:break;caseIDM_CLOSE:break;caseIDM_EXIT:SendMessage(hwnd,WM_DESTROY,0,0);break;caseIDM_CUT:break;caseIDM_COPY:break;caseIDM_PASTE:break;caseIDM_DELETE:break;caseIDM_ABOUT:DialogBox(hInst,About,hwnd,(DLGPROC)DlgProc);break;}break;caseWM_DESTROY:PostQuitMessage(0);break;default:returnDefWindowProc(hwnd,message,wParam,lParam);}return0;}创建对话框//对话框窗口处理函数BOOLCALLBACKDlgProc(……,……,……,……){switch(message){//初始化对话框caseWM_INITDIALOG:return1;//处理对话框消息caseWM_COMMAND:switch(LOWORD(wParam)){caseIDOK://关闭对话框EndDialog(hdlg,0);return1;}break;caseWM_CLOSE:EndDialog(hdlg,0);return1;}return0;}本例的资源程序代码如下:#includewindows.h#include“14_1.hMenuMENUDISCARDABLE{POPUP文件(&F){MENUITEM新建(&N)\tCtrl+N,IDM_NEWMENUITEM打开(&O)\tCtrl+O,IDM_OPENMENUITEM关闭(&C),IDM_CLOSEMENUITEMSEPARATORMENUITEM保存(&S)\tCtrl+S,IDM_SAVEMENUITEM另存为(&A),IDM_SAVEASMENUITEMSEPARATORMENUITEM退出(&X),IDM_EXIT}POPUP编辑(&E){MENUITEM剪切(&T)\tCtrl+X,IDM_CUTMENUITEM复制(&C)\tCtrl+C,IDM_COPYMENUITEM粘贴(&P)\tCtrl+V,IDM_PASTEMENUITEM删除(&D)\tDel,IDM_DELETE}POPUP帮助(&H){MENUITEM关于(&A)...,IDM_ABOUT}}MenuACCELERATORS{^N,IDM_NEW^O,IDM_OPEN^S,IDM_SAVE^X,IDM_CUT^C,IDM_COPY^V,IDM_PASTEVK_DELETE,IDM_DELETE,VIRTKEY}AboutDIALOG10,10,100,50STYLEWS_POPUP|WS_CAPTION|WS_SYSMENUCAPTION关于FONT18,楷体//定义对话框中的文本字体类型及大小{CTEXTWindows模态对话框,-1,13,10,80,10DEFPUSHBUTTON确定,IDOK,35,30,30,12}1.定义对话框样式非模态对话框的定义一般形式如下:STYLEWS_POPUP|WS_CAPTION|WS_VISIBLE非模态对话框允许与应用程序的其他窗口之间进行切换,因此标识该对话框内容的标题一般不可省略。非模态对话框编程方法1.定义对话框样式2.创建对话框函数3.消息循环部分的处理4.关闭对话框的函数与模态对话框的编程较类似,但略有差别2.创建对话框函数HWNDCreateDialog(HINSTANCEhInstance,//当前应用程序实例句柄LPCTSTRlpszDialogName,//对话框名HWNDhwndParent,//拥有该对话框的窗口句柄WNDPROClpDialogFunc//对话框处理函数地址)无此项则无法在屏幕上显示14.3非模态对话框3.消息循环部分的处理由于非模态对话框允许应用程序向其他窗口发送消息,因此,消息循环中必须具备截获发往非模态对话框的消息的能力,并送到相应的对话框处理函数进行处理。其消息循环过程的一般形式为:while(GetMessage(&Msg,NULL,0,0)){if(!IsDialogMessage(hdlg,&Msg)){TranslateMessage(&Msg);DispatchMessage(&Msg);}}判断是否为发往非模态对话框的消息,若是,则将消息发送到WndProc进行处理4.关闭对话框的函数非模态对话框调用函数DestroyWindow关闭对话框:BOOLDestroyWindow(HWNDhdlg)【例14-2】本例中,在“关于”窗口不关闭的前提下,仍可以对“文件”下拉菜单进行操作,如选“文件”下拉菜单中的“创建”选项,即可弹出“创建”窗口。14.4非模态对话框应用实例#includewindows.h#include“14-2.hHWNDhdlg;//对话框句柄HINSTANCEhInst;LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);BOOLCALLBACKDlgProc(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow)HWNDhwnd;MSGMsg;HACCELhAccel;WNDCLASSwndclass;charlpszMenuName[]=Menu;charlpszClassName[]=非模态对话框;charlpszTitle[]=非模态对话框演示程序;wndclass.style=0;……wndclass.lpszClassName=lpszClassName;if(!RegisterClass(&wndclass)){MessageBeep(0);returnFALSE;}hwnd=CreateWindow(……,……,……,……);ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);hInst=hIn