Win32编程之对话框(五)
一、对话框原理
(1).对话框的分类
- 模式对话框:当对话框显示时,会禁止其他窗口和用户交互操作
- 无模式对话框:在对话框显示后,其他窗口仍然可以和用户交互操作
(2).对话框基本使用
- 对话框窗口处理函数
- 注册窗口类(不使用)
- 创建对话框
- 对话框的关闭
对话框窗口处理函数(并非真正的对话框窗口处理函数)
INT CALLBACK DialogProc( HWND hwndDlg, //窗口句柄 UINT uMsg, //窗口句柄 WPARAM wParam, //消息参数 LPARAM lParam //消息参数 ); 返回TRUE:缺省处理函数不需要处理 返回FALSE:交给缺省处理函数处理 不需要调用缺省对话框窗口处理函数
二、模式对话框
(1).创建对话框
INT DialogBox( HINSTANCE hInstance, //应用程序实例句柄 LPCTSTR lpTemplate, //对话框资源ID HWND hWndParent, //对话框父窗口 DLGPROC lpDialogFunc //自定义函数 ); DialogBox是一个阻塞函数,只有当对话框关闭后,才会继续,继续执行 后续代码。返回值是通过EndDialog设置
(2).对话框的关闭
BOOL EndDialog( HWND hDlg, //关闭的对话框窗口句柄 INT_PTR nResult //关闭的返回值 ); 关闭模式对话框,只能使用EndDialog,不能使用DestroyWindow函数 nResult是DialogBox函数退出的返回值
(3).对话框的消息
WM_INITDIALOG:对话框创建之后显示之前,通知对话框窗口处理函数,可以完成自己的初始化相关的操作
示例代码:
INT CALLBACK DlgProc(HWND hwndlg, UINT msgID, WPARAM wParam, LPARAM lParam) {
switch (msgID) {
case WM_INITDIALOG: {
MessageBox(hwndlg, TEXT("WM_INITDIALOG"), TEXT("提示"), MB_OK);
break;
}
case WM_SYSCOMMAND: {
if (wParam == SC_CLOSE) {
//销毁模式对话框
EndDialog(hwndlg, 100);
}
break;
}
default:
break;
}
//将消息交给真正的对话框窗口处理函数的后续代码帮我们处理
return FALSE;
}
void OnCommand(HWND hWnd, WPARAM wParam) {
switch (LOWORD(wParam)) {
case ID_MODEL: {
int nRet = DialogBox(g_hIns, (LPCTSTR)IDD_DIALOG1, hWnd, DlgProc);
if (nRet == 100) {
MessageBox(hWnd, TEXT("successfuly"), TEXT("提示"), MB_OK);
}
break;
}
default:
break;
}
}
//窗口处理函数(自定义,处理消息)
LRESULT CALLBACK WindProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam) {
switch (msgID) {
case WM_COMMAND: {
OnCommand(hWnd, wParam);
break;
}
default:
break;
}
return DefWindowProc(hWnd, msgID, wParam, lParam);
}
三、无模式对话框
(1).创建对话框
HWND CreateDialog( HINSTANCE hInstance, //应用程序实例句柄 LPCTSTR lpTemplate, //模板资源ID HWND hWndParent, //父窗口 DLGPROC lpDialogFunc //自定义函数 ); 非阻塞函数,创建成功后返回窗口句柄,需要使用ShowWindow函数显示对话框
(2).对话框的关闭
关闭时使用DestroyWindow销毁窗口,不能使用EndDialog关闭对话框
示例代码:
INT CALLBACK DlgProc(HWND hwndlg, UINT msgID, WPARAM wParam, LPARAM lParam) {
switch (msgID) {
case WM_INITDIALOG: {
MessageBox(hwndlg, TEXT("WM_INITDIALOG"), TEXT("提示"), MB_OK);
break;
}
case WM_SYSCOMMAND: {
if (wParam == SC_CLOSE) {
//销毁非模式对话框
DestroyWindow(hwndlg);
}
break;
}
default:
break;
}
//将消息交给真正的对话框窗口处理函数的后续代码帮我们处理
return FALSE;
}
void OnCommand(HWND hWnd, WPARAM wParam) {
switch (LOWORD(wParam)) {
case ID_MODEL: {
HWND hDialog = CreateDialog(g_hIns, (LPCTSTR)IDD_DIALOG1, hWnd, DlgProc);
ShowWindow(hDialog, SW_SHOW);
break;
}
default:
break;
}
}

浙公网安备 33010602011771号