模态对话框与非模态对话定义
一般来说,Windows应用程序中,对话框分为模态对话框和非模态对话框两种。二者的区别在于当对话框打开时,是否允许用户进行其他对象的操作。
模态对话框窗口打开之后,必须操作完该窗口,才能去操作自己程序的其他窗口(大多数对话框);
非模态对话框窗口打开之后,允许还没有操作完该窗口,允许去操作自己程序的其他窗口(如记事本的查找公共对话框)。
创建模态对话框步骤:
1、使用DialogBox函数创建模态对话框。
void DialogBoxA( hInstance, lpTemplate, hWndParent, lpDialogFunc );
参数
hInstance
类型:HINSTANCE
包含对话框模板的模块的句柄。如果此参数为 NULL,则使用当前的可执行文件。
lpTemplate
类型:LPCTSTR
对话框模板。此参数是指向指定对话框模板名称的以空字符结尾的字符串的指针或指定对话框模板资源标识符的整数值。如果该参数指定了资源标识符,则其高位字必须为零,其低位字必须包含该标识符。您可以使用MAKEINTRESOURCE宏来创建此值。
hWndParent
类型:HWND
拥有对话框的窗口句柄。
lpDialogFunc
类型:DLGPROC
指向对话框过程的指针。有关对话框过程的更多信息,请参阅DialogProc。
2、关闭EndDialog 销毁资源
比如我们要创建一个登录按钮模态对话框,登录成功后,显示主窗口。
//登录对话框处理函数 BOOL CALLBACK LoginProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND://WM_COMMAND的LOWORD(wParam)代表ID { switch (LOWORD(wParam)) { case IDC_BTN_LOGIN://登录按钮 { //获取用户名和密码 wchar_t szUsername[20] , szPassword[20]; GetDlgItemText(hWnd, IDC_USERNAME, szUsername, 20);//获取文本数据 GetDlgItemText(hWnd, IDC_PASSWORD, szPassword, 20); if (wcscmp(szUsername, L"admin") == 0 && wcscmp(szPassword, L"123456") == 0) { //关闭登录框 EndDialog(hWnd, IDC_BTN_LOGIN); //这里的IDC_BTN_LOGIN就是DialogBox函数的返回值 return TRUE; } else { MessageBox(hWnd, L"用户名或密码错误", L"温馨提示", MB_OK); return TRUE; } break; } case IDCANCEL: EndDialog(hWnd, IDCANCEL);//结束对话框,这里的结束对话框统一用IDCANCEL来处理,后面执行完DialogBox //后,可以用if(DialogBox(...)==IDCANCEL)来判断是否已经结束对话框,而后执行其他的逻辑。 break; } break; } case WM_CLOSE://窗口关闭消息 EndDialog(hWnd, IDCANCEL);//结束对话框 return TRUE; } return FALSE; }
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow) { g_hInstance = hInstance; //对话框窗口 //1.模态对话框窗口=》 打开之后,必须操作完该窗口,才能去操作自己程序的其他窗口 //创建DialogBox 阻塞函数 //关闭EndDialog 销毁资源 //首先先弹出登录 int result = DialogBox(hInstance, MAKEINTRESOURCE(IDD_LOGIN_DLG), NULL, LoginProc); //DialogBox的值result等于LoginProc函数的返回值。当点击登录按钮时,返回IDC_BTN_LOGIN;后面再用 //result==IDC_BTN_LOGIN判断创建第二个模态对话框(主对话框) if (result == IDC_BTN_LOGIN) { //创建一个模态对话框 DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN_DLG), NULL, MainDialogProc); }
输入正确信息,点击登录后跳转至如下界面:
创建非模态对话框步骤
1、使用CreateDialog函数创建非模态对话框,并执行ShowWindow函数来实现对话框的显示。
void CreateDialogA( hInstance, lpName, hWndParent, lpDialogFunc );
hInstance
类型:HINSTANCE
包含对话框模板的模块的句柄。如果此参数为 NULL,则使用当前的可执行文件。
lpName
类型:LPCTSTR
对话框模板。此参数是指向指定对话框模板名称的以空字符结尾的字符串的指针或指定对话框模板资源标识符的整数值。如果该参数指定了资源标识符,则其高位字必须为零,其低位字必须包含该标识符。您可以使用MAKEINTRESOURCE宏来创建此值。
hWndParent
类型:HWND
拥有对话框的窗口句柄。
lpDialogFunc
类型:DLGPROC
指向对话框过程的指针。有关对话框过程的更多信息,请参阅DialogProc。
//非模态对话框 hChatWnd = CreateDialog(g_hInstance, MAKEINTRESOURCE(IDD_CHAT_DLG), hWnd, ChatProc); ShowWindow(hChatWnd, SW_SHOW);
2、调用DestroyWindow: 销毁窗口,销毁资源,关闭窗口。
注意其区别于模态对话框下关闭对话框的函数EndDialog。在非模态对话框下执行EndDialog并不会关闭对话框窗口,实际只是隐藏了该窗口。