2015-08-29 2 views
-2

Эта часть программы связана с активами Window в программировании win32. Когда я выполняю его, вместо того, чтобы печатать «Вставить текст здесь ...» на английском языке, он печатает его на китайском или японском языке. Зачем?Почему эти свойства окна в коде 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); 
    } 
+0

У китайцев всегда одна и та же проблема: передача 8-битной кодированной строки в функцию winapi, которая ожидает кодировку utf-16. Ака широкая струна. Обычно с участием (cast), поэтому компилятор не может жаловаться на это. Вы уже знаете, как использовать широкие строки, вы используете префикс L. Не везде. –

ответ

2

, кажется, что ваше приложение определяется как Unicode (= ожидая получить const wchar_t* строк), и вы отправляете некоторые ASCII строку (const char*) в этой строке:

(LPARAM)"Insert text here...");

попробовать изменить его на:

(LPARAM)L"Insert text here...");

+0

Другие вызовы 'SendMessage' будут иметь одинаковую проблему. –

0

вы можете заменить (LPARAM) "I nsert текст здесь ... "); by (LPARAM) ТЕКСТ («Вставить текст здесь ...»)); Проверьте макрос окна TEXT.

Смежные вопросы