0

创建新的 CHARFORMAT2W 并使用它没有问题,但随后用 Richedit 控件的格式覆盖它似乎会损坏结构,因此无法应用回来。但不会产生错误。

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

int main() {
  using namespace std;
  LoadLibrary("Msftedit.dll");
  HWND richeditWindow = CreateWindowExW (
    WS_EX_TOPMOST,
    L"RICHEDIT50W", 
    L"window text",
    WS_SYSMENU | WS_VSCROLL | ES_MULTILINE | ES_NOHIDESEL | WS_VISIBLE,
    50, 50, 500, 500,
    NULL, NULL, NULL, NULL
  );


  GETTEXTLENGTHEX gtl;
  gtl.flags = GTL_NUMCHARS;
  gtl.codepage = 1200;
  int text_len = SendMessageW(richeditWindow, EM_GETTEXTLENGTHEX, (WPARAM)&gtl, (LPARAM)NULL);
  CHARRANGE cr = {text_len,text_len};
  SendMessageW(richeditWindow, EM_EXSETSEL, 0, (LPARAM)&cr);
  static CHARFORMAT2W cf;
  memset( &cf, 0, sizeof cf );
  cf.cbSize = sizeof cf;
  cf.dwMask = CFM_COLOR | CFM_BACKCOLOR;
  SetLastError(0);
  // disabling this line causes text to be colored
  SendMessageW(richeditWindow, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
  if (GetLastError()) {
    printf("EM_GETCHARFORMAT failed: %ld", GetLastError());
  }
  cf.crTextColor = RGB(255,0,0);
  cf.crBackColor = RGB(233,233,0);
  if (!SendMessageW(richeditWindow, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf)) {
    printf("EM_SETCHARFORMAT failed: %ld", GetLastError());
  }
  SendMessageW(richeditWindow, EM_REPLACESEL, FALSE, (LPARAM) L"... some more text, should be colored");


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

1 回答 1

1

你误解了它的EM_GETCHARFORMAT工作原理。它不响应dwMask您传递的结构中的值。相反,它会尽可能多地填充结构。文档说:

dwMask 成员指定哪些属性在整个选择中是一致的。

这意味着富编辑控件将分配给dwMask指定哪些属性是一致的值。

So, you need to completely re-initialize the struct before you make the subsequent call to EM_SETCHARFORMAT.

于 2013-03-21T09:38:21.723 回答