WIN32中标题栏无法显示unicode

问题描述 投票:0回答:1

我一直在尝试创建一个标题栏可以是任何语言的窗口。但我得到了类似 ▯* 的信息。到目前为止,我写作的是转义字符。我正在证明代码的完整性。

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <string>

LRESULT CALLBACK WindowProc(HWND Window, UINT Message, WPARAM WParam, LPARAM LParam) {
    switch(Message) {
        case WM_KEYDOWN: {
            switch(WParam) { 
                case 'O': { 
                    DestroyWindow(Window); 
                } break; 
            }
        } break;
        case WM_DESTROY: { 
            PostQuitMessage(0); 
        } break;
        default: { 
            return DefWindowProc(Window, Message, WParam,  LParam); 
        }
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE Instance, HINSTANCE PrevInstance, PSTR CmdLine, int CmdShow) {

    WNDCLASSW WindowClass = {0};
    const wchar_t* ClassName = L"MyWindowClass";

    WindowClass.lpfnWndProc = WindowProc;
    WindowClass.hInstance = Instance;
    WindowClass.lpszClassName = ClassName;
    WindowClass.hCursor = LoadCursor(NULL, IDC_CROSS);
    MessageBoxW(0, L"\u0906\u092a", L"\u0906\u092a", 0);

    if(!RegisterClassW(&WindowClass)) {
        MessageBoxW(0, L"RegisterClass failed", 0, 0);
        return GetLastError();
    }
    
    HWND Window = CreateWindowExW(0, ClassName, L"\u0906\u092a",
                                 WS_OVERLAPPEDWINDOW|WS_VISIBLE,
                                 CW_USEDEFAULT, CW_USEDEFAULT,
                                 CW_USEDEFAULT, CW_USEDEFAULT,
                                 0, 0, Instance, 0);
    
    if(!Window) {
        MessageBoxW(0, L"CreateWindowEx failed", 0, 0);
        return GetLastError();
    }
    
    int Running = 1;
    
    while(Running) {
        MSG Message;
        while(GetMessageW(&Message, NULL, 0, 0)) {
            if(Message.message == WM_QUIT) Running = 0;
            TranslateMessage(&Message);
            DispatchMessage(&Message);
        }
    }
    
    return 0;
}

我期待标题栏是类似“आप”的东西

c++ winapi hwnd createwindow
1个回答
0
投票

您无意中混合了 ansi 和宽字符 api 可能是由于项目设置不正确。我的一般建议是尽可能明确使用函数名称末尾由 W 标注的宽字符函数(例如:

CreateWindowW
GetMessageW
)。否则,您必须始终使用提供的兼容性宏,或者绝对确定
UNICODE
_UNICODE
预处理器指令已正确定义。 这可能是许多人说它在他们的机器上运行的原因。当启用 unicode 定义时,使用宽字符函数会成功。可以使用 ansi 函数而不是宏来重现您的问题。

您的代码片段仍然有两个地方必须使用宽字符函数来支持 unicode 标题。

DefWindowProc
宏应变为
DefWindowProcW
,而
DispatchMessage
宏应变为
DispatchMessageW
。一个例外是
LoadCursor
宏,由于对资源
IDC_CROSS
的依赖,它需要保持宏形式。

仅供参考:消息循环周围的双 while 是不必要的,因为当调用

GetMessageW
时,
PostQuitMessage(0)
返回 0,从而自动结束消息循环。

© www.soinside.com 2019 - 2024. All rights reserved.