以下使用Unicode字符集的书籍示例

时间:2013-05-11 04:59:24

标签: windows

我正在读一本名为“使用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'
希望有人可以帮助我

2 个答案:

答案 0 :(得分:1)

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

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

    您可以在预编译标题的顶部执行此操作

    #define UNICODE
    #define _UNICODE
    

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

  2. 所有字符串(文字和其他字符串)都需要是Unicode字符串。

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

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

  3. 看起来你已经完成了大部分工作。罪魁祸首是mMainWndCaption.c_str()。您正在使用std::string(返回以char为单位的以空字符结尾的数组)而不是std::wstring(返回以wchar_t为单位的以空字符结尾的数组。)

答案 1 :(得分: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);