的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