2013-05-17 14 views
0

이것은 내 시도이며 비 ASCII 문자가 발생할 때 EM_STREAMOUT이 물음표를 표시하는 이유를 알지 못합니다.리치 헷드 컨트롤에서 와이드 문자열을 스트리밍하는 방법은 무엇입니까?

이 코드는 창에서 텍스트를 복사 한 다음 다시 넣지만 이번에는 물음표로만 사용합니다.

#include <windows.h> 
#include <iostream> 
#include <richedit.h> 
#include <string> 

static DWORD CALLBACK EditStreamOutCallback(unsigned long dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb) 
{ 
    using namespace std; 
    wstring* ps = (wstring*) dwCookie; 
    *pcb = cb; 
    for (long i = 0; i < cb; i++) { 
    ps->append(1,pbBuff[i]); 
    } 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE, LPTSTR, int /* nCmdShow*/) { 
    using namespace std; 

    LoadLibraryW(L"Msftedit.dll"); 
    HWND richeditWindow = CreateWindowExW (
    WS_EX_TOPMOST, 
    L"RICHEDIT50W", 
    L"施氏食獅史", 
    WS_SYSMENU | WS_VSCROLL | ES_MULTILINE | ES_NOHIDESEL | WS_VISIBLE, 
    50, 50, 500, 500, 
    NULL, NULL, NULL, NULL 
); 

    wstring s; 
    EDITSTREAM eds; 
    eds.dwCookie = (unsigned long) &s; 
    eds.dwError = 0; 
    eds.pfnCallback = EditStreamOutCallback; 
    SendMessageW(richeditWindow, EM_STREAMOUT, (WPARAM) SF_TEXTIZED, (LPARAM) &eds); 
    SendMessageW(richeditWindow, EM_REPLACESEL, FALSE, (LPARAM) s.c_str()); 

    MSG msg; 
    while(GetMessageW(&msg, 0, 0, 0)) { 
    TranslateMessage(&msg); 
    DispatchMessageW(&msg); 
    } 
    return 0; 
} 

답변

0

SendMessageW (richeditWindow, EM_STREAMOUT, (WPARAM) SF_TEXTIZED | SF_UNICODE, (LPARAM) & EDS);