вывод в RichEdit с -DUNICODE

Тема в разделе "WASM.BEGINNERS", создана пользователем heed, 7 янв 2012.

  1. heed

    heed New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    21
    никак не пойму почему в UNICODE-версии печатает один символ

    собираю тест коммандой
    cl test.c /link kernel32.lib user32.lib
    работает (при ресайзе печатает сообщение)

    а так
    cl test.c -DUNICODE /link kernel32.lib user32.lib
    собирается, MessageBox всё показывает, а RichEdit только одну букву

    Код (Text):
    1. #pragma comment(linker, "/ENTRY:EntryPoint")
    2. #pragma comment(linker, "/SUBSYSTEM:WINDOWS")
    3. #pragma comment(linker, "/NODEFAULTLIB")
    4.  
    5. #define _WIN32_WINNT 0x0502
    6. #define _WIN32_IE       0x0600
    7. #include <windows.h>
    8. #include <richedit.h>
    9.  
    10. #define MAX_B_BUF       (1025*sizeof(TCHAR))    // размер буфера в байтах
    11. #define MAX_T_BUF       1025                    // размер буфера в TCHAR
    12.  
    13. TCHAR* lptstrTextBuf;   // буфер
    14. HWND            hwndRichEd;
    15. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    16. //______________________________________
    17. void Wout(register BYTE outp, TCHAR* format, ...) {
    18. /*
    19.  Вывод сообщение в RichEdit , или просто MessageBox
    20. outp    - сумма бит куда выводить (outp & 1 richedit ; outp & 2 Показать GetLastError)
    21. format  - формат вывода (wvsprintf)
    22. ..... данные
    23. */SETTEXTEX settxt ={
    24.     ST_SELECTION,
    25.     CP_ACP
    26. };
    27.     va_list args = NULL;
    28.     register TCHAR* cTmp = lptstrTextBuf;
    29.     va_start(args, format);
    30.     cTmp += wvsprintf(cTmp, format, args);
    31.     va_end(args);
    32.    
    33.     if (outp & 2) {
    34.         register DWORD dw = GetLastError();
    35.         cTmp += wsprintf(cTmp, TEXT("ErrorCode: %#08X\r\n\t"), dw);
    36.         cTmp += FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
    37.             NULL, dw, LANG_NEUTRAL, cTmp, 500, NULL );
    38.     }
    39.     if (outp & 1) {
    40.         SendMessage(hwndRichEd,EM_SETSEL, -1, -1); // куда печатать
    41.         SendMessage(hwndRichEd,EM_SETTEXTEX,(WPARAM) &settxt,(LPARAM) lptstrTextBuf);
    42.     }
    43.     else MessageBox(NULL, lptstrTextBuf, TEXT("Msg"), 0);
    44. }
    45. //______________________________________
    46. void EntryPoint() {
    47.     MSG         msg;
    48.     HINSTANCE   hInst;
    49.     RECT            rect;
    50.     HWND            hwnd;
    51.     WNDCLASSEX wc = {
    52.         sizeof(wc), CS_HREDRAW | CS_VREDRAW
    53.         , 0, 0, 0
    54.         , 0, 0, 0
    55.         , (HBRUSH) COLOR_WINDOWFRAME
    56.         , 0 // lpszMenuName
    57.         , 0 //win_Title
    58.         , 0};
    59. //  выделение памяти
    60.     lptstrTextBuf   =   (TCHAR*) HeapAlloc( GetProcessHeap(), 0, MAX_B_BUF); // lptstrTextBuf
    61.     hInst   = GetModuleHandle(NULL);
    62.     Wout(2, TEXT("Запуск\n\n hInst=%#08X\n"), hInst);
    63.     if (! LoadLibrary(TEXT("RICHED20.DLL"))) {
    64.         Wout(2, TEXT("failed LoadLibrary RICHED20.DLL\n\n"));
    65.          goto STOP;
    66.     }
    67.     Wout(0, TEXT("RICHED20.DLL loaded\n\n"));
    68.     wc.hInstance        = hInst;
    69.     wc.lpfnWndProc  = WndProc;
    70.     wc.hIcon            = LoadIcon(NULL,    IDI_WARNING);
    71.     wc.lpszClassName    = TEXT("TEST");
    72.     wc.hCursor          = LoadCursor(NULL, IDC_ARROW);
    73.     if(!RegisterClassEx(&wc)) {
    74.          Wout(2, TEXT("failed RegisterClassEx\n\n"));
    75.         goto STOP;
    76.     }
    77.     SystemParametersInfo( SPI_GETWORKAREA, 0, &rect, 0);
    78.     //---- запись в RECT размеров рабочего стола
    79.     rect.left = (rect.right >>= 1);
    80.     rect.bottom /= 3;
    81.     rect.top = rect.bottom << 1;
    82.     hwnd = CreateWindowEx(
    83.         WS_EX_COMPOSITED // двойная буферизация
    84.         | WS_EX_WINDOWEDGE, //WS_EX_MDICHILD, // двойная рамка
    85.         wc.lpszClassName,           //window class name
    86.         wc.lpszClassName,           //window caption
    87.         WS_OVERLAPPEDWINDOW
    88.         |WS_BORDER |WS_VISIBLE,     //window style
    89.         rect.left,      //  x position
    90.         rect.top,       //  y position
    91.         rect.right,     //  x size
    92.         rect.bottom,    //  y size
    93.         0,              //parent window handle
    94.         NULL,           //window menu handle
    95.         hInst,          //program instance handle
    96.         NULL            //creation parameters
    97.     );
    98.     if (! hwnd) {
    99.         Wout(2, TEXT("failed CreateWindowEx\n\n"));
    100.         goto STOP;
    101.     }
    102. { //=================== RICHEDIT ==========================================
    103.     GetClientRect(hwnd, &rect);//---- запись в RECT размеров RICHEDIT
    104.     hwndRichEd = CreateWindowEx(
    105. /*#if defined(UNICODE)
    106.     0,TEXT("RICHEDIT20W")
    107. #else
    108.     0,TEXT("RICHEDIT20A")  
    109. #endif */
    110.     0, RICHEDIT_CLASS// window class name
    111.     ,0                  // window  caption
    112.     ,WS_CHILD |WS_VISIBLE |WS_VSCROLL |ES_MULTILINE |ES_AUTOVSCROLL  //window style
    113.     , 0, 0                  //  x position  y position             
    114.     , rect.right            //  x size
    115.     , rect.bottom       //  y size
    116.     , hwnd, 0, hInst, 0 );
    117.     if (! hwndRichEd) {
    118.         Wout(2, TEXT("failed CreateWindowEx 2\n\n"));
    119.         goto STOP;
    120.     }
    121.     SendMessage(hwndRichEd,WM_SETFOCUS,0,0);
    122.     SendMessage(hwndRichEd,EM_SETBKGNDCOLOR, 0, 0xEEEEEE);
    123. }
    124.  
    125.     UpdateWindow(hwnd);
    126.     while (GetMessage( &msg, NULL, 0, 0)) {
    127.         TranslateMessage(&msg);
    128.         DispatchMessage(&msg);
    129.     }
    130. STOP:
    131.     ExitProcess( (UINT) msg.wParam );
    132. }
    133. //______________________________________
    134. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    135. {
    136. switch(message)
    137. {
    138. case WM_SIZE:
    139.     Wout(3, TEXT("WM_SIZE\n LOWORD(lParam)=%i\n HIWORD(lParam)=%i\n\n"), LOWORD(lParam), HIWORD(lParam));
    140. return 0;
    141.     case WM_QUERYENDSESSION:
    142.     case WM_DESTROY:
    143.         PostQuitMessage(0);
    144.         return (message ==  WM_QUERYENDSESSION) ? 1:0;
    145.     default:
    146.         return DefWindowProc(hwnd,message,wParam,lParam);
    147. }
    148. }
    upd// компилятор DDK + PSDK вроде как MSVC7 наверное
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    heed
    Ну потому что CP_ACP используется, а не CP_WINUNICODE (1200).
     
  3. heed

    heed New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    21
    Большое Спасибо

    не сообразил даже эту SETTEXTEX перетаскивая с места на место
    , сломал весь мозк с этим UNICODE :)