2010-06-13 2 views
0

프랭크 루나 (Frank Luna)의 "Introduction to 3D Game Programming with DirectX 10"에서 예제 코드를 프로그래밍하고 있었다. 이 코드는 부록 A : Windows 프로그래밍 섹션의 첫 번째 Win32 예제입니다.Win32 : 윈도우가 나타나지 않는다.

현재 프로그램은 VC++ 2008/2010에서 컴파일되지만 디버그 세션이 시작되었지만 강제로 닫아야 만하는 창이 나타나지 않습니다. 나는 그것이 어디 있는지 모르지만, Win32 콘솔 모드를 사용하지 않고, 다른 모든 창을 닫았으며 다른 IDE 나 VC++의 세션이 실행되고 있지 않습니다.

왜 이런 일이 벌어지고 있는지 알 수 있습니까?

추신 : 내 프로세스도 확인했습니다. 실제로 실행 중입니다.

#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

누구나 책을 갖고있는 것은 아닙니다. 몇 가지 코드를 게시 할 수 있습니까? 아니면 저작권법을 위반 했습니까? –

+0

나는 그렇게 생각하지 않는다. 코드 추가. – IAE

답변

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

젠장. 나는 그 실수가 싫어! 가! 이제 작동하여 답변을 수락하십시오. 고마워요! – IAE

+2

사용 :'if (0 == ghMainWnd) // ...'대신 다음과 같은 문제를 방지하십시오. 두 번째'''를 생략하면 컴파일되지 않습니다. '0'은 허용되지 않음). –

+0

+1 좋은 생각입니다. 즉시이를 채택하십시오. – IAE

1

야생 설정 : _UNICODE는 프로젝트 설정에 의해 정의되지 않습니다. 종속성을 피하려면 CreateWindowW, RegisterClassW를 사용하십시오.

+0

제안 해 주셔서 감사합니다. 그러나이 방법은 효과가 없습니다. 그러나, 내가 이런 문제에 직면했을 때를 염두에 두겠다. ^^ (나는 유니 코드가 VC++의 두 버전에서 프로젝트 설정에 의해 정의되었다.) – IAE

+0

WinMain 매개 변수가 잘못된 것 같지만 (거의 관련이 없다). 명령 행은 PTSTR입니다. 아마도 당신의 윈메인은 불려지지 않았을까요? –

+0

실제로 PSTR은이 책에 쓰여진 내용입니다. 그리고 커크는 문제가 무엇인지 확인했습니다. VC++ 2010은 PSTR을'CHAR * PSTR' 및 PTSTR을'typedef LPWSTR PTSTR'로 식별합니다. 따라서 문자열 대신에 char *을 사용합니다. 희망이 도움이 ^^ – IAE

관련 문제