我用VS2005建了一个工程,界面上显示的字符是一些Unicode的字符比如Σύνολο χαρακτηριστικών του ποντικιού,首先我用RegisterClassW注册了一个窗口然后CreateWindowW创建这个窗口,当我用TextOutW将这个字符串显示在窗口中时有一些字符是乱码,如果我再用DialogBoxW创建一个对话框然后再对话框中TextOutW字符串的话,字符串显示正常,为什么在我注册的窗口中显示会不正常呢?

解决方案 »

  1.   

    Unicode中其实你不用特意的去加W  那些是可以由编译器自动去完成的 具体我想还是你creatwindow的时候参数的问题.看看msdn 应该有一个参数是标识unicode编码的
      

  2.   

    #include <windows.h>
    #include "resource.h"LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    BOOL CALLBACK AutoScroll(HWND hdwnd, UINT message, WPARAM wParam, LPARAM lParam);
    HINSTANCE hInst;
    HWND hWndDlg;
    HFONT hFont,hFont1;
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                         PSTR szCmdLine, int iCmdShow)
    {
            hInst=hInstance;
          HWND          hwnd ;
          MSG           msg ;
          WNDCLASSW      wndclass ;
         
          wndclass.style          = CS_HREDRAW | CS_VREDRAW ;
          wndclass.lpfnWndProc    = WndProc ;
          wndclass.cbClsExtra     = 0 ;
          wndclass.cbWndExtra     = 0 ;
          wndclass.hInstance      = hInstance ;
          wndclass.hIcon          = LoadIcon (NULL, IDI_APPLICATION) ;
          wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW) ;
          wndclass.hbrBackground  = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
          wndclass.lpszMenuName   = L"ChosFont" ;
          wndclass.lpszClassName  = L"ChosFont" ;
            
          if (!RegisterClassW (&wndclass))
          {
               MessageBox ( NULL, TEXT ("This program requires Windows NT!"),
                    NULL, MB_ICONERROR) ;
               return 0 ;
          }
          hwnd = CreateWindowW ( L"ChosFont", L"ChooseFont",
                               WS_OVERLAPPEDWINDOW,
                               CW_USEDEFAULT, CW_USEDEFAULT,
                               CW_USEDEFAULT, CW_USEDEFAULT,
                               NULL, NULL, hInstance, NULL) ;
         
          ShowWindow (hwnd, iCmdShow) ;
          UpdateWindow (hwnd) ;
          while (GetMessage (&msg, NULL, 0, 0))
          {
               TranslateMessage (&msg) ;
               DispatchMessage (&msg) ;
         }
       return msg.wParam ;
    }LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
    {
                                ;
          HDC                hdc ;      PAINTSTRUCT        ps ;
            LOGFONT lf;

          switch (message)
          {
          case WM_CREATE:
    memset(&lf, 0, sizeof(lf));
    lf.lfHeight = MulDiv(11, ::GetDeviceCaps(GetDC(GetDlgItem(hWndDlg,IDC_ST1)), LOGPIXELSY), 72);
    lf.lfWeight = FW_NORMAL;
    lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
    // wcscpy(lf.lfFaceName, L"Lucida Sans Unicode");
    strcpy(lf.lfFaceName,"Lucida Sans Unicode");
    hFont=CreateFontIndirect(&lf); // Get text height
    ////////////////////////////
             SetWindowTextW(hwnd,L"Σύνολο χαρακτηριστικών του ποντικιού");
               return 0 ;      case WM_COMMAND:
               switch (LOWORD (wParam))
               {
               case  IDM_FONT:
    DialogBoxW(hInst, MAKEINTRESOURCEW(IDD_DIALOG1), hwnd, (DLGPROC)AutoScroll);

                    return 0 ;
               }
               return 0 ;      case  WM_PAINT:
               hdc = BeginPaint (hwnd, &ps) ;                    TextOutW(hdc,0,0,L"Σύνολο χαρακτηριστικών του ποντικιού",wcslen(L"Σύνολο χαρακτηριστικών του ποντικιού"));
               EndPaint (hwnd, &ps) ;
               return 0 ;
          case  WM_DESTROY:
               PostQuitMessage (0) ;
               return 0 ;
          }
          return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    BOOL CALLBACK AutoScroll(HWND hdwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {

    PAINTSTRUCT  ps;
    switch(message)
    {
    case WM_INITDIALOG:
    hWndDlg=hdwnd;
    SendMessage(GetDlgItem(hdwnd,IDC_ST1),WM_SETFONT,(WPARAM)hFont,MAKELPARAM(true,0));
    SetWindowTextW(hdwnd,L"Σύνολο χαρακτηριστικών του ποντικιού");
    SetDlgItemTextW(hdwnd,IDC_ST1,L"Σύνολο χαρακτηριστικών του ποντικιού");
    break;
    case WM_COMMAND:
    switch(wParam)
    {
    case IDOK:
    EndDialog(hdwnd, LOWORD(wParam));
    break;
    }
    break;
    case WM_PAINT:
    HDC hdc;
    hdc = BeginPaint(hdwnd, &ps);
            TextOutW(hdc,0,0,L"Σύνολο χαρακτηριστικών του ποντικιού",wcslen(L"Σύνολο χαρακτηριστικών του ποντικιού"));
        EndPaint(hdwnd, &ps);
    break;
        default:
        break;
    }
    return 0;
    }
    代码如上,奇怪的是如果去掉SendMessage(GetDlgItem(hdwnd,IDC_ST1),WM_SETFONT,(WPARAM)hFont,MAKELPARAM(true,0));这句,那么对话框窗口的标题和static空间中显示的也是乱码,如果加上这句后显示的就正常了,但是对话框中TextOutW出的字符串还是乱码
      

  3.   

    主窗口中SetWindowTextW和TextOutW出的字符串始终是乱码
      

  4.   

    主窗口中SetWindowTextW和TextOutW出的字符串始终是乱码
      

  5.   

    不是换不换字体的问题TextOutW 前面加上SelectObject(hdc,hFont);后TextOutW 显示的字符串就正常了,不过主窗口中SetWindowTextW显示的字符串还是乱码
      

  6.   

    不知道为什么主窗口只能显示一个字符SetWindowTextW(hwnd,L"vwvwvwwv");只能显示一个V出来