【Demo 0053】模态与非模态对话框
今天我们学习对话框相关知识,对话框也是窗体,应而具与窗体相关的函数和属性。 对话框分为模态对话框以及非模态对话框.
模态对话框:用户想要对对话框以外的本应用程序窗体进行操作时,必须首先对该对话框进行响应;与模态对话框不同的是非模态对话框在不关闭对话框也可以操作本应用程序其他窗体。
创建两种对话框Windows提供几个API:
一、创建模态对话框
INT_PTR DialogBox(HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc);
INT_PTR DialogBoxParam(HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);
INT_PTR DialogBoxIndirect(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc);
INT_PTR DialogBoxIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);
说明: 1. 对话框模板可以以资源的方式进行编辑, 也可在内存在进行描述来生成,这也是DialogBoxIndirect与DialogBox两类函数不同之处;
2. 对话框在创建时是否支持外部参数传入,所以Windows提供了带有Param结尾的函数;
二、创建非模态对话框
HWND CreateDialog(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc);
HWND CreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);
HWND CreateDialogIndirect(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc);
HWND CreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);
说明: 同模态对话框
三、关键代码块
case 1000: // create modal dialog
{
DialogBoxParam(ghInstance, MAKEINTRESOURCE(IDD_DLGMODAL), hDlg, DlgModalProc, NULL);
break;
}
case 1001: // create modalless dialog
{
hWnd = CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DLGMODALLESS), hDlg, DlgModalLessProc);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
break;
}
{
DialogBoxParam(ghInstance, MAKEINTRESOURCE(IDD_DLGMODAL), hDlg, DlgModalProc, NULL);
break;
}
case 1001: // create modalless dialog
{
hWnd = CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DLGMODALLESS), hDlg, DlgModalLessProc);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
break;
}
四、相关函数
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
对话框窗体消息过程处理函数定义
BOOL EndDialog(HWND hDlg, INT_PTR nResult);
关闭由DialogBox, DialogBoxParam, DialogBoxIndirect, DialogBoxIndirectParam创建的模态对话框