Изменение цвета отрисовки шрифта Edit-контрола без использования диалога!

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

akahan
Сообщения: 10
Зарегистрирован: 11 фев 2007, 20:00

Привет всем!
Возможно-ли изменить цвет отрисовки текста в окне Edit-контрола не используя WM_CTRCOLOREDIT. Понятно, что ели текст рисуешь самостоятельно, то это возможно, но если текст рисуется средствами системы как имзменить его цвет?
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Может, ты имел в виду сообщение WM_CTLCOLOR?
По-моему, вполне нормальный вариант (обработать его).
Тебе же не придется самому отрисовывать текст еонтрола. Смысл перехвата этого сообщения - ты подменяешь кисть (Brush), используемую для отрисовки текста. То есть, никакого большого геморроя ты себе не зарабатываешь.

В MSDN есть пример перехвата этого обработчика с использованием MFC:

Код: Выделить всё

HBRUSH CZilchDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
   // Call the base class implementation first! Otherwise, it may
   // undo what we're trying to accomplish here.
   HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

   // Are we painting the IDC_MYSTATIC control? We can use
   // CWnd::GetDlgCtrlID() to perform the most efficient test.
   if (pWnd->GetDlgCtrlID() == IDC_MYSTATIC)
   {
      // Set the text color to red
      pDC->SetTextColor(RGB(255, 0, 0));

      // Set the background mode for text to transparent 
      // so background will show thru.
      pDC->SetBkMode(TRANSPARENT);

      // Тут еще и цвет бэкграунда можно также сменить
      pDC->SetBkColor (RGB(127, 127, 127));

      // Return handle to our CBrush object
      hbr = m_brush;
   }

   return hbr;
}
akahan
Сообщения: 10
Зарегистрирован: 11 фев 2007, 20:00

WM_CTLCLOR - это сообщение уже давно deprecated. Оно использовалось в 16 битных версиях кода. А сейчас уже вовсю 64 бита!!! :)
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

akahan писал(а):WM_CTLCLOR - это сообщение уже давно deprecated. Оно использовалось в 16 битных версиях кода. А сейчас уже вовсю 64 бита!!! :)
Ну не знаю. У меня вышеприведенный пример (в MFC-приложении) вполне себе работает :)
А раз результат есть, причем есть без лишнего геморроя - значит способ приемлем.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):А сейчас уже вовсю 64 бита!!!
Хотелось бы посмотреть на 64-битную версию кода, ax - 16, eax - 32. Вероятно eeax - это 64 :-)
It's a long way to the top if you wanna rock'n'roll
Styopa
Сообщения: 40
Зарегистрирован: 30 сен 2004, 19:22
Откуда: Севастополь
Контактная информация:

akahan писал(а):WM_CTLCLOR - это сообщение уже давно deprecated. Оно использовалось в 16 битных версиях кода. А сейчас уже вовсю 64 бита!!! :)
Чушь! Где вы это взяли?
MSDN писал(а):The WM_CTLCOLOR message is used in 16-bit versions of Windows to change the color scheme of list boxes, the list boxes of combo boxes, message boxes, button controls, edit controls, static controls, and dialog boxes.

Note For information related to this message and 32-bit versions of Windows, see Remarks.

Remarks
The WM_CTLCOLOR message has been replaced by more specific notifications in 32-bit versions of Windows. These replacements include the following:
WM_CTLCOLORBTN
WM_CTLCOLOREDIT
WM_CTLCOLORDLG
WM_CTLCOLORLISTBOX
WM_CTLCOLORSCROLLBAR
WM_CTLCOLORSTATIC
В жизни программиста всего три плюса. Из них два - в Си++, а третий - крест на его могиле.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Лучше не перехватывать сообщения, а использовать элемент RichEdit. Для него есть специальное сообщение EM_SETBKGNDCOLOR.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

С RichEdit будет куча других проблем. Например контекстное меня для него не работает по умолчанию. Придётся создавать своё меню и писать для него обработчик. Использовать RichEdit - стрелять из пушки по воробьям в данном случае.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
akahan
Сообщения: 10
Зарегистрирован: 11 фев 2007, 20:00

Сообщение от MSDN
The WM_CTLCOLOR message is used in 16-bit versions of Windows to change the color scheme of list boxes, the list boxes of combo boxes, message boxes, button controls, edit controls, static controls, and dialog boxes.

Note For information related to this message and 32-bit versions of Windows, see Remarks.

Remarks
The WM_CTLCOLOR message has been replaced by more specific notifications in 32-bit versions of Windows. These replacements include the following:
WM_CTLCOLORBTN
WM_CTLCOLOREDIT
WM_CTLCOLORDLG
WM_CTLCOLORLISTBOX
WM_CTLCOLORSCROLLBAR
WM_CTLCOLORSTATIC
Даа! Перевожу!
Сообщение от MSDN
Сообщение WM_CTLCOLOR используетсяв 16-битных версиях Видовз для изменения цветовой схемы лист боксов, лист боксов комбо боксов, окон сообщений, кнопок, окон ввода текста, надписей, и диалогов.

Заметьте, для связывания этого сообщения и 32 битных версий Виндовз, смотрите пометки.

Пометки
Сообщение WM_CTLCOLOR замещено специфическими нотификациями в 32 битных версиях Виндовз. Эти замещения включают следующиее:
WM_CTLCOLORBTN
WM_CTLCOLOREDIT
WM_CTLCOLORDLG
WM_CTLCOLORLISTBOX
WM_CTLCOLORSCROLLBAR
WM_CTLCOLORSTATIC
Теперь это более разборчиво! :)
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Как вариант, могу предложить ещё один экзотический способ: использовать элемент ListView в стиле таблицы с редактируемым полем. В него потребуется вставка одного столбца и одной (а можно и нескольких) записей. В элементе ListView с помощью соответствующих сообщений задаётся цвет текста и цвет заднего фона.
Ответить