C++ C++;影响窗口标题的指针问题

C++ C++;影响窗口标题的指针问题,c++,winapi,pointers,title,C++,Winapi,Pointers,Title,我有一个让我发疯的问题,所以我来这里寻求你的帮助。我有一段代码,用来创建一个简单的窗口并显示它: void ShowMainWindow() { WNDCLASSEX main_window_class; // New window class for the splash window // main_window_class.cbSize =

我有一个让我发疯的问题,所以我来这里寻求你的帮助。我有一段代码,用来创建一个简单的窗口并显示它:

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编码。不管怎么说,我以前从未遇到过这种情况,我只是不知道会出什么问题。谢谢

您不能将
const char*
强制转换为
WCHAR*

您需要将
(WCHAR*)“App Title”
替换为
L“App Title”
(WCHAR*)“App Title”
错误<代码>“应用程序标题”是一个ANSI字符串,而您的项目设置为默认情况下对Windows API使用Unicode,因此
CreateWindowEx
需要一个
WCHAR*
,即Unicode字符串

因此,要传递的正确参数是
L“App Title”
;需要使用
L
前缀使编译器提供宽(~Unicode)字符串文字,而不是“常规”字符串文字

我假设您尝试使用“常规”字符串文字,编译器告诉您它无法将其转换为
const WCHAR\t*
,您只需在其前面粘贴一个强制转换这是解决此类问题的错误方法,而仅仅抛出指针使编译器关闭并不能解决问题。盲目地投射指针会移除类型系统的“安全网”,并允许您向函数传递错误的数据

在这种特殊情况下,ANSI字符串的字节(以及堆栈上的其他数据)被解释为Unicode,这导致标题栏中出现垃圾


再次提醒:在施法之前要三思。

如果我想使用一个已定义的常量而不是“应用程序标题”,该怎么办?我不能使用L(TITLE\u常量)或(L)TITLE\u常量。
TEXT(TITLE\u常量)
应该可以工作。或者您可以
#定义标题\u常量L“我的窗口标题”
,谢谢大家!指针不是我的强项