2010-06-13 9 views
0

Je programmais l'exemple de code du livre de Frank Luna intitulé "Introduction à la programmation de jeux 3D avec DirectX 10". Le code est le premier exemple Win32 dans la section Annexe A: programmation Windows.Win32: Aucune fenêtre n'apparaît

À l'heure actuelle, le programme compile sous VC++ 2008/2010, mais aucune fenêtre ne s'affiche, bien que la session de débogage ait démarré et que je doive la fermer de force. Je ne sais pas où c'est, je n'utilise pas le mode Win32 Console, j'ai fermé toutes les autres fenêtres et aucun autre IDE ou session de VC++ n'est en cours d'exécution.

Une idée pourquoi cela pourrait-il se produire? PS: J'ai également vérifié mes processus. Il est en effet en cours d'exécution.

#include <Windows.h> 

    HWND ghMainWnd = 0; 

    bool InitWindowsApp(HINSTANCE instanceHandle, int show); 
    int Run(); 

    LRESULT CALLBACK 
     WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); 

    int WINAPI 
     WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nShowCmd) 
    { 
     if(!InitWindowsApp(hInstance, nShowCmd)) 
      return 0; 

     return Run(); 
    } 

    bool InitWindowsApp(HINSTANCE instanceHandle, int show) 
    { 
     WNDCLASS wc; 

     wc.style   = CS_HREDRAW | CS_VREDRAW; 
     wc.lpfnWndProc = WndProc; 
     wc.cbClsExtra = 0; 
     wc.cbWndExtra = 0; 
     wc.hInstance  = instanceHandle; 
     wc.hIcon   = LoadIcon(0, IDI_APPLICATION); 
     wc.hCursor  = LoadCursor(0, IDC_ARROW); 
     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
     wc.lpszMenuName = 0; 
     wc.lpszClassName = L"BasicWndClass"; 

     if(!RegisterClass(&wc)) 
     { 
      MessageBox(0, L"RegisterClass FAILED", 0, 0); 
      return false; 
     } 

     ghMainWnd = CreateWindow(
      L"BasicWndClass", 
      L"Win32Basic", 
      WS_OVERLAPPEDWINDOW, 
      CW_USEDEFAULT, 
      CW_USEDEFAULT, 
      CW_USEDEFAULT, 
      CW_USEDEFAULT, 
      0, 
      0, 
      instanceHandle, 
      0); 

     if(ghMainWnd = 0) 
     { 
      MessageBox(0, L"Window Creation FAILED", 0, 0); 
      return false; 
     } 

     ShowWindow(ghMainWnd, show); 
     UpdateWindow(ghMainWnd); 

     return true; 
    } 

    int Run() 
    { 
     MSG msg = {0}; 
     BOOL bRet = 1; 

     while(bRet = GetMessage(&msg, 0, 0, 0) != 0) 
     { 
      if(bRet == -1) 
      { 
       MessageBox(0, L"GetMessage FAILED", 0, 0); 
       break; 
      } 
      else 
      { 
       TranslateMessage(&msg); 
       DispatchMessage(&msg); 
      } 
     } 

     return (int)msg.wParam; 
    } 

    LRESULT CALLBACK 
     WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
    { 
     switch(msg) 
     { 
     case WM_LBUTTONDOWN: 
      MessageBox(0, L"Hello, World", 0, 0); 
      return 0; 

     case WM_KEYDOWN: 
      if(wParam == VK_ESCAPE) 
       DestroyWindow(ghMainWnd); 
      return 0; 

     case WM_DESTROY: 
      PostQuitMessage(0); 
      return 0; 
     } 

     return DefWindowProc(hWnd, msg, wParam, lParam); 
    } 
+0

Tout le monde n'a pas le livre. Pourriez-vous poster du code? Ou cela violerait-il la loi sur le droit d'auteur? –

+0

Je ne pense pas. Code ajouté – IAE

Répondre

6

Modifier ceci:

if(ghMainWnd = 0) 
     { 
      MessageBox(0, L"Window Creation FAILED", 0, 0); 
      return false; 
     } 

à:

if(ghMainWnd == 0) 
     { 
      MessageBox(0, L"Window Creation FAILED", 0, 0); 
      return false; 
     } 

Deux signes est égal au lieu d'un. :)

+0

DAMN IT. Je déteste ces erreurs! Gah! Fonctionne maintenant, en acceptant votre réponse. Merci beaucoup! – IAE

+2

Utilisez: 'if (0 == ghMainWnd) // ...' à la place pour éviter les problèmes de ce genre - si vous omettez le second '=', il ne sera pas compilé (puisque cela essaierait d'assigner une valeur à '0', ce qui n'est pas autorisé). –

+0

+1 pour une bonne idée. Adoptant ceci immédiatement. – IAE

1

Conjecture sauvage: _UNICODE n'est pas défini par les paramètres du projet. Utilisez CreateWindowW, RegisterClassW, pour éviter les dépendances.

+0

Merci pour la suggestion, mais cela ne fonctionne pas. Cependant, je garderai cela à l'esprit au cas où je rencontrerais un tel problème ^^ (J'ai également vérifié, Unicode est défini par les paramètres du projet dans les deux versions de VC++) – IAE

+0

Les paramètres WinMain semblent faux (à peine liés). la ligne de commande est PTSTR. Peut-être que votre winmain n'est même pas appelé? –

+0

PSTR est en effet ce qui est écrit dans le livre. Et Kirk identifié quel était le problème. VC++ 2010 identifie PSTR comme 'CHAR * PSTR' et PTSTR comme' typedef LPWSTR PTSTR'. Ainsi, au lieu d'une chaîne, l'exemple utilise un caractère *. J'espère que cela a aidé ^^ – IAE

Questions connexes