HWND hRichEditWnd = CreateWindow(RICHEDIT_CLASS, ......); // создаем окно RichEdit'а
SendMessage(hRichEditWnd, EM_SETEVENTMASK, (WPARAM)0, (LPARAM)ENM_SELCHANGE); // заставляем ричедит стучать родительскому окну о попытке выделения
// ...
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { // оконная процедура родительского окна
SELCHANGE *selChange;
CHARFORMAT2 charFormat;
static LONG selectionBorder;
switch(uMsg) {
// ...
case WM_NOTIFY:
selChange = (SELCHANGE *)lParam;
if (selChange->nmhdr.code = EN_SELCHANGE) {
ZeroMemory((PVOID)&charFormat, sizeof(CHARFORMAT2));
charFormat.cbSize = sizeof(CHARFORMAT2);
// Отключаем уведомления, чтобы избежать рекурсии
SendMessage(selChange->nmhdr.hwndFrom, EM_SETEVENTMASK, (WPARAM)0, (LPARAM)0);
// Применяем ко всему тексту стандартное форматирование;
// эквивалентно полному сбросу выделения
charFormat.dwMask = CFM_COLOR | CFM_BACKCOLOR;
charFormat.crTextColor = RGB(0x00, 0x00, 0x00);
charFormat.crBackColor = RGB(0xFF, 0xFF, 0xFF);
SendMessage(selChange->nmhdr.hwndFrom, EM_SETCHARFORMAT, (WPARAM)SCF_ALL, (LPARAM)&charFormat);
// Форматируем выделенный текст так, как мы хотим
// (например, красный текст на желтом фоне)
charFormat.crTextColor = RGB(0xFF, 0x00, 0x00);
charFormat.crBackColor = RGB(0xFF, 0xFF, 0x00);
if (selChange->seltyp == SEL_EMPTY) // пользователь начал выделение, запомнить начальную позицию
selectionBorder = selChange->chrg.cpMin;
SendMessage(selChange->nmhdr.hwndFrom, EM_SETSEL, (WPARAM)selChange->chrg.cpMin, (LPARAM)selChange->chrg.cpMax);
SendMessage(selChange->nmhdr.hwndFrom, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&charFormat);
// снимаем выделение как таковое, оставляем только наше форматирование
if (selChange->chrg.cpMin == selectionBorder) // выделение слева направо
SendMessage(selChange->nmhdr.hwndFrom, EM_SETSEL, (WPARAM)selChange->chrg.cpMin, (LPARAM)selChange->chrg.cpMin);
else // выделение справа налево
SendMessage(selChange->nmhdr.hwndFrom, EM_SETSEL, (WPARAM)selChange->chrg.cpMax, (LPARAM)selChange->chrg.cpMax);
// возвращаем уведомления
SendMessage(selChange->nmhdr.hwndFrom, EM_SETEVENTMASK, (WPARAM)0, (LPARAM)ENM_SELCHANGE);
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Цвет выделения в RichEdit
Подскажите, кто сталкивался, - возможно ли изменить стандартный цвет подсветки выделения в RichEdit'е? Имеется в виду не установить цвет / фон шрифта выделенного фрагмента, а именно поменять стандартную темно-синюю подсветку выделения. Облазил весь MSDN, но внятного ответа пока не нашел.
Была идея перехватывать EN_SELCHANGE и ставить соответствующие цвета вручную, но пока эта идея никаких результатов не дала.
Всем спасибо, вопрос благополучно решен. Идея с EN_SELCHANGE оказалось правильной: выделение как таковое заменяется форматированием. Привожу окончательное решение: