WIN32创建模态和非模态弹窗框

第一步,在资源文件中创建弹出框资源。

新建两个弹出框资源,菜单分别为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,这是弹窗窗口和其他窗口不同之处,其他的和普通窗口处理没有差异。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注