开始 DirectX 11 游戏编程错误

Posted

技术标签:

【中文标题】开始 DirectX 11 游戏编程错误【英文标题】:Beginning DirectX 11 Game Programming Error 【发布时间】:2012-07-30 22:01:32 【问题描述】:

这是它在第 33 页给我的代码:

#include<Windows.h>

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE prevInstance,
       LPWSTR cmdLine, int cmdShow)

    UNREFERENCED_PARAMETER( prevInstance );
    UNREFERENCED_PARAMETER( cmdLine );
    WNDCLASSEX wndClass =  0 ;
    wndClass.cbSize = sizeof( WNDCLASSEX ) ;
    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc = WndProc;
    wndClass.hInstance = hInstance;
    wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
    wndClass.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 );
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = "DX11BookWindowClass";
    if( !RegisterClassEx( &wndClass ) )
    return -1;
    RECT rc =  0, 0, 640, 480 ;
    AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE );
    HWND hwnd = CreateWindowA( "DX11BookWindowClass", "Blank Win32 Window",
    WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.
    left,
    rc.bottom - rc.top, NULL, NULL, hInstance, NULL );
    if( !hwnd )
    return -1;
    ShowWindow( hwnd, cmdShow );

    return 0;

这段代码给了我 2 个错误-

1>----- 构建开始:项目:BlankWindow,配置:调试 Win32 ------ 1> main.cpp 1>c:\coding\c++\visual c++\directx\blankwindow\blankwindow\main.cpp(10): 错误 C2065: 'WndProc' : 未声明的标识符 1>c:\coding\c++\visual c++\directx\blankwindow\blankwindow\main.cpp(15):错误 C2440:'=': 无法从 'const char [20]' 转换为 'LPCWSTR' 1> 类型 指出是不相关的;转换需要 reinterpret_cast, C 风格转换或函数风格转换 ========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========

基本上

'WndProc' : 未声明的标识符和 '=' : 不能从 'const 转换 char [20]' 到 'LPCWSTR'

这段代码有什么问题?

【问题讨论】:

我将代码放入问题中(而不是使用外部链接)。另外,page 33 指的是什么?你的WndProc 在哪里?你知道windows procedure 是什么吗? 不,我应该在 DirectX 之前知道 WinAPI 吗? @GreyerSting:好吧,既然 DirectX 应用程序根据定义是 windowed,那么了解 windows 的工作原理可能是个好主意;) @GreyerSting:如果您对 WinAPI 和 C++ 没有很好的理解,那么您将很难使用 DirectX。 DirectX 庞大而复杂,仅设置样板代码就需要几百行。 【参考方案1】:

这是您代码的基本工作程序:

#include<Windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

    switch (message)
            
                    case WM_CLOSE:
                            DestroyWindow(hwnd);
                            break;
                    case WM_DESTROY:
                            PostQuitMessage(0);
                            break;
                    default:
                            return DefWindowProc(hwnd,
                                                 message,
                                                 wParam,
                                                 lParam);
            
    return 0;


int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE prevInstance,
       LPSTR cmdLine, int cmdShow)

    UNREFERENCED_PARAMETER( prevInstance );
    UNREFERENCED_PARAMETER( cmdLine );
    WNDCLASSEX wndClass =  0 ;
    wndClass.cbSize = sizeof( WNDCLASSEX ) ;
    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc = WndProc;
    wndClass.hInstance = hInstance;
    wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
    wndClass.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 );
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = "DX11BookWindowClass";
    if( !RegisterClassEx( &wndClass ) )
    return -1;
    RECT rc =  0, 0, 640, 480 ;
    AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE );
    HWND hwnd = CreateWindowA( L"DX11BookWindowClass", L"Blank Win32 Window",
    WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.
    left,
    rc.bottom - rc.top, NULL, NULL, hInstance, NULL );
    if( !hwnd )
    return -1;
    ShowWindow( hwnd, cmdShow );
    MSG msg;
    while (GetMessage (&msg, 0, 0, 0))
            
                TranslateMessage (&msg);
                DispatchMessage (&msg);
            
    return msg.wParam;

积分:

    我添加了一个WndProc,它处理发送到您的程序的所有消息。

    我在您的程序中添加了message loop。否则,窗口会立即关闭。

    我按照 the_mandrill 在另一个答案中的建议添加了 L 前缀。

这几乎就是您的 WinAPI 编程的“Hello World”。不过,我强烈建议您在开始 DirectX 编程之前先学习 WinAPI。

【讨论】:

【参考方案2】:

问题是该项目正在构建为Unicode,但您的代码是非Unicode。换句话说,Windows API 调用需要宽(即 16 位)字符串,但您的代码使用 8 位字符串('char')。 LPCWSTR 表示指向常量宽字符串的长指针。所以函数调用需要一个恒定的宽字符串,但您传递的是一个 8 位字符串。你有两个选择:

更改项目以使用非 Unicode 库(属性 -> 常规 -> 字符集 = '使用多字节') 修复您的代码以使其成为 Unicode。在这种情况下,通过更改字符串,它会抱怨将它们变成宽字符串。您可以通过在它们前面加上L 来做到这一点,例如L"DX11BookWindowClass"

【讨论】:

谢谢,第二个解决了这个问题。不过,我仍然在使用 WndProc 时遇到问题。

以上是关于开始 DirectX 11 游戏编程错误的主要内容,如果未能解决你的问题,请参考以下文章

开始现代游戏编程和应用程序编程的最佳方式是啥? [关闭]

学习游戏开发应该从哪些方面入手

如何制作小游戏

dx12环境是啥意思

吃豆人游戏:处理编程语言和ActionScript

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记7——DirectInput&纹理映射