Изменение цветов в CEdit
От: Аноним  
Дата: 01.10.04 12:13
Оценка:
Хэлп ми пли-иис!
Целый день голову ломаю, никак не могу найти подходящий класс.
В общем, как сделать чтобы у CEdit'а (однострочного) по ходу программы (в зависимости от дейтвий пользователя) менялся цвет текста, цвет фона и стиль шрифта.
Грамотный и своевременный ответ без вознаграждения не останется!
Re: Изменение цветов в CEdit
От: p0l  
Дата: 01.10.04 12:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Хэлп ми пли-иис!

А>Целый день голову ломаю, никак не могу найти подходящий класс.
А>В общем, как сделать чтобы у CEdit'а (однострочного) по ходу программы (в зависимости от дейтвий пользователя) менялся цвет текста, цвет фона и стиль шрифта.
А>Грамотный и своевременный ответ без вознаграждения не останется!

Сабкласся и копаф в сторону вот ниже приведенного:

RESULT CMyEdit::SOnCtlColor(LRESULT *pResult, HDC hdc, HWND hParent)
{
SetBkMode(hdc,TRANSPARENT);
SetTextColor(hdc,RGB(255,0,0));

*pResult = TRUE;

return (LRESULT)GetStockObject(NULL_BRUSH);
}

ОлЗэбэст
Re: Изменение цветов в CEdit
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 01.10.04 12:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Целый день голову ломаю, никак не могу найти подходящий класс.


Здесь искали?

А>В общем, как сделать чтобы у CEdit'а (однострочного) по ходу программы (в зависимости от дейтвий пользователя) менялся цвет текста, цвет фона и стиль шрифта.


Есть два способа:

  1. Обработать в окне-родителе этого эдита сообщение WM_CTLCOLOR.
  2. Отнаследоваться от CEdit и обработать то же самое сообщение в наследнике, используя ON_WM_CTLCOLOR_REFLECT и TN062: Message Reflection for Windows Controls.

И в том и в другом случае рекомендую внимательно прочитать документацию из PSDK касающуюся обработки сообщения WM_CTLCOLOREDIT, обратив внимание на то, что

Read-only or disabled edit controls do not send the WM_CTLCOLOREDIT message; instead, they send the WM_CTLCOLORSTATIC message.


То есть в OnCtlColor() Вам нужно будет анализировать параметр nCtlColor не только на равенство CTLCOLOR_EDIT, но и на равенство CTLCOLOR_STATIC.

А>Грамотный и своевременный ответ без вознаграждения не останется!


Спасибо, вознаграждение не требуется.
- Искренне ваш, Поросенок Пафнутий
Re[2]: Дополнение
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 01.10.04 12:49
Оценка:
По поводу изменения шрифта было, например, здесь
Автор:
Дата: 30.09.04
— для эдита все аналогично.
- Искренне ваш, Поросенок Пафнутий
Re[2]: Изменение цветов в CEdit
От: Аноним  
Дата: 02.10.04 15:33
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здесь искали?


Ну да, искал я там. Там одни полноценные цветовые редакторы, а мне нужен маленький CEdit, немногострочный, простенький и без лишней функциональности.

SDB>Есть два способа:


SDB>

    SDB>
  1. Обработать в окне-родителе этого эдита сообщение WM_CTLCOLOR.
    SDB>
  2. Отнаследоваться от CEdit и обработать то же самое сообщение в наследнике, используя ON_WM_CTLCOLOR_REFLECT и TN062: Message Reflection for Windows Controls.
    SDB>

Да, я пробовал именно второй (брал пример отсюда http://www.rsdn.ru/Forum/?mid=386559). Цвет меняется, но ведь только один раз, в момент создания. А мне нужно, еще раз повторю, по ходу программы. Я непонимаю принцип действия этого кода, ему что надо сообщение WM_CTLCOLOR посылать? Если так, то как это делать??
Re[3]: Изменение цветов в CEdit
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 02.10.04 23:10
Оценка: 2 (1)
Здравствуйте, <Аноним>, Вы писали:

А> Ну да, искал я там. Там одни полноценные цветовые редакторы, а мне нужен маленький CEdit, немногострочный, простенький и без лишней функциональности.




SDB>>

    SDB>>
  1. Отнаследоваться от CEdit и обработать то же самое сообщение в наследнике, используя ON_WM_CTLCOLOR_REFLECT и TN062: Message Reflection for Windows Controls.
    SDB>>

А>Да, я пробовал именно второй (брал пример отсюда http://www.rsdn.ru/Forum/?mid=386559). Цвет меняется, но ведь только один раз, в момент создания. А мне нужно, еще раз повторю, по ходу программы. Я непонимаю принцип действия этого кода, ему что надо сообщение WM_CTLCOLOR посылать? Если так, то как это делать??


Гх-м-м... AFAIK сообщение WM_CTLCOLOR посылается всякий раз, когда винде нужно узнать, как рисовать данный контрол. Насколько я понимаю, Вы хотите перекрашивать Ваш эдит прямо в процессе набора текста, например. Попробуйте вызывать RedrawWindow(), а в коде обработчика WM_CTLCOLOR пропишите отрисовку в соответствии с тем, как выглядит текст в данный момент.

P.S.
Сообщения посылаются с помощью методов CWnd::SendMessage() и CWnd::PostMessage().
[ posted via RSDN@Home 1.1.2 stable, accompanied by Iron Maiden — Two Minutes To Midnight ]
- Искренне ваш, Поросенок Пафнутий
Re[4]: Изменение цветов в CEdit
От: Nark81  
Дата: 03.10.04 15:40
Оценка:
Спасибо, понял! В том примере надо было написать приблизительно так:
m_Edit3.m_clrText=RGB(255,0,0);
m_Edit3.Invalidate();

Сейчас пытаюсь изменить кисть для фона (что-то неполучатся), но надеюсь что получится.
Спасибо за помощь, поставил оценку.
Re[5]: Изменение цветов в CEdit
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 04.10.04 04:57
Оценка:
Здравствуйте, Nark81, Вы писали:

N>Сейчас пытаюсь изменить кисть для фона (что-то неполучатся), но надеюсь что получится.


У меня в одном из проектов это делается так:

HBRUSH COptionsPage::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT uCtlColor)
{
    HBRUSH hbr;

    switch (pWnd->GetDlgCtrlID())
    {
    case IDC_EDIT_SOURCE:
    case IDC_EDIT_TARGET:
        if (uCtlColor == CTLCOLOR_STATIC) {
            pDC->SetBkColor(::GetSysColor(COLOR_WINDOW));
            pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
            hbr = ::GetSysColorBrush(COLOR_WINDOW);
            break;
        }
    default:
        hbr = CPropertyPage::OnCtlColor(pDC, pWnd, uCtlColor);
    }
    return (hbr);
}


Здесь read-only EDITы перекрашиваются из серых в стандартные цвета.
- Искренне ваш, Поросенок Пафнутий
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.