Изменение цвета отрисовки шрифта Edit-контрола без использования диалога!
Модераторы: Duncon, Hawk, Romeo, Eugie
Привет всем!
Возможно-ли изменить цвет отрисовки текста в окне Edit-контрола не используя WM_CTRCOLOREDIT. Понятно, что ели текст рисуешь самостоятельно, то это возможно, но если текст рисуется средствами системы как имзменить его цвет?
Возможно-ли изменить цвет отрисовки текста в окне Edit-контрола не используя WM_CTRCOLOREDIT. Понятно, что ели текст рисуешь самостоятельно, то это возможно, но если текст рисуется средствами системы как имзменить его цвет?
Может, ты имел в виду сообщение WM_CTLCOLOR?
По-моему, вполне нормальный вариант (обработать его).
Тебе же не придется самому отрисовывать текст еонтрола. Смысл перехвата этого сообщения - ты подменяешь кисть (Brush), используемую для отрисовки текста. То есть, никакого большого геморроя ты себе не зарабатываешь.
В MSDN есть пример перехвата этого обработчика с использованием MFC:
По-моему, вполне нормальный вариант (обработать его).
Тебе же не придется самому отрисовывать текст еонтрола. Смысл перехвата этого сообщения - ты подменяешь кисть (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;
}
WM_CTLCLOR - это сообщение уже давно deprecated. Оно использовалось в 16 битных версиях кода. А сейчас уже вовсю 64 бита!!! 

Ну не знаю. У меня вышеприведенный пример (в MFC-приложении) вполне себе работаетakahan писал(а):WM_CTLCLOR - это сообщение уже давно deprecated. Оно использовалось в 16 битных версиях кода. А сейчас уже вовсю 64 бита!!!![]()

А раз результат есть, причем есть без лишнего геморроя - значит способ приемлем.
Хотелось бы посмотреть на 64-битную версию кода, ax - 16, eax - 32. Вероятно eeax - это 64 :-)" писал(а):А сейчас уже вовсю 64 бита!!!
It's a long way to the top if you wanna rock'n'roll
Чушь! Где вы это взяли?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
В жизни программиста всего три плюса. Из них два - в Си++, а третий - крест на его могиле.
Лучше не перехватывать сообщения, а использовать элемент RichEdit. Для него есть специальное сообщение EM_SETBKGNDCOLOR.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
С RichEdit будет куча других проблем. Например контекстное меня для него не работает по умолчанию. Придётся создавать своё меню и писать для него обработчик. Использовать RichEdit - стрелять из пушки по воробьям в данном случае.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Даа! Перевожу!Сообщение от 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

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