我一直在尝试创建一个标题栏可以是任何语言的窗口。但我得到了类似 ▯* 的信息。到目前为止,我写作的是转义字符。我正在证明代码的完整性。
#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;
}
我期待标题栏是类似“आप”的东西
您无意中混合了 ansi 和宽字符 api 可能是由于项目设置不正确。我的一般建议是尽可能明确使用函数名称末尾由 W 标注的宽字符函数(例如:
CreateWindowW
、GetMessageW
)。否则,您必须始终使用提供的兼容性宏,或者绝对确定UNICODE
和_UNICODE
预处理器指令已正确定义。 这可能是许多人说它在他们的机器上运行的原因。当启用 unicode 定义时,使用宽字符函数会成功。可以使用 ansi 函数而不是宏来重现您的问题。
您的代码片段仍然有两个地方必须使用宽字符函数来支持 unicode 标题。
DefWindowProc
宏应变为 DefWindowProcW
,而 DispatchMessage
宏应变为 DispatchMessageW
。一个例外是 LoadCursor
宏,由于对资源 IDC_CROSS
的依赖,它需要保持宏形式。
仅供参考:消息循环周围的双 while 是不必要的,因为当调用
GetMessageW
时,PostQuitMessage(0)
返回 0,从而自动结束消息循环。