Изменить цвет выделения выделенного текста в RichEdit

Как изменить цвет выделенного текста в элементе управления RichEdit во время выделения текста? SetSysColor() может сделать это, но это изменяет цвет подсветки глобально.

Установка CHARFORMAT2 с помощью SCF_SELECTION и отправка EM_SETCHARFORMAT изменяет шрифт и цвет фона. Но отображается только после отмены выбора того же диапазона. Это не очень полезно, так как я хочу, чтобы он снова стал оригинальным цветом, когда что-то отменено.

Так, как это действительно сделано, озадачивает меня.

1 ответ

Просто создайте подкласс (он был опубликован давно в группах Google, код C/Winapi)

Вы можете начать отправку сообщений о событиях для изменения выбора;

SendMessageW(hWndEdit, EM_SETEVENTMASK, 0, ENM_SELCHANGE);

а затем обработайте сообщение следующим образом;

case WM_NOTIFY:
    switch (((LPNMHDR)lParam)->code)
    {
    case EN_SELCHANGE:
        SendMessageW(hWndEdit, EM_SETEVENTMASK, 0, ENM_NONE);
        SendMessageW(hWndEdit, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&format);
        SendMessageW(hWndEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&sformat);
        SendMessageW(hWndEdit, EM_HIDESELECTION, 1, 0);
        SendMessageW(hWndEdit, EM_SETEVENTMASK, 0, ENM_SELCHANGE);
        break;
    }

Однако это вызовет некоторое мерцание в случае быстрого изменения выбора. Странно, как Win32 API создает множество проблем, с которыми приходится иметь дело, когда вы пытаетесь что-то настроить.

Другие вопросы по тегам