You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WIN32程序标题栏无法显示Unicode字符问题求助

解决WIN32窗口多语言标题栏乱码问题

你的代码中MessageBoxW能正常显示印地语आप,但窗口标题栏出现乱码,核心原因是窗口类默认的非客户区字体不支持目标Unicode字符,同时编译环境的Unicode宏定义不够完整。以下是具体修复方案:

1. 强制启用Unicode编译

在代码开头添加Unicode宏定义,确保所有WIN32 API默认使用宽字符版本,避免隐式转换隐患:

#define UNICODE
#define _UNICODE

2. 为窗口类指定多语言友好字体

Windows默认窗口类字体可能不支持印地语等非拉丁语系字符,需手动指定支持全Unicode的系统字体(如Segoe UI)。修改窗口类注册代码,添加字体加载逻辑:

// 注册窗口类前创建Segoe UI字体
HFONT hGuiFont = CreateFontW(
    -12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
    DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
    DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
    L"Segoe UI"
);
WindowClass.hFont = hGuiFont;

3. 优化后的完整代码

#define WIN32_LEAN_AND_MEAN
#define UNICODE
#define _UNICODE
#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: { 
            // 销毁窗口时释放字体资源
            DeleteObject(GetClassLongPtr(Window, GCLP_HFONT));
            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);

    // 创建支持多语言的Segoe UI字体
    HFONT hGuiFont = CreateFontW(
        -12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
        DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
        DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
        L"Segoe UI"
    );
    WindowClass.hFont = hGuiFont;

    MessageBoxW(0, L"\u0906\u092a", L"\u0906\u092a", 0);

    if(!RegisterClassW(&WindowClass)) {
        MessageBoxW(0, L"RegisterClass failed", 0, 0);
        DeleteObject(hGuiFont); // 注册失败时释放字体
        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);
        DeleteObject(hGuiFont); // 创建失败时释放字体
        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;
}

额外说明

  • 若不想手动创建字体,可改用系统默认UI字体(兼容性略差):
    WindowClass.hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
    
  • 确保Windows系统已安装印地语语言包(现代Windows版本默认包含,旧版本可在设置中添加)。

内容的提问来源于stack exchange,提问作者Ashutosh Jha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:45:38