Visual C++ 2012 RC, Win7C++: Dlaczego ten tytuł okna zostanie obcięty?
chiński uproszczony
Właściwości projektu> użyj wielofunkcyjnego charakteru bajt ustawiony
Kiedy uruchomić ten program, tytuł okna pokazuje pojedynczą literę "S", a nie cały słowo "Próbka".
#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));
}
Gdybym używać Unicode (Właściwości projektu), zachować bez zmian kodu źródłowego, tytuł okna pokazuje „próbka”, wygląda poprawnie.
Jeśli używam wielu bajtów, w kodzie źródłowym używam WNDCLASS = {..., "MyWindowClass"} i RegisterClassA, utrzymuję CreateWindowExW niezmieniony, tytuł okna pokazuje słowo "Sample", wygląda poprawnie.
Jeśli używam wielu bajtów, w kodzie źródłowym używam CreateWindowExA ("MyWindowClass", "Sample"), utrzymuj WNDCLASSW i RegisterClassW niezmienione, tytuł okna pokazuje literę "S".
Co sprawia, że pokazuje się pojedyncze "S", czy robię coś nie tak?
Dołącz
Gdybym zachować wszystko bez zmian, czyli używać wielu bajt, kod użytkowania przedstawionego powyżej, tytuł okna pokazuje litery „S”.
(Jeśli uruchomisz ten program i zobaczysz "Przykład" w tytule okna, zamiast "S", to jest bardziej prawdopodobny konkretny problem z wersją chs vC++ 2012 (lub OS)).
Dlaczego opublikowałeś kod wersji, która działa poprawnie? Wersja, która nie działa, byłaby o wiele bardziej użyteczna w diagnozowaniu problemu. –
To wygląda dziwnie. Używana wersja RegisterClass określa, czy jest to okno Unicode ('IsWindowUnicode()'), czy też nie. Windows robi dwukierunkowe tłumaczenie Unicode <-> ANSI, więc powinieneś móc mieszać wywołania funkcji Unicode i ANSI. Ale: dlaczego miałbyś to robić? Czemu po prostu nie użyć jednego z nich, najlepiej tych bez A i W na końcu, tak aby pliki nagłówkowe okien były odwzorowane do wersji ustawionej we właściwościach projektu (np. 'RegisterClass' - bez A lub W, mapowanie do' RegisterClassA 'lub' RegisterClassW' automatycznie)? –
@Joe Gauterin Jeśli powyższy kod jest poprawny, poprawnie pokazuje "Sample" w tytule okna, to może to błąd w VC++ 2012 RC chs. Powyższy kod pokazuje pojedynczą literę "S" w moim systemie: D – WangZm