0

我正在阅读一本名为“DirectX 9.0c 3D 游戏编程简介:一种着色器方法”的书,我正在遵循那里的代码,但该应用程序使用了多字节字符集,我从某个地方读到这不是一个好习惯在创建窗口时使用它并且我有错误。这是我有错误的代码。

mhMainWnd = CreateWindow(L"D3DWndClassName", mMainWndCaption.c_str(), WS_OVERLAPPEDWINDOW, 
            GetSystemMetrics(SM_CXSCREEN)/2 - width/2, 
            GetSystemMetrics(SM_CYSCREEN)/2 - height/2,
            R.right, R.bottom, 0, 0, mhAppInst, 0); 

那么错误是:

error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [16]' to 'LPCWSTR'

希望可以有人帮帮我

4

2 回答 2

1

您听说 Unicode 优于 ANSI/MBCS 是完全正确的。所有新的 Windows 代码都应编写为使用 Unicode。为了实现这一点,您必须确保两件事:

  1. UNICODE和符号都_UNICODE需要全局定义,以确保调用 API 函数的 Unicode 版本,即使您忘记了W后缀。

    您可以在预编译头文件的顶部执行此操作

    #define UNICODE
    #define _UNICODE
    

    或在 Visual Studio 中项目的“属性”窗口中。只需将两个值都添加到列表中。

  2. 您的所有字符串(包括文字和其他)都必须是 Unicode 字符串。

    对于文字,您可以通过在它们前面加上 L 来完成此操作,就像您在示例中所做的那样:L"D3DWndClassName"

    对于在运行时分配的字符串,您需要使用wchar_t类型。由于您使用的是 C++,因此显然应该使用字符串类,而不是像在 C 中那样使用原始字符数组。因此,您需要使用字符串类,将字符串中的字符视为wchar_t. 这可能是std::wstringMFC/ATL/WTL 的CStringW类。

看起来你已经掌握了大部分内容。罪魁祸首是mMainWndCaption.c_str()。您正在使用std::string(它返回一个以 nul 结尾的chars 数组)而不是std::wstring(它返回一个以 nul 结尾的 s 数组wchar_t)。

于 2013-05-11T07:48:11.397 回答
0

将您的项目更改为 ANSI 或 MBCS 而不是 UNICODE,然后更改

L"D3DWndClassName"

"D3DWndClassName"

或者,将您的项目属性保留为 UNICODE,但使用窗口标题的 UNICODE 字符串 - 所以

CString szCaption(mMainWndCaption.c_str());   // CString is actually CStringW in UNICODE build

mhMainWnd = CreateWindow(L"D3DWndClassName", szCaption, WS_OVERLAPPEDWINDOW, 
            GetSystemMetrics(SM_CXSCREEN)/2 - width/2, 
            GetSystemMetrics(SM_CYSCREEN)/2 - height/2,
            R.right, R.bottom, 0, 0, mhAppInst, 0); 
于 2013-05-11T06:20:55.203 回答