2013-10-15 5 views
1


Я хочу добавить цветную текстовую строку в элемент управления RichEdit. Но я столкнулся с проблемой, что цветовой обмен не ограничивается текстом, который я выбрал. Что я делаю:
получить текущий курсор pos -> вставить текст -> получить курсор pos -> выбрать диапазон -> цвет его -> снять выбор
По какой-то причине, похоже, также меняется цвет по умолчанию. Я попытался сохранить старый CHARFORMAT и восстановить его (SCF_DEFAULT и SCF_SELECTION с последним символом) после того, как я покрасил линию, но это не сработало. Я что-то упускаю?

Richedit изменить цвет выделения

Я получил RichEdit 2.0 и следующие функции:

hEdit_Console = CreateWindow(RICHEDIT_CLASS, "", 
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOVSCROLL | ES_MULTILINE | ES_READONLY | WS_VSCROLL, 
10, 100, 260, 120, hWnd, NULL, ((LPCREATESTRUCT) lParam)->hInstance, NULL); 
SendMessage(hEdit_Console, WM_SETFONT, (LPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE); 


void AddInfo2(HWND con, char* text) 
{ 
    CHARFORMAT cf; 
    int start, stop; 

    memset(&cf, 0, sizeof cf); 
    cf.cbSize = sizeof cf; 
    cf.dwMask = CFM_COLOR; 
    cf.crTextColor = RGB(51, 204, 51); 

    SendMessage(con, EM_SETSEL, -1, -1); 
    start = SendMessage(con, WM_GETTEXTLENGTH, 0, 0); 
    SendMessage(con, EM_REPLACESEL, FALSE, (LPARAM)text); 
    stop = SendMessage(con, WM_GETTEXTLENGTH, 0, 0); 
    SendMessage(con, EM_SETSEL, start, stop); 
    SendMessage(con, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf); 
    SendMessage(con, EM_SETSEL, -1, -1); 
} 

ответ

0

Я нашел обходное решение для этого, которое работает хотя бы для меня. Когда я сначала попытался сохранить/выполнить резервное копирование и восстановить старый CHARFORMAT, я сделал это, не указав CFM_COLOR для CHARFORMAT cf_old. Сейчас я использую:

SendMessage(con, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf_old); 
cf_old.dwMask = CFM_COLOR; 
SendMessage(con, EM_SETSEL, -1, -1); 
SendMessage(con, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf); 
SendMessage(con, EM_REPLACESEL, FALSE, (LPARAM)text); 
SendMessage(con, EM_SETSEL, -1, -1); 
SendMessage(con, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf_old); 

Это как-то объясняет, почему моя первая попытка не работает. Кажется, что каждый раз, когда вы добавляете что-то в RichEdit CHARFORMAT первого char до, используется каретка.

+0

С моей точки зрения вы ничего не изменили, за исключением того, что у вас есть хорошо инициализированная структура. – xMRi

2

Насколько я прочитал documentationdwEffects должны быть установлены в CFE_AUTOCOLOR или другой действительный стоимость.

+0

Документация по crTextColor (на той же странице): Цвет текста. Этот член игнорируется, если задан характер символа CFE_AUTOCOLOR. Чтобы создать COLORREF, используйте макрос RGB. - Поскольку dwEffects равно 0, никакие дополнительные стили не применяются к тексту. –

+0

спасибо в любом случае. вы указали мне в правильном направлении для решения/обходного пути. –

Смежные вопросы