[英]C++ pointers issue affecting window title
我有這個問題讓我很生氣,所以我來這里尋求你的幫助。 我有這個代碼,應該創建一個簡單的窗口並顯示它:
void ShowMainWindow() {
WNDCLASSEX main_window_class; // New window class for the splash window //
main_window_class.cbSize = sizeof(WNDCLASSEX); // Set size of the splash window class //
main_window_class.style = CS_PARENTDC|CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; // Main window class style //
main_window_class.lpfnWndProc = MainProc; // Pointer to the main window procedure //
main_window_class.cbClsExtra = 0; // No extra bytes after class structure //
main_window_class.cbWndExtra = 0; // No extra bytes after window's instance //
main_window_class.hInstance = Instance; // Set instance of the window //
main_window_class.hIcon = LoadIcon(Instance, MAKEINTRESOURCE(MICON)); // Executable's icon //
main_window_class.hCursor = LoadCursor(NULL, IDC_ARROW); // Main window's default cursor //
main_window_class.hbrBackground = HBRUSH(COLOR_WINDOW + 1); // Main window's default background //
main_window_class.lpszClassName = L"MyAppClass"; // Main window's class name //
main_window_class.hIconSm = LoadIcon(Instance, MAKEINTRESOURCE(SICON)); // Application's small icon //
if (!RegisterClassEx(&main_window_class)) { // If the class was not registered //
MessageBox(NULL, L"RegisterClassEx", L"Error", MB_OK|MB_ICONERROR);
}
MainWindow = CreateWindowEx ( // Create the main window //
WS_EX_APPWINDOW, // Extended style to support transparency //
main_window_class.lpszClassName, // Assign the anterior class name //
(WCHAR*)"App Title", // Main window's title //
WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, // No border window //
CW_USEDEFAULT, // Default left position for the moment //
CW_USEDEFAULT, // Default top position for the moment //
600, // Main window width //
400, // Main window height //
NULL, // No parent //
NULL, // No ID //
Instance, // Assign to main instance //
NULL // No additional data needed //
);
if (!MainWindow) { // If the window was not created //
MessageBox(NULL, L"CreateWindowEx", L"Error", MB_OK|MB_ICONERROR);
}
long Style = GetWindowLong(MainWindow, GWL_STYLE);
Style &= ~WS_MAXIMIZEBOX;
SetWindowLong(MainWindow, GWL_STYLE, Style);
ShowWindow(MainWindow, SW_SHOWNORMAL); // Display main window at normal size //
UpdateWindow(MainWindow); // Update the window's client area //}
我的問題是,當窗口打開時,窗口的標題不是“應用程序標題”,而是一些奇怪的字符加上“ CreateWindowEx ”。 太奇怪了。 就像它將MessageBox函數中的文本分配給窗口的標題一樣。 我必須指定我使用UNICODE編碼。 無論如何,它從來沒有發生在我身上,我只是不知道什么是錯的。 謝謝!
(WCHAR*)"App Title"
是錯誤的。 "App Title"
是一個ANSI字符串,而您的項目默認設置為對Windows API使用Unicode,因此CreateWindowEx
需要WCHAR *
,即Unicode字符串。
因此,要傳遞的正確參數是L"App Title"
; 需要L
前綴才能使編譯器提供寬(~Unicode)字符串文字而不是“常規”字符串文字。
我想你試過一個“常規”字符串文字,編譯器告訴你它無法將它轉換為const WCHAR_T *
而你只是在它前面貼了一個演員。 這是解決這類問題的錯誤方法 ; 如果讓編譯器抱怨指針類型,幾乎總是你錯了 ,只是拋出指針使編譯器閉嘴不會解決問題。 盲目地轉換指針會刪除類型系統的“安全網”,並允許您將錯誤的數據傳遞給函數。
在這種特殊情況下,ANSI字符串的字節(以及堆棧中的其他數據)被解釋為Unicode,這導致標題欄中出現垃圾。
再說一遍:在施法前三思而后行
您不能將const char*
WCHAR*
轉換為WCHAR*
。
您需要用L"App Title"
替換(WCHAR*)"App Title"
L"App Title"
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.