大佬们,这个窗口程序只能输入字母,如何才能输入中文?

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	static std::string str;
	
	switch(message)  //处理消息
	{
	case WM_PAINT:
		{
			HDC hdc;  //设备环境句柄
			PAINTSTRUCT ps;//声明绘画结构体,以存储和绘画有关的信息

			//无效化客户区并重新绘制,取得环境句柄
			hdc = BeginPaint(hwnd,&ps);
			//输出文字
			TextOutA(hdc,0,0,str.c_str(),str.length());
			EndPaint(hwnd,&ps);
			return 0;
		}
	case WM_COMMAND:
		{
			switch(LOWORD(wParam))
			{
			case ID_FILE_EXIT:
				SendMessage(hwnd,WM_CLOSE,0,0);
				break;
			}
		}
	case WM_CHAR:
		{
			str = str + char(wParam);
			InvalidateRect(hwnd,NULL,0);
			return 0;
		}

	case WM_DESTROY://销毁窗口,退出程序
		{
			PostQuitMessage(0);
			return 0;
		}
	}
		//将我们不处理的消息交给系统做默认处理
		return DefWindowProc(hwnd,message,wParam,lParam);
	}



//————————————————

 

参考GPT和自己的思路:

您可以使用Unicode字符集来支持中文输入。在窗口程序中,定义窗口类时将Unicode字符集作为类名的后缀即可,例如:

WNDCLASSW wc = {0};
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = L"MyWindowClass";  //注意此处是带有L前缀的宽字符集字符串

RegisterClassW(&wc);

HWND hWnd = CreateWindowW(L"MyWindowClass",L"窗口标题",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,500,300,NULL,NULL,hInstance,NULL);

在处理WM_CHAR消息时,使用wchar_t类型的字符串存储输入的字符即可,例如:

case WM_CHAR:
{
    WCHAR wch = (WCHAR)wParam;
    wchar_t input[2] = {0};
    input[0] = wch;

    str = str + input;
    InvalidateRect(hwnd,NULL,0);
    return 0;
}