第一步,在资源文件中创建弹出框资源。
新建两个弹出框资源,菜单分别为IDD_DIALOG1 和IDD_DIALOG2

二、建立一个顶级菜单,方便操作。
ID分别设置为 ID_MODEL(模态) 和 ID_NO_MODEL(非模态)

三、在.cpp中的窗口处理函数的添加WM_COMMAND的后续处理函数
.......
case WM_COMMAND: {
OnCommand(hwnd, wParam);
break;
.......
void OnCommand(HWND hwnd, WPARAM wParam) {
//点击不同菜单之后做不同的处理。
switch (LOWORD(wParam))
{
case ID_MODEL:{
DialogBoxA( g_hInstance, (char*)IDD_DIALOG1, hwnd, DlgProc); //创建模态
break;
}
case ID_NO_MODEL: {
//创建非模态
HWND hNoModelWnd = CreateDialog(g_hInstance, (char*)IDD_DIALOG2, hwnd, DlgNoModeProc);
//显示窗口(模态不需要)
ShowWindow(hNoModelWnd, SW_SHOW);
break;
}
default:
break;
}
}
INT_PTR DlgProc(HWND hwnd, UINT msgId, WPARAM wParam, LPARAM lParam) {
switch (msgId)
{
case WM_SYSCOMMAND:
{
//点击关闭弹出窗口的关闭按钮
if (wParam == SC_CLOSE) {
EndDialog(hwnd, TRUE); //模态必须要用EndDialog,因为这个函数既可以销毁窗口又能解除阻塞
}
break;
}
default:
break;
}
return FALSE;
}
//非模态
INT_PTR DlgNoModeProc(HWND hwnd, UINT msgId, WPARAM wParam, LPARAM lParam) {
switch (msgId)
{
case WM_SYSCOMMAND:
{
//点击关闭弹出窗口的关闭按钮
if (wParam == SC_CLOSE) {
DestroyWindow(hwnd); //只要销毁窗口,不需要解除窗口,所以不需要用EndDialog
}
break;
}
default:
break;
}
return FALSE;
}
当我们创建主窗口的时候系统会发送WM_CREATE消息,但是创建弹窗窗口的时候发送的不是WM_CREATE而是发送的WM_INITDIALOG,这是弹窗窗口和其他窗口不同之处,其他的和普通窗口处理没有差异。