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
相关产品推荐
相关产品推荐

