C++ 为什么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

这段程序与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 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
的其他调用也会有同样的问题。