Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Цвет выделения в RichEdit

278
08 марта 2011 года
Alexander92
1.1K / / 04.08.2008
Всем здравствуйте!

Подскажите, кто сталкивался, - возможно ли изменить стандартный цвет подсветки выделения в RichEdit'е? Имеется в виду не установить цвет / фон шрифта выделенного фрагмента, а именно поменять стандартную темно-синюю подсветку выделения. Облазил весь MSDN, но внятного ответа пока не нашел.

Была идея перехватывать EN_SELCHANGE и ставить соответствующие цвета вручную, но пока эта идея никаких результатов не дала.
278
10 марта 2011 года
Alexander92
1.1K / / 04.08.2008
Всем спасибо, вопрос благополучно решен. Идея с EN_SELCHANGE оказалось правильной: выделение как таковое заменяется форматированием. Привожу окончательное решение:

Код:
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);

}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог