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

时间:2014-12-22 10:07:26

标签: c++ winapi direct3d createwindowex

我有问题。我想记录我的工具开发,因此我不想在屏幕截图上添加日期,而是希望使窗口名称包含日期和时间数据。但不是字符串我只有中文字符。

gibberish

这是我的代码,我想将字符串分配给CreateWindowEx():

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

hWnd = CreateWindowEx(NULL,
                      L"WindowClass",
                      (LPCWSTR)wndName,
                      WS_OVERLAPPEDWINDOW,
                      300,
                      300,
                      wr.right - wr.left,
                      wr.bottom - wr.top,
                      NULL,
                      NULL,
                      hInstance,
                      NULL);
编辑:伙计们,我感谢你的回答,但他们都给了我这个

Error 29 error C2308: concatenating mismatched strings  

并且唯一有点工作的东西是一个尚未删除的答案,但它给了我这个:

enter image description here

他使用了这段代码:

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

2 个答案:

答案 0 :(得分:4)

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

Visual Studio不是这种情况。这是一个错误。

您需要使用一个宽字符串,并为每个字符串文字添加L前缀,包括宏:

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

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

答案 1 :(得分:1)

问题是因为您使用强制转换将char转换为LPCWSTR,替换

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

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

现在,你不需要在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);