创建新的 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)>l, (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);
}
}