Win32:没有窗口出现

时间:2010-06-13 15:36:49

标签: windows visual-c++ winapi directx-10

我正在编写Frank Luna的书“使用DirectX 10进行3D游戏编程简介”中的示例代码。代码是附录A:Windows编程部分中的第一个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);
    }

2 个答案:

答案 0 :(得分: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; 
        } 

两个等号而不是一个。 :)

答案 1 :(得分:1)

狂野猜测:_UNICODE未由项目设置定义。使用CreateWindowW,RegisterClassW来避免依赖。