2010-09-29 10 views
1

Mon problème est que j'essaie de créer une application Opengl/Win32 et je suis incapable de garder ma boîte de dialogue ouverte. Il clignote littéralement comme si quelqu'un appuyait sur annuler à droite à l'ouverture. J'ai regardé autour de google et trouvé quelques autres avec ce problème, mais aucune des solutions qu'ils ont postées ne m'a aidé, alors je me tourne vers la communauté StackOverflow!Pourquoi cette boîte de dialogue se ferme-t-elle immédiatement après son ouverture?

Dans un premier temps, je l'ai écrit le code pour la boîte de dialogue Procédure ...

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; 
} 

J'ai alors écrit le code réel pour afficher la boîte.

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() renvoie un hwnd du programme principal. Cette fonction fonctionne correctement. et LoginDlgHwnd est une variable globale.

La boîte de dialogue actuelle est créée et incluse correctement. As tu des idées? -Celestialkey

Répondre

3
  • DialogBox ne retourne pas hwnd, la fonction ne retourne pas jusqu'à ce que le dialogue est fermé, si vous voulez une boîte de dialogue modales et une poignée, utilisez CreateDialog
  • Le paramètre DLGPROC DialogBox devrait not require a cast, changement LoginDlgProc 'LRESULT à INT_PTR
  • MessageBox (NULL, NULL, NULL, MB_OK); n'affichera rien, il a besoin du texte dans le 2ème paramètre

Il est difficile de dire pourquoi la boîte de dialogue ne reste pas ouverte, mais vous devez vérifier la valeur de retour de DialogBox, si elle est 0, la hwnd mère est invalide, si c'est -1, appelez GetLastError() pour obtenir plus d'informations. Une chose que vous pouvez essayer est de supprimer tous les contrôles dans le modèle de dialogue LOGIN_DIALOG (Si vous avez utilisé des contrôles communs, mais n'a pas appelé InitCommonControls, la boîte de dialogue ne fonctionnerait pas, etc)

+0

En note, le MessageBox testait juste pour voir si c'était un handle NULL. Aucune raison pour le texte puisque c'était juste pour me lancer un avertissement rapidement lors des tests. Vos solutions corrigent le problème. –