【问题标题】:CreateWindowEx shows chinese gibberish instead of original textCreateWindowEx 显示中文乱码而不是原始文本
【发布时间】:2014-12-22 10:07:26
【问题描述】:

我有问题。我想记录我的工具开发,所以我想让窗口名称带有日期和时间数据,而不是在屏幕截图上 mspaint-ing 日期。但不是字符串,我只有中文字符。

这是我想将字符串分配给 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  

唯一有用的东西是一个尚未删除的答案,但它给了我这个:

他使用了这个代码:

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

【问题讨论】:

  • 选角不好,mmkay。
  • 还加一个供南方公园参考:D
  • 为了完整性,而不是因为这是一个好主意,解决问题的另一种方法是调用CreateWindowExA而不是CreateWindowEx

标签: c++ winapi direct3d createwindowex


【解决方案1】:

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

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

【讨论】:

  • 这仍然给出连接不匹配的字符串错误
  • “ ”也需要一个 L。
  • @JonathanPotter D0h。 Tnx。
【解决方案2】:

问题是因为你使用 cast 将 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);

【讨论】:

  • 这将无法编译,因为__DATE__ 本身会扩展为char* 字符串。
  • @JonathanPotter:你确定它不会简单地扩展到引用的 string 吗?
  • @Jongware 之所以有效是因为:stackoverflow.com/questions/5179384/… 但是这是未定义的,只有 c99 和更新版本定义了这个:securecoding.cert.org/confluence/display/seccode/…
  • @Jongware:这就是我的意思。它扩展到一个窄字符串,而不是一个宽字符串。如果没有一些宏魔法,你就无法连接 L"foo" "bar"
  • 错误 C2308:将不匹配的字符串也与您的答案连接起来
猜你喜欢
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
相关资源
最近更新 更多