Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WM_CTLCOLOR 
:(
    Опции темы
xTr1m
Дата 25.1.2006, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Вот есть такое сообщение, которое используется каогда необходимо перерисовать окно.
Код

HBRUSH CTestDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    
    if (CTLCOLOR_DLG  == nCtlColor)
    {
        delete brush;
        // Создание новой кисти
        brush = new CBrush;
        // Создание кисти со штриховкой
        brush->CreateHatchBrush(HS_DIAGCROSS, textColor);
        // Установка цвета фона "под штриховкой"
        pDC->SetBkColor(bkColor);
        // Установка цвета текста
        pDC->SetTextColor(textColor);
        // "Подменяем" кисть (возвращаем свою)
        return *brush;    }

    return hbr;

}



ну еще наверное надо в карте прописать
Код

BEGIN_MESSAGE_MAP()
    ON_WM_CTLCOLOR()
END_MESSAGE_MAP()


Ну вот этот пример для изменения цвета диалога, а если нужно изменить цвет Edit'а по щелчку на кнопке, то как тогда должен выглядеть ее обработчик? Пытался так, но что-то не выходит
Код

void CMyDlg::OnTestButton()
{
SendMessage(WM_CTLCOLOR);
// и так тоже пытался SendMessage(WM_CTLCOLOR, IDC_EDIT);
}

PM MAIL WWW ICQ   Вверх
Earnest
Дата 26.1.2006, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(xTr1m @ 25.1.2006, 23:14 Найти цитируемый пост)

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

Нет, это сообщение служит для того, чтобы дать возможность окнам изменить свой цвет во время перерисовки. И посылает его операционная система, а не клиентский код.
Цитата(MSDN)

The framework calls this member function when a child control is about to be drawn.

Для того, чтобы перерисовать окно нужно вызвать его метод Invalidate(). Тогда и WM_CTLCOLOR
тебе придет, и обрабатывай его на здоровье.


--------------------
...
PM   Вверх
xTr1m
Дата 26.1.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



А этот метод Invalidate() , он что без параметров? Если я в обработчике кнопки его вызову, то как ф-ия OnCtlColor() получит pDC именно Edit'а ? Если можно, то хоть маленький кусочек кода smile пасибо
PM MAIL WWW ICQ   Вверх
Earnest
Дата 26.1.2006, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Метод Invalidate() всего лишь говорит Windows, что окно хочет перерисоваться целиком. Есть еще InvalidateRect(LPRECT) - хочет перерисовать часть окна. В ответ на это Windows запоминает, какую часть окна нужно будет перерисовывать, и ставит в очередь сообщений WM_PAINT. Ты должен понимать, что прорисовка будет происходить после того, как Invalidate вернет управление, а не во время его работы.
Когда до него дойдет дело, контрол получит WM_PAINT и WM_CTLCOLOR, и там уже будет правильный HDC. Это забота Windows.
Какой пример тебе нужен? Invalidate можно вызывать в любой момент, в т.ч. и из обработчика кнопки.

Это сообщение отредактировал(а) Earnest - 26.1.2006, 17:57


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0425 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.