的Visual C++ 2012 RC,Win7的C++:为什么这个窗口标题被截断?
中国简化
项目属性>使用多字节字符集
当我运行这个程序,窗口的标题显示了一个字母“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(Project Properties),保持源代码不变,窗口标题显示“Sample”,看起来正确。
如果我使用多字节,在源代码中我使用WNDCLASS = {...,“MyWindowClass”}和RegisterClassA,保持CreateWindowExW不变,窗口标题显示单词“Sample”,看起来正确。
如果我使用多字节,在源代码中使用CreateWindowExA(“MyWindowClass”,“Sample”),保持WNDCLASSW和RegisterClassW不变,窗口标题显示字母“S”。
什么使它显示一个单一的“S”,我做错了什么?
追加
如果我把所有不变,即使用多字节,如上图所示使用代码,窗口标题显示字母“S”。 (如果你运行这个程序并在窗口标题上看到“Sample”而不是“S”,那么它更可能是chc版本的vC++ 2012(或OS)上的一个特定问题)。
为什么你发布的版本的代码工作正常?不起作用的版本在诊断问题时会更有用。 – 2012-08-09 13:14:24
这看起来很奇怪。使用的RegisterClass版本决定它是否是Unicode窗口('IsWindowUnicode()')或不是。 Windows可以双向转换Unicode <-> ANSI,因此您应该可以混合使用Unicode和ANSI函数调用。但是:你为什么要这样做?为什么不使用其中的一个,最好是最后没有A和W的那个,这样窗口头文件就映射到项目属性中设置的版本(例如'RegisterClass' - 没有A或W,映射到'RegisterClassA '或'RegisterClassW'自动)? – 2012-08-09 13:24:05
@Joe Gauterin如果上面贴出的代码是正确的,在窗口标题中正确显示“Sample”,那么这可能是VC++ 2012 RC chs中的一个错误。上面显示的代码显示了我的系统上的单个“S”:D – WangZm 2012-08-09 13:29:29