0

新しい CHARFORMAT2W を作成してそれで遊ぶことは問題ありませんが、リッチエディット コントロールからの書式設定で上書きすると、構造が損傷するようで、元に戻すことができません。しかし、エラーは発生しません。

#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

したがって、次の呼び出しを行う前に、構造体を完全に再初期化する必要がありますEM_SETCHARFORMAT

于 2013-03-21T09:38:21.723 に答える