0

我正在编写 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);
    }
4

2 回答 2

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

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

于 2010-06-13T16:03:02.590 回答
1

疯狂猜测:_UNICODE 不是由项目设置定义的。使用 CreateWindowW、RegisterClassW 来避免依赖。

于 2010-06-13T15:53:07.687 回答