簡體   English   中英

影響窗口標題的C ++指針問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM