对话框在打开后立即关闭

Posted

技术标签:

【中文标题】对话框在打开后立即关闭【英文标题】:Dialog Box Closes Immediately After It Opens 【发布时间】:2021-01-01 11:45:19 【问题描述】:

我有一个用于用户输入的对话框,它工作得很好,现在无论我做什么,对话框都会弹出一秒钟,然后程序在没有警告的情况下死掉,甚至调用WM_DESTROY在我注释掉所有可能的出口之后。只有一个错误,即no_init_all 错误,但每次出现运行时错误时都会出现,并且在尝试找到解决方案时毫无用处。

这是我的代码:

项目.cpp

BOOL CreateMyDialog(HINSTANCE hInstance) 
    HWND hWnd = CreateDialog(NULL, MAKEINTRESOURCE(myDialogResource), NULL, (DLGPROC)myDialogProcess);
    if (!hWnd) 
        return FALSE;
    
    myDialogGlobalHandle = hWnd;
    ShowWindow(hWnd, SW_SHOW);
    //UpdateWindow(hWnd);

    return TRUE;


INT_PTR CALLBACK myDialogProcess(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
    INITCOMMONCONTROLSEX InitCtrlEx;

    InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
    InitCtrlEx.dwICC = ICC_PROGRESS_CLASS;
    InitCommonControlsEx(&InitCtrlEx);

    switch(msg) 
        case WM_INITDIALOG: 
            //Do stuff to prep the dialog
            return TRUE;
        
        case WM_DESTROY: 
            PostQuitMessage(WM_QUIT);
            break;
        
    
    return TRUE;

项目.rc

myDialogResource DIALOGEX 600, 400, 286, 108
    STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION
    EXSTYLE WS_EX_OVERLAPPEDWINDOW /*| WS_EX_APPWINDOW*/
    CAPTION "My Dialog"
    FONT 8, "MS Shell Dlg", 400, 0, 0x1
    BEGIN
        COMBOBOX        dropdownList,112,7,61,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
        //... it's all syntactically correct controls that still work the split second the dialog is on the screen
    END

这是缩短的代码,即使这样,对话框也会自行打开并在屏幕上出现故障。使用我的完整代码,它通常会在应用程序关闭前出现一瞬间。我相信如果我能解决这个小问题,我可以通过我的对话找到问题。所以我的问题是,有什么问题?

编辑:

这是我的wWinMain

HWND myDialogGlobalHandle;

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) 
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
    INITCOMMONCONTROLSEX InitCtrlEx;

    InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
    InitCtrlEx.dwICC = ICC_PROGRESS_CLASS;
    InitCommonControlsEx(&InitCtrlEx);
    if (!CreateMyDialog(hInstance)) 
        //return FALSE;
    
    else 
        MSG message =  0 ;
        while (GetMessage(&message, nullptr, 0, 0)) 
            if (!IsDialogMessage(myDialogGlobalHandle, &message)) 
                DispatchMessage(&message);
            
        
    

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_PROJECT));

    MSG msg;

    // Main message loop:
    while (GetMessage(&msg, nullptr, 0, 0))
    
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        
    

    return (int)msg.wParam;

【问题讨论】:

请不要在问题中编辑解决方案公告。改为自己创建一个答案或接受现有答案之一。 为什么会有 2 个消息循环?为什么要在对话框收到的每条消息上重新初始化 ComCtrl 库?该初始化根本不属于myDialogProcess() 很高兴您自己找到了解决方案。您能否发布一个答案以结束此线程。这将对其他社区有益。 【参考方案1】:

事实证明,我的所有代码都是正确的。问题出在我的对话过程中的case 语句上,出于某种原因,Visual Studio 不喜欢case 语句中的括号。在尝试了一切,然后将它们替换为 break; 语句后,我的代码又开始工作了。

【讨论】:

以上是关于对话框在打开后立即关闭的主要内容,如果未能解决你的问题,请参考以下文章

打印对话框关闭后自动关闭窗口

Android 模拟器“允许 USB 调试”对话框在显示后立即关闭

调用 tkinter askopenfilename 方法后打开文件对话框冻结

FB App 在 ios 6 上使用 presentShareDialogWithOpenGraphAction 显示后立即关闭

Facebook 分享对话框立即消失

jQuery UI 对话框 - 关闭后不打开