как вывести широкую строку из элемента управления richedit?

Это моя попытка, и я не знаю, почему EM_STREAMOUT возвращает вопросительные знаки при встрече с символами, отличными от ascii.

Этот код копирует текст из окна и снова вставляет его, но на этот раз только в виде вопросительных знаков.

#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;
}

person rsk82    schedule 17.05.2013    source источник


Ответы (1)


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

person xwlan    schedule 17.05.2013