【问题标题】:Why does this dialog box close immediately after opening?为什么这个对话框打开后立即关闭?
【发布时间】:2010-09-29 16:48:29
【问题描述】:

我的问题是我正在尝试创建一个 Opengl/Win32 应用程序,但我无法让我的对话框保持打开状态。它实际上会闪烁,好像有人在它打开时按下了取消按钮。 我环顾了谷歌,发现其他一些人有这个问题,但他们发布的解决方案都没有帮助我,所以我求助于 StackOverflow 社区!

最初,我为对话过程编写代码...

LRESULT CALLBACK LoginDlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{ 
    ShowWindow(hWndDlg, SW_SHOW); // These were added to get the window to show up
    UpdateWindow(hWndDlg); // even if the chance was small.
    switch(Msg)
    {
    case WM_INITDIALOG:
        return true;

    case WM_COMMAND:
        switch(wParam)
        {
        case IDOK:
            EndDialog(hWndDlg, 0);
            return TRUE;
        }
        break;
    }

    return FALSE;
}

然后我编写了实际的代码来显示该框。

void DisplayLoginBox()
{
    LoginDlgHwnd = NULL;
    LoginDlgHwnd = (HWND)DialogBox(GetModuleHandle(NULL), 
                                    MAKEINTRESOURCE(LOGIN_DIALOG),
                            app.GetHandle(),
                            reinterpret_cast<DLGPROC>(LoginDlgProc)
                        );

    if(LoginDlgHwnd == NULL)
        MessageBox(NULL, NULL, NULL, MB_OK);
}

app.GetHandle() 返回主程序的 hwnd。此功能正常工作。而 LoginDlgHwnd 是一个全局变量。

实际的对话框也已正确创建和包含。你有什么想法? -天界之钥

【问题讨论】:

    标签: c++ winapi dialog


    【解决方案1】:
    • DialogBox不返回hwnd,该函数直到对话框关闭才返回,如果要无模式对话框和句柄,请使用CreateDialog
    • DLGPROC DialogBox 参数应为not require a cast,将 LoginDlgProc' LRESULT 更改为 INT_PTR
    • 消息框(NULL,NULL,NULL,MB_OK);不会显示任何内容,它需要第二个参数中的文本

    对话框不一直打开的原因不好说,但是你应该检查DialogBox的返回值,如果为0,则父hwnd无效,如果为-1,调用GetLastError()获取更多信息。您可以尝试的一件事是删除 LOGIN_DIALOG 对话框模板中的所有控件(如果您使用通用控件,但没有调用 InitCommonControls,则对话框将无法工作等)

    【讨论】:

    • 附带说明,MessageBox 只是在测试它是否为 NULL 句柄。没有理由发短信,因为它只是为了在测试时快速向我发出警告。不过,您的解决方案可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 2022-11-14
    • 2017-12-19
    • 2022-01-05
    • 1970-01-01
    • 2020-06-02
    • 2017-08-20
    相关资源
    最近更新 更多