创建一个带有英文标题栏的 Win32 Window 应用程序,但标题栏突然变成了中文。怎么会?

Posted

技术标签:

【中文标题】创建一个带有英文标题栏的 Win32 Window 应用程序,但标题栏突然变成了中文。怎么会?【英文标题】:Creating a Win32 Window app with English title bar, but the title bar becomes Chinese out of nowhere. How come? 【发布时间】:2010-01-21 17:27:37 【问题描述】:
HWND wndHandle; //global variable

// code snipped

WNDCLASSEX wcex;

// code snipped

wcex.lpszClassName = (LPCWSTR) "MyTitleName";

 // code snipped

wndHandle = CreateWindow(
            (LPCWSTR)"MyTitleName",     //the window class to use
            (LPCWSTR)"MyTitleName",     //the title bar text
...
...

我正在关注 Win32 Window 应用程序的教程。上面的代码用于设置窗口画面的标题栏名称。编译器对我大喊:“无法从 'const char [12]' 转换为 'LPCWSTR'”,好吧,我用 (LPCWSTR) 对字符串“MyTitleName”进行了类型转换,一切都编译得很好。但是,在运行期间,窗口屏幕的标题竟然是汉字。我试着改变字符串,汉字总是根据我的字符串改变。我正在使用 XP Visual C++ 2008 Express Edition,并且我将英语(美国)作为非 unicode 程序的设置。我不明白。字符串怎么变成中文了?

【问题讨论】:

【参考方案1】:

您的应用程序正在编译为 unicode 应用程序(在项目设置中定义)。这意味着您传递给 Windows API 函数的字符串需要是宽字符串,指定如下:L"MyTitleName"。您不能强制转换为 LPCWSTR,因为这实际上不会更改字符串类型,它只会尝试将字符串作为不是的东西传递出去。

这段代码应该可以工作:

wcex.lpszClassName = L"MyTitleName";

 // code snipped

wndHandle = CreateWindow(
            L"MyTitleName",     //the window class to use
            L"MyTitleName",     //the title bar text
            ...

如果您想使用教程中的原始代码而不修改它,您可以禁用 unicode 模式:在项目属性中转到“常规”选项卡,并将 Character Set 设置为 Use Multi-Byte Character Set。不要为将来可能必须支持其他语言的任何程序执行此操作。

【讨论】:

【参考方案2】:

那是因为你的 (LPCWSTR) 演员。那只是让编译器关闭,告诉你你做错了什么。该字符串仍然不是 Unicode 字符串,也不会被强制转换。修复:

wcex.lpszClassName = L"MyTitleName";
wndHandle = CreateWindow(
              L"MyTitleName",     //the window class to use
              L"MyTitleName",     //the title bar text

【讨论】:

以上是关于创建一个带有英文标题栏的 Win32 Window 应用程序,但标题栏突然变成了中文。怎么会?的主要内容,如果未能解决你的问题,请参考以下文章

c++ win32输出一个文本

如何从 Perl 完全改变 Win32 标题栏的外观?

带有子控件的 Win32 自定义控件

Qt 4:移动没有标题栏的窗口

创建带有 2 行的大标题导航栏的问题 |斯威夫特 5

如何在 Win32 窗口中实现 MFC 资源?