Win32: окно не появляется - PullRequest
       21

Win32: окно не появляется

0 голосов
/ 13 июня 2010

Я программировал пример кода из книги Фрэнка Луны «Введение в программирование трехмерных игр с помощью DirectX 10».Код является первым примером Win32 в Приложении A: раздел «Программирование Windows».

В настоящий момент программа компилируется под 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);
    }

Ответы [ 2 ]

6 голосов
/ 13 июня 2010

Измените это:

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

Два знака равенства вместо одного.:)

1 голос
/ 13 июня 2010

Дикая догадка: _UNICODE не определяется настройками проекта.Используйте CreateWindowW, RegisterClassW, чтобы избежать зависимости.

...