2010-09-29 81 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