C++ 为什么win32代码中的此窗口资源以中文或日文而不是英文打印?
这段程序与win32编程中的窗口资源相关。当我执行它时,它不是用英文打印“在这里插入文本…”,而是用中文或日文打印。为什么?C++ 为什么win32代码中的此窗口资源以中文或日文而不是英文打印?,c++,windows,C++,Windows,这段程序与win32编程中的窗口资源相关。当我执行它时,它不是用英文打印“在这里插入文本…”,而是用中文或日文打印。为什么? #include "stdafx.h" #include "Window-Assets.h" #include <windows.h> #define IDC_MAIN_BUTTON 101 // Button identifier #define IDC_MAIN_EDIT 102 // Edit box identifi
#include "stdafx.h"
#include "Window-Assets.h"
#include <windows.h>
#define IDC_MAIN_BUTTON 101 // Button identifier
#define IDC_MAIN_EDIT 102 // Edit box identifier
HWND hEdit;
LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd)
{
WNDCLASSEX wClass;
ZeroMemory(&wClass,sizeof(WNDCLASSEX));
wClass.cbClsExtra=NULL;
wClass.cbSize=sizeof(WNDCLASSEX);
wClass.cbWndExtra=NULL;
wClass.hbrBackground=(HBRUSH)COLOR_WINDOW;
wClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wClass.hIcon=NULL;
wClass.hIconSm=NULL;
wClass.hInstance=hInst;
wClass.lpfnWndProc=(WNDPROC)WinProc;
wClass.lpszClassName=L"Window Class";
wClass.lpszMenuName=NULL;
wClass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClassEx(&wClass))
{
int nResult=GetLastError();
MessageBox(NULL,
L"Window class creation failed\r\n",
L"Window Class Failed",
MB_ICONERROR);
}
HWND hWnd=CreateWindowEx(NULL,
L"Window Class",
L"Windows application",
WS_OVERLAPPEDWINDOW,
200,
200,
640,
480,
NULL,
NULL,
hInst,
NULL);
if(!hWnd)
{
int nResult=GetLastError();
MessageBox(NULL,
L"Window creation failed\r\n",
L"Window Creation Failed",
MB_ICONERROR);
}
ShowWindow(hWnd,nShowCmd);
MSG msg;
ZeroMemory(&msg,sizeof(MSG));
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
{
// Create an edit box
hEdit=CreateWindowEx(WS_EX_CLIENTEDGE,
L"EDIT",
L"",
WS_CHILD|WS_VISIBLE|
ES_MULTILINE|ES_AUTOVSCROLL|ES_AUTOHSCROLL,
50,
100,
200,
100,
hWnd,
(HMENU)IDC_MAIN_EDIT,
GetModuleHandle(NULL),
NULL);
HGDIOBJ hfDefault=GetStockObject(DEFAULT_GUI_FONT);
SendMessage(hEdit,
WM_SETFONT,
(WPARAM)hfDefault,
MAKELPARAM(FALSE,0));
SendMessage(hEdit,
WM_SETTEXT,
NULL,
(LPARAM)"Insert text here...");
// Create a push button
HWND hWndButton=CreateWindowEx(NULL,
L"BUTTON",
L"OK",
WS_TABSTOP|WS_VISIBLE|
WS_CHILD|BS_DEFPUSHBUTTON,
50,
220,
100,
24,
hWnd,
(HMENU)IDC_MAIN_BUTTON,
GetModuleHandle(NULL),
NULL);
SendMessage(hWndButton,
WM_SETFONT,
(WPARAM)hfDefault,
MAKELPARAM(FALSE,0));
}
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_MAIN_BUTTON:
{
char buffer[256];
SendMessage(hEdit,
WM_GETTEXT,
sizeof(buffer)/sizeof(buffer[0]),
reinterpret_cast<LPARAM>(buffer));
MessageBox(NULL,
L"buffer",
L"Information",
MB_ICONINFORMATION);
}
break;
}
break;
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
#包括“stdafx.h”
#包括“窗口资产.h”
#包括
#定义IDC_主按钮101//按钮标识符
#定义IDC\u MAIN\u EDIT 102//编辑框标识符
HWND-hEdit;
LRESULT回调WinProc(HWND-HWND,UINT消息,WPARAM-WPARAM,LPARAM-LPARAM);
int-WINAPI WinMain(HINSTANCE-hInst、HINSTANCE-hPrevInst、LPSTR-lpCmdLine、int-nShowCmd)
{
WNDCLASSEX WCLASSE;
零内存(&wClass,sizeof(WNDCLASSEX));
wClass.cbClsExtra=NULL;
wClass.cbSize=sizeof(WNDCLASSEX);
wClass.cbWndExtra=NULL;
wClass.hbrBackground=(HBRUSH)彩色窗口;
wClass.hCursor=LoadCursor(空,IDC_箭头);
wClass.hIcon=NULL;
wClass.hIconSm=NULL;
wClass.hInstance=hInst;
lpfnWndProc=(WNDPROC)WinProc;
lpszClassName=L“窗口类”;
wClass.lpszMenuName=NULL;
wClass.style=CS|HREDRAW | CS|VREDRAW;
如果(!RegisterClass(&wClass))
{
int nResult=GetLastError();
MessageBox(空,
L“窗口类创建失败\r\n”,
L“窗口类失败”,
MB_(错误);
}
HWND HWND=CreateWindowEx(空,
L“窗口类”,
L“Windows应用程序”,
WS_重叠窗口,
200,
200,
640,
480,
无效的
无效的
欣斯特,
无效);
如果(!hWnd)
{
int nResult=GetLastError();
MessageBox(空,
L“窗口创建失败\r\n”,
L“窗口创建失败”,
MB_(错误);
}
显示窗口(hWnd、nShowCmd);
味精;
零内存(&msg,sizeof(msg));
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
返回0;
}
LRESULT回调WinProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM)
{
开关(msg)
{
案例WM_创建:
{
//创建编辑框
hEdit=CreateWindowEx(WS_EX_CLIENTEDGE,
L“编辑”,
L“,
WS|u CHILD | WS|u可见|
ES|U多行| ES|U AUTOVSCROLL | ES|U AUTOHSCROLL,
50,
100,
200,
100,
hWnd,
(汉努)IDC_MAIN_编辑,
GetModuleHandle(空),
无效);
HGDIOBJ hfDefault=GetStockObject(默认图形用户界面字体);
SendMessage(hEdit,
WM_SETFONT,
(WPARAM)hfDefault,
MAKELPARAM(FALSE,0));
SendMessage(hEdit,
WM_SETTEXT,
无效的
(LPARAM)“在此处插入文本…”);
//创建一个按钮
HWND hWndButton=CreateWindowEx(空,
L“按钮”,
L“好的”,
WS|u TABSTOP | WS|u可见|
WS|u CHILD | BS|u def按钮,
50,
220,
100,
24,
hWnd,
(HMENU)IDC_主按钮,
GetModuleHandle(空),
无效);
SendMessage(HWND)按钮,
WM_SETFONT,
(WPARAM)hfDefault,
MAKELPARAM(FALSE,0));
}
打破
case WM_命令:
开关(LOWORD(wParam))
{
机箱IDC_主按钮:
{
字符缓冲区[256];
SendMessage(hEdit,
WM_GETTEXT,
sizeof(缓冲区)/sizeof(缓冲区[0]),
重新解释(缓冲区);
MessageBox(空,
L“缓冲区”,
L“信息”,
MB_(信息);
}
打破
}
打破
案例WM_销毁:
{
PostQuitMessage(0);
返回0;
}
打破
}
返回DefWindowProc(hWnd、msg、wParam、lParam);
}
您的应用程序似乎被定义为Unicode(=希望获得常量wchar\u t*
字符串),并且您正在此行中发送一些ASCII字符串(常量char*
):
(LPARAM)“在此处插入文本…”)代码>
尝试将其更改为:
(LPARAM)L“在此处插入文本…”)代码>您可以替换(LPARAM)“在此处插入文本…”);
通过
(LPARAM)文本(“在此处插入文本…”);
检查windows文本宏。获取中文总是同一个问题:将8位编码字符串传递给需要utf-16编码字符串的winapi函数。又名宽弦。通常涉及(强制转换),因此编译器不会对此抱怨。您已经知道如何使用宽字符串,您正在使用L前缀。不是到处都有。对SendMessage
的其他调用也会有同样的问题。