C++ CreateWindowEx显示中文乱码而不是原始文本

C++ CreateWindowEx显示中文乱码而不是原始文本,c++,winapi,direct3d,createwindowex,C++,Winapi,Direct3d,Createwindowex,我有个问题。我想记录我的工具开发,所以我不想在屏幕截图上画一个日期,我想让窗口名包含日期和时间数据。但是我没有用字符串,而是用汉字 下面是我要将字符串分配给CreateWindowEx()的代码: 编辑:伙计们,我很感谢你们的回答,但他们都给了我这个答案 Error 29 error C2308: concatenating mismatched strings 唯一能起作用的是一个被删除的答案,但它给了我这个: 他使用了这个密码: char title[256]; sprintf(t

我有个问题。我想记录我的工具开发,所以我不想在屏幕截图上画一个日期,我想让窗口名包含日期和时间数据。但是我没有用字符串,而是用汉字

下面是我要将字符串分配给CreateWindowEx()的代码:

编辑:伙计们,我很感谢你们的回答,但他们都给了我这个答案

Error 29 error C2308: concatenating mismatched strings  
唯一能起作用的是一个被删除的答案,但它给了我这个:

他使用了这个密码:

char title[256];
sprintf(title, "Asphyx V0.01 (Build Date:  %s - %s)", __DATE__, __TIME__);

hWnd = CreateWindowEx(NULL,
                      L"WindowClass",
                      title,
                      WS_OVERLAPPEDWINDOW,
                      300,
                      300,
                      wr.right - wr.left,
                      wr.bottom - wr.top,
                      NULL,
                      NULL,
                      hInstance,
                      NULL);

问题是因为您正在使用cast将char转换为LPCWSTR,请替换

char *wndName = "Asphyx V0.01 (Build Date: " __DATE__ " " __TIME__ ")\0";

现在您不需要在CreateWindowEx的第二个参数中进行更多的强制转换

wchar_t *wndName = L"Asphyx V0.01 (Build Date: " __DATE__ " " __TIME__ ")";

hWnd = CreateWindowEx(NULL,
                  L"WindowClass",
                  wndName,
                  WS_OVERLAPPEDWINDOW,
                  300,
                  300,
                  wr.right - wr.left,
                  wr.bottom - wr.top,
                  NULL,
                  NULL,
                  hInstance,
                  NULL);

问题是因为您正在使用cast将char转换为LPCWSTR,请替换

char *wndName = "Asphyx V0.01 (Build Date: " __DATE__ " " __TIME__ ")\0";

现在您不需要在CreateWindowEx的第二个参数中进行更多的强制转换

wchar_t *wndName = L"Asphyx V0.01 (Build Date: " __DATE__ " " __TIME__ ")";

hWnd = CreateWindowEx(NULL,
                  L"WindowClass",
                  wndName,
                  WS_OVERLAPPEDWINDOW,
                  300,
                  300,
                  wr.right - wr.left,
                  wr.bottom - wr.top,
                  NULL,
                  NULL,
                  hInstance,
                  NULL);

根据标准,如果其中一个字符串具有编码前缀,则不具有编码前缀的其余字符串将被视为具有相同的前缀

VisualStudio并非如此。这是一只虫子

您需要使用宽字符串,并在每个字符串文字前面加上
L
,包括宏:

#define WSTR2( s ) L##s
#define WSTR( s ) WSTR2( s )

wchar_t *wndName = L"Asphyx V0.01" WSTR(__DATE__) L" " WSTR(__TIME__) L")";

根据标准,如果其中一个字符串具有编码前缀,则不具有编码前缀的其余字符串将被视为具有相同的前缀

VisualStudio并非如此。这是一只虫子

您需要使用宽字符串,并在每个字符串文字前面加上
L
,包括宏:

#define WSTR2( s ) L##s
#define WSTR( s ) WSTR2( s )

wchar_t *wndName = L"Asphyx V0.01" WSTR(__DATE__) L" " WSTR(__TIME__) L")";


铸造不好,嗯。对于南部公园参考:D完整性也加上一个:不是因为这是一个好主意,解决问题的另一种方法是调用
CreateWindowExA
,而不是
CreateWindowEx
。铸造不好,嗯。对于南部公园参考:D完整性也加上一个:不是因为这是一个好主意,另一种解决问题的方法是调用
CreateWindowExA
而不是
CreateWindowEx
。这将无法编译,因为
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>本身扩展为
char*
字符串。@JonathanPotter:你确定它未定义,只有c99和更新版本定义了:@Jongware:这就是我的意思。它扩展为窄字符串,而不是宽字符串。而且你不能把
L“foo”“bar”
没有一些宏魔法。错误C2308:将不匹配的字符串与您的答案连接在一起将无法编译,因为
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>本身扩展为
char*
字符串。@JonathanPotter:您确定它不是简单地扩展为带引号的字符串吗?@Jongware它可以工作是因为:但是,只有c99和更新版本定义了这个:@Jongware:这就是我的意思。它扩展为窄字符串,而不是宽字符串。如果没有一些宏魔法,你就无法连接
L“foo”“bar”
。错误C2308:将不匹配的字符串与答案连接起来仍然会导致连接不匹配的字符串错误“”也需要一个L。@JonathanPotter D0h。Tnx.this仍然会导致串接不匹配的字符串错误“”也需要一个L。@JonathanPotter D0h。Tnx。