2010-06-13 191 views
0

我正在編寫Frank Luna的書「使用DirectX 10進行3D遊戲編程的介紹」中的示例代碼。該代碼是附錄A:Windows編程部分中的第一個Win32示例。Win32:沒有窗口出現

現在,程序在VC++ 2008/2010下編譯,但沒有出現窗口,雖然調試會話已經開始,我必須強制關閉它。我不知道它在哪裏,我沒有使用Win32控制檯模式,我已經關閉了所有其他窗口,並且沒有其他IDE或VC++會話正在運行。

任何想法,爲什麼這可能會發生? PS:我也檢查過我的過程。它確實在運行。

#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

不是每個人都有這本書。你可以發佈一些代碼嗎?或者會違反版權法? – 2010-06-13 15:39:33

+0

我不這麼認爲。增加了代碼。 – IAE 2010-06-13 15:44:24

回答

6

更改此:

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

兩個等號,而不是一個。 :)

+0

DAMN IT。我討厭那些錯誤!爾加!現在就開始工作,接受你的答案。非常感謝! – IAE 2010-06-13 16:04:33

+2

使用:if(0 == ghMainWnd)// ...'而不是爲了防止這樣的問題 - 如果省略第二個'=',它將不會編譯(因爲這會嘗試將某個值賦給'0',這是不允許的)。 – 2010-06-13 16:16:16

+0

+1是個好主意。立即採用這一點。 – IAE 2010-06-13 16:29:19

1

瘋狂的猜測:_UNICODE不是由項目設置定義的。使用CreateWindowW,RegisterClassW來避免依賴性。

+0

感謝您的建議,但這不起作用。但是,我會記住,以防萬一我遇到過這樣的問題^^(我也檢查過,Unicode是由兩個版本的VC++中的項目設置定義的) – IAE 2010-06-13 15:57:31

+0

WinMain參數雖然(幾乎沒有關係)似乎錯了。命令行是PTSTR。也許你的勝利領域甚至沒有被稱爲? – 2010-06-13 16:04:09

+0

PSTR的確是書中寫的。並且kirk確定了問題所在。 VC++ 2010將PSTR標識爲「CHAR * PSTR」,將PTSTR標識爲「typedef LPWSTR PTSTR」。因此,而不是字符串示例使用char *。希望幫助^^ – IAE 2010-06-13 16:18:07