【发布时间】:2012-08-09 12:59:26
【问题描述】:
Visual C++ 2012 RC,Win7
简体中文
项目属性> 使用多字节字符集
当我运行这个程序时,窗口的标题显示一个字母“S”,而不是整个单词“Sample”。
#pragma comment(linker, "/SubSystem:Windows")
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int) {
WNDCLASSW wc = { 0 };
wc.style = CS_VREDRAW | CS_HREDRAW;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
wc.hbrBackground = reinterpret_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
wc.lpszClassName = L"MyWindowClass";
wc.lpfnWndProc = [](HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if (uMsg - WM_DESTROY)
return DefWindowProc(hWnd, uMsg, wParam, lParam);
else {
PostQuitMessage(0);
return HRESULT();
}
};
RegisterClassW(&wc);
CreateWindowExW(0, L"MyWindowClass", L"Sample",
WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, SW_SHOW, CW_USEDEFAULT, 0,
nullptr, nullptr, hInstance, nullptr);
for (MSG msg; GetMessage(&msg, nullptr, 0, 0); DispatchMessage(&msg));
}
如果我使用 Unicode(项目属性),保持源代码不变,窗口标题显示“Sample”,看起来正确。
如果我使用多字节,在源代码中我使用 WNDCLASS = { ..., "MyWindowClass" } 和 RegisterClassA,保持 CreateWindowExW 不变,窗口标题显示单词“Sample”,看起来正确。
如果我使用多字节,在源代码中我使用 CreateWindowExA("MyWindowClass", "Sample"),保持 WNDCLASSW 和 RegisterClassW 不变,窗口标题显示字母“S”。
是什么让它显示一个“S”,我做错了什么吗?
追加
如果我保持所有不变,即使用多字节,使用上面显示的代码,窗口标题显示字母“S”。
(如果您运行此程序并在窗口标题上看到“Sample”,而不是“S”,那么它更可能是 vc++ 2012(或 OS)的 chs 版本的特定问题。
【问题讨论】:
-
为什么您发布了正确运行版本的代码?不起作用的版本在诊断问题时会更有用。
-
这看起来很奇怪。使用的 RegisterClass 版本确定它是否是 Unicode 窗口 (
IsWindowUnicode())。 Windows 进行两种方式转换 Unicode ANSI,因此您应该能够混合 Unicode 和 ANSI 函数调用。但是:你为什么要这样做?为什么不只使用其中一个,最好是最后没有 A 和 W 的那些,以便 windows 头文件映射到项目属性中设置的版本(例如RegisterClass- 没有 A 或 W,映射到 @987654324 @ 或RegisterClassW自动)? -
@Joe Gauterin 如果上面发布的代码是正确的,在窗口标题中正确显示“Sample”,那么这可能是 VC++ 2012 RC chs 上的错误。上面发布的代码在我的系统上显示了一个“S”:D
-
@user1345484:您的问题指出,仅当您使用
CreateWindowExA时才会出现问题,但您发布的代码使用CreateWindowExW。 -
@Joe Gauterin 抱歉误导!我将编辑帖子以使其更清晰。顺便说一句,当你运行上面显示的代码时,你的窗口标题会显示一个单词“Sample”还是一个字母“S”?