![]() |
|
|
![]()
|
|
| Dreamer_0x01 |
|
||||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
А конеретно - кнопки. Все остальные элементы, включая фон диалога, ведут себя нормально.
Делаю так: В описании класса:
В конструкторе:
В обработчике сообщения WM_CTLCOLOR:
-------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||||
|
|||||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: нет Всего: 88 |
имхо, нужно писать свой класс, производный от CButton, хотя могу ошибаться. -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| dont |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Так что... owner draw по тебе плачет. -------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Earnest
сделал OWNERDRAW. Теперь кнопка действительно перекрашивается, но и не более. То есть вместо кнопки теперь однородное пятно цвета задаваемого фона кнопки. Ни натписей, ни границ кнопки, ничего нет.. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 7 Всего: 92 |
Можно использовать ещё Custom Draw (переопределяем только цвет), в XP - точно работает, раньше - вообще не уверен, могу прислать пример.
|
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Нужно, чтобы работало и в 98.
-------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
Dreamer_0x01, ну тогда http://www.codeproject.com/ -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Dreamer_0x01
Наверное ты хочешь, чтобы кнопка у тебя отображала твое устройство, и в зависимости от его состояния имела разный цвет? У меня так и есть, но я воспользовался DrawItem - в мсдн в мемберсах CButton есть примерчик. Там немного доработать в плане более правильной отрисовки, добавить в класс, производный от CButton переменную Condition и т.д. Если тебе ещё хочется, чтобы при выборе соотв. аппарата вылазили его настройки и кнопка в этот момент была нажата(когда на экране настройки), производи от CBitmapButton, только мне эта идея не понравилась - там конкретные рисунки надо сразу рисовать, немаштабируемые... А с Button я и сам разобрался в свое время за 20 минут, без знания англ, так что у тебя не должно быть проблем. Добавлено @ 09:19 Dreamer_0x01
Добавлено @ 09:20 после стиля BS_OWNERDRAW Добавлено @ 09:24 Кто знает как нарисовать объемный эллипс? В том смысле, честь ли функция типа ::DrawFrameControl только рисующая эллипс или произвольный многоугольник. Можно и самому отрисовывать, но с объемом проблемы. -------------------- я не гольфист - я хоккеист |
|||
|
||||
| AlexPro |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 9.11.2005 Где: Санкт-Петербург Репутация: 3 Всего: 4 |
Dreamer_0x01, думаю, стоит прислушаться к совету JoyEx (имею в виду посещение сайтов
Есть также класс CButtonST того же автора - всякие там плоские, прозрачные, текстурные кнопки - в демо-проекте выглядит весьма симпатично. Вроде как раз то, что тебе надо. Легко подключается к проекту (CXPStyleButtonST по крайней мере, второй класс не использовал) - мне понравилось. |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Не думал, что с кнопками все так сложно...Ладно, переопределим класс, что ж тут поделать...
-------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Сочувствую и понимаю... из-за такой ерунды всю кнопку самому рисовать.
Но, в общем, кнопку нарисовать не так сложно. Посмотри функцию DrawFrameControl. У нее есть такой чудесный флажок DFCS_TRANSPARENT. Обещает, что фон не поменяет. Т.е. красишь фон как надо, и рисуешь DrawFrameControl с флагами DFC_BUTTON и этим транспарент, ну и другие флажки посмотри. Именно это сама не пробовала, но вроде должно получиться. Это, так сказать, программа-минимум. Но можно и советом AlexPro воспользоваться - готовое решение поискать. -------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Earnest
Я вот поглядел функцию DrawItem,там я так понял контест устройства передается для различных состояний кнопки. Я правильно понимаю, что нарисовав что-то в этом контексте, я получу изображения кнопок для различных ее состояний? Или опять какая-то тонкость функция мне весь кайф испортит? И надо ли будет в этом случае DrawFrameControl вызывать (либо как-то наоборот запрещать его вызов, если он будет мешать?) Просто я хочу полностью свой дизайн приложения сделать, ни на что не похожий, но сохраняющий некие стандарты. (в том числе это касается контролов). Битмапы лепить не хочется, я наоборот, хочу как можно менее загруженный всякими объемностями/выпуклостями/рендерами интерфейс сделать, "строгий" и "максимально наглядный". Поэтому нарисовать нужные мне рамочки/значки в контексте устройства мне труда не составит. (Если это конечно тот самый контекст, в котором можно рисовать.) Битмапами принципиально делать не хочу, так как мне нужно будет еще и ресайзинг контролов делать, то есть желательно все размеры каждый раз высчитывать динамически.
Во-первых, там все по-английски, а меня от таких страниц мутит =) Во-вторых, там есть действительно очень хорошие примеры,может быть, возьму их за основу, но все равно, слишком много лишнего, и опять же, слишком "избыточно". -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Не очень поняла твой вопрос. C таким же успехом, как DrawItem, ты мог бы переопределить OnPaint - как для любого своего окна. Но Windows делает за тебя часть работы: набивает структуру DRAWITEMSTRUCT и посылает паренту кнопки WM_DRAWITEM. Это стандартный путь Windows API. А MFC перехватывает это сообщение и вызывает виртуальную функцию DrawItem.
Контекст, который туда передается - это текущий контекст PAINT DC, ровно тот, где и надо рисовать. Ты должен отрисовать туда кнопку в текущем состоянии. Это состояние ты можешь получить из той же структуры DRAWITEMSTRUCT. Собственно, в описании функции DrawItem для CButton есть пример кода:
В этом примере, правда, наоборот, фон стандартный, а текст рисуется другим цветом. Я вот подумала, что зря посоветовала тебе DrawFrameControl: все, что она может для тебя сделать - это нарисовать правильную рамку (вдавленную или выдавленную). Но для этого есть отдельные функции DrawEdge и Draw3DRect (выбирай какая больше нравится). Рамку фокуса рисовать - DrawFocusRect, дизабленный текст - GrayString. -------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Сморел я этот пример, еще тогда, когда takedo про него сказал.
Пробовал, перекрашивается...Но вот если присмотреться к стандартной кнопки, то при ее нажимании текст кнопки нажимается вместе с ней. А тут он остается неподвижным. Хотя, мне это как раз и не надо, я пожалуй так и сделаю, создам switch на lpDrawItemStruct->itemState и в его пунктах нарисую нужные мне рамки и значки. Кстати, если в этом примере устроить в качестве фона SetBkColor - то получится мягко говоря не очень красивая надпись =) Так что пришлось фон принудительно заливать в обработке OnPaint. Это сообщение отредактировал(а) Dreamer_0x01 - 8.12.2005, 22:33 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |