Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не перекрашиваются контролы, обрабатываю WM_CTLCOLOR 
:(
    Опции темы
Dreamer_0x01
Дата 5.12.2005, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

Репутация: 9
Всего: 12



А конеретно - кнопки. Все остальные элементы, включая фон диалога, ведут себя нормально.

Делаю так:

В описании класса:
Код

    CBrush EditBrush,StaticBrush,ButtonBrush,DlgBrush;


В конструкторе:
Код

    this->ButtonBrush.CreateSolidBrush(RGB(0,0,0));
    this->StaticBrush.CreateSolidBrush(RGB(255,255,255));
    this->EditBrush.CreateSolidBrush(RGB(220,220,220));
    this->DlgBrush.CreateSolidBrush(RGB(0,0,0));


В обработчике сообщения WM_CTLCOLOR:

Код

HBRUSH CTestCtrlColorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    switch(nCtlColor)
    {
        case CTLCOLOR_STATIC:   
            {
                pDC->SetBkColor(RGB(255,255,255));
                pDC->SetTextColor(RGB(255,0,0));
                return (HBRUSH)this->StaticBrush.GetSafeHandle();
            }
        break;
        case CTLCOLOR_BTN:   
            pDC->SetTextColor(RGB(255,128,128));
            pDC->SetBkColor(RGB(0,0,0));
            return (HBRUSH)this->ButtonBrush.GetSafeHandle();
        break;
        case CTLCOLOR_EDIT:
        case CTLCOLOR_MSGBOX:
            pDC->SetBkColor(RGB(220,220,220));
            return (HBRUSH)this->EditBrush.GetSafeHandle();
        break;
        case CTLCOLOR_DLG:
            pDC->SetTextColor(RGB(255,128,128));
            return (HBRUSH)this->DlgBrush.GetSafeHandle();
        break;
    }
    return hbr;
}

Все перекрашивается, кроме кнопок. Как быть?




--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Dov
Дата 5.12.2005, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(Dreamer_0x01 @ 5.12.2005, 19:18)
А конеретно - кнопки.

имхо, нужно писать свой класс, производный от CButton, хотя могу ошибаться.



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
dont
Дата 6.12.2005, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 11.7.2005

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



The color of a standard CButton object is determined by system settings. If you want a different color for push buttons, use a CBitmapButton
P.S. Copyright by MSDN smile
PM MAIL ICQ   Вверх
Earnest
Дата 6.12.2005, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
The WM_CTLCOLORBTN message is sent to the parent window of a button before drawing the button. The parent window can change the button's text and background colors. However, only owner-drawn buttons respond to the parent window processing this message.

Так что... owner draw по тебе плачет. smile


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 6.12.2005, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

Репутация: 9
Всего: 12



Earnest
сделал OWNERDRAW.

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



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Любитель
Дата 7.12.2005, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 7
Всего: 92



Можно использовать ещё Custom Draw (переопределяем только цвет), в XP - точно работает, раньше - вообще не уверен, могу прислать пример.


--------------------
PM MAIL ICQ Skype   Вверх
Dreamer_0x01
Дата 7.12.2005, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

Репутация: 9
Всего: 12



Нужно, чтобы работало и в 98.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
JoyEx
Дата 7.12.2005, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


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

Репутация: 5
Всего: 12



Цитата(Dreamer_0x01 @ 7.12.2005, 16:54)
Нужно, чтобы работало и в 98.


Dreamer_0x01, ну тогда smile тебе на курсы художника-офмителя надо записываться и дружить с BS_OWNERDRAW, а если серЪёзно, то поищи src кнопки на http://codeguru.com/
http://www.codeproject.com/


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
takedo
Дата 8.12.2005, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

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



Dreamer_0x01
Наверное ты хочешь, чтобы кнопка у тебя отображала твое устройство, и в зависимости от его состояния имела разный цвет?
У меня так и есть, но я воспользовался DrawItem - в мсдн в мемберсах CButton есть примерчик. Там немного доработать в плане более правильной отрисовки, добавить в класс, производный от CButton переменную Condition и т.д. Если тебе ещё хочется, чтобы при выборе соотв. аппарата вылазили его настройки и кнопка в этот момент была нажата(когда на экране настройки), производи от CBitmapButton, только мне эта идея не понравилась - там конкретные рисунки надо сразу рисовать, немаштабируемые...
А с Button я и сам разобрался в свое время за 20 минут, без знания англ, так что у тебя не должно быть проблем.
Добавлено @ 09:19
Dreamer_0x01
Цитата
Теперь кнопка действительно перекрашивается, но и не более. То есть вместо кнопки теперь однородное пятно цвета задаваемого фона кнопки. Ни натписей, ни границ кнопки, ничего нет..
после этого надо прописать DrawItem
Добавлено @ 09:20
после стиля BS_OWNERDRAW
Добавлено @ 09:24
Кто знает как нарисовать объемный эллипс? В том смысле, честь ли функция типа ::DrawFrameControl только рисующая эллипс или произвольный многоугольник. Можно и самому отрисовывать, но с объемом проблемы. smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
AlexPro
Дата 8.12.2005, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 3
Всего: 4



Dreamer_0x01, думаю, стоит прислушаться к совету JoyEx (имею в виду посещение сайтов smile ). У меня тоже недавно была проблема с кнопками, хотя и несколько иного плана: понадобилась пара кнопок с картинками. Картиночки-то на кнопках я отобразил, но при этом самым возмутительным образом отвалились темы XP. Как говорится в рекламе: "И чем я его только не пробовала!... Но потом поимела себе класс CXPStyleButtonST - и пятен как не бывало!". smile Качал с http://www.codeproject.com/.
Есть также класс CButtonST того же автора - всякие там плоские, прозрачные, текстурные кнопки - в демо-проекте выглядит весьма симпатично. Вроде как раз то, что тебе надо. Легко подключается к проекту (CXPStyleButtonST по крайней мере, второй класс не использовал) - мне понравилось.
PM MAIL   Вверх
Dreamer_0x01
Дата 8.12.2005, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

Репутация: 9
Всего: 12



Не думал, что с кнопками все так сложно...Ладно, переопределим класс, что ж тут поделать...


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 8.12.2005, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Сочувствую и понимаю... из-за такой ерунды всю кнопку самому рисовать.

Но, в общем, кнопку нарисовать не так сложно. Посмотри функцию DrawFrameControl. У нее есть такой чудесный флажок DFCS_TRANSPARENT. Обещает, что фон не поменяет. Т.е. красишь фон как надо, и рисуешь DrawFrameControl с флагами DFC_BUTTON и этим транспарент, ну и другие флажки посмотри.
Именно это сама не пробовала, но вроде должно получиться.

Это, так сказать, программа-минимум.
Но можно и советом AlexPro воспользоваться - готовое решение поискать.


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 8.12.2005, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

Репутация: 9
Всего: 12



Earnest
Я вот поглядел функцию DrawItem,там я так понял контест устройства передается для различных состояний кнопки. Я правильно понимаю, что нарисовав что-то в этом контексте, я получу изображения кнопок для различных ее состояний? Или опять какая-то тонкость функция мне весь кайф испортит? И надо ли будет в этом случае DrawFrameControl вызывать (либо как-то наоборот запрещать его вызов, если он будет мешать?)

Просто я хочу полностью свой дизайн приложения сделать, ни на что не похожий, но сохраняющий некие стандарты. (в том числе это касается контролов).
Битмапы лепить не хочется, я наоборот, хочу как можно менее загруженный всякими объемностями/выпуклостями/рендерами интерфейс сделать, "строгий" и "максимально наглядный". Поэтому нарисовать нужные мне рамочки/значки в контексте устройства мне труда не составит. (Если это конечно тот самый контекст, в котором можно рисовать.)
Битмапами принципиально делать не хочу, так как мне нужно будет еще и ресайзинг контролов делать, то есть желательно все размеры каждый раз высчитывать динамически.

Цитата(Earnest @ 8.12.2005, 19:22)
Но можно и советом AlexPro воспользоваться - готовое решение поискать.


Во-первых, там все по-английски, а меня от таких страниц мутит =)
Во-вторых, там есть действительно очень хорошие примеры,может быть, возьму их за основу, но все равно, слишком много лишнего, и опять же, слишком "избыточно".




--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 8.12.2005, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не очень поняла твой вопрос. C таким же успехом, как DrawItem, ты мог бы переопределить OnPaint - как для любого своего окна. Но Windows делает за тебя часть работы: набивает структуру DRAWITEMSTRUCT и посылает паренту кнопки WM_DRAWITEM. Это стандартный путь Windows API. А MFC перехватывает это сообщение и вызывает виртуальную функцию DrawItem.
Контекст, который туда передается - это текущий контекст PAINT DC, ровно тот, где и надо рисовать. Ты должен отрисовать туда кнопку в текущем состоянии. Это состояние ты можешь получить из той же структуры DRAWITEMSTRUCT.
Собственно, в описании функции DrawItem для CButton есть пример кода:

Код

void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
   UINT uStyle = DFCS_BUTTONPUSH;

   // This code only works with buttons.
   ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);

   // If drawing selected, add the pushed style to DrawFrameControl.
   if (lpDrawItemStruct->itemState & ODS_SELECTED)
      uStyle |= DFCS_PUSHED;

   // Draw the button frame.
   ::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem, 
      DFC_BUTTON, uStyle);

   // Get the button's text.
   CString strText;
   GetWindowText(strText);

   // Draw the button text using the text color red.
   COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255,0,0));
   ::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(), 
      &lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
   ::SetTextColor(lpDrawItemStruct->hDC, crOldColor);
}


В этом примере, правда, наоборот, фон стандартный, а текст рисуется другим цветом.
Я вот подумала, что зря посоветовала тебе DrawFrameControl:
все, что она может для тебя сделать - это нарисовать правильную рамку (вдавленную или выдавленную). Но для этого есть отдельные функции DrawEdge и Draw3DRect (выбирай какая больше нравится).
Рамку фокуса рисовать - DrawFocusRect, дизабленный текст - GrayString.


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 8.12.2005, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

Репутация: 9
Всего: 12



Сморел я этот пример, еще тогда, когда takedo про него сказал.
Пробовал, перекрашивается...Но вот если присмотреться к стандартной кнопки, то при ее нажимании текст кнопки нажимается вместе с ней. А тут он остается неподвижным. Хотя, мне это как раз и не надо, я пожалуй так и сделаю, создам switch на lpDrawItemStruct->itemState и в его пунктах нарисую нужные мне рамки и значки.

Кстати, если в этом примере устроить в качестве фона SetBkColor - то получится мягко говоря не очень красивая надпись =)
Так что пришлось фон принудительно заливать в обработке OnPaint.



Это сообщение отредактировал(а) Dreamer_0x01 - 8.12.2005, 22:33


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


 




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


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

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