打开后为什么这个对话框会立即关闭?

时间:2010-09-29 16:48:30

标签: c++ winapi dialog

我的问题是我正在尝试创建一个Opengl / Win32应用程序,但我无法打开对话框。字面上闪烁,好像有人在打开时按下了它右边。 我已经浏览了谷歌并找到了其他一些问题,但他们发布的解决方案都没有帮助我,所以我转向StackOverflow社区!

最初,我为Dialog Procedure编写代码......

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是一个全局变量。

也会创建并正确包含实际对话框。你有什么想法? -Celestialkey

1 个答案:

答案 0 :(得分:3)

  • DialogBox不返回hwnd,在关闭对话框之前函数不会返回,如果你想要一个无模式对话框和句柄,请使用CreateDialog
  • DLGPROC DialogBox参数应为not require a cast,将LoginDlgProc'LRESULT更改为INT_PTR
  • MessageBox(NULL,NULL,NULL,MB_OK);将不会显示任何内容,它需要第二个参数中的文本

很难说为什么对话框不会保持打开状态,但你应该检查DialogBox的返回值,如果是0,则父hwnd无效,如果是-1,则调用GetLastError()以获得更多信息。您可以尝试的一件事是删除LOGIN_DIALOG对话框模板中的所有控件(如果您使用了常用控件,但没有调用InitCommonControls,则对话框将不起作用等)