2010-09-29 118 views
1

我的问题是,我想创建一个的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是一个全局变量。

创建实际的对话,其中包括适当的为好。你有什么想法? -Celestialkey

回答

3
  • 对话框不返回HWND,并没有返回,直到对话框的功能是关闭的,如果你想要一个无模式对话框和把手,使用CreateDialog
  • 的DLGPROC对话框参数应该not require a cast,变化LoginDlgProc” LRESULT到INT_PTR
  • 的MessageBox(NULL,NULL,NULL,MB_OK);不会显示任何东西,它需要在第二个参数

这是很难说为什么对话框不保持开放,但你应该检查对话框的返回值,如果是0,父HWND是文本无效,如果它是-1,则调用GetLastError()以获取更多信息。有一两件事你可以尝试是消除在LOGIN_DIALOG对话框模板的所有控件(如果你使用的通用控件,但没有调用InitCommonControls,对话框将无法正常工作等)

+0

作为一个侧面说明,在MessageBox只是测试,看看如果它是一个NULL句柄。没有文字的理由,因为它只是在测试中迅速向我发出警告。尽管您的解决方案解决了这个问题 – 2010-09-30 17:35:02