![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Обновленный вариант исходного кода с поддержкой XP-тем -- внизу страницы !
Давно хотел поделиться способом, как реализовать кнопку с эффектом как в ICQ Lite (при наведении курсора мыши кнопка плавно изменяет свой цвет на более яркий; когда курсор "уходит" с кнопки - она также плавно меняет цвет на исходный). На самом деле всё это делается очень просто. 1) добавляем в проект файлы FadeBtn.h/FadeBtn.cpp (приведены ниже) 2) создаём окно (пусть это будет окно диалога), кидаем туда обычную кнопку 3) в свойствах кнопки выставляем флажок "Owner Draw" 4) заходим в Class Wizard, открываем вкладку "Member Variables" и создаём переменную для кнопки (Add Variable), выбираем Category: "Control", и Variable Type: "CFadingButton", пишем какое-нибудь имя, типа "m_btnFade" Начальный и конечный цвета перехода задаются переменными m_colorInactive и m_colorActive, плавность и скорость перехода цвета задаются через вызов функции ReinitFade(int nOneStepMillisecs, int nStepsColorChange). Эффект выглядит просто супер, особенно если прописать разные цвета (например красный и фиолетовый) в m_colorActive/m_colorInactive. Исходный текст файлов FadeBtn.h/.cpp: FadeBtn.h
FadeBtn.cpp
Это сообщение отредактировал(а) mr.DUDA - 8.1.2004, 12:30 -------------------- ![]() |
||||
|
|||||
| CaptainFlint |
|
|||
|
Искатель сокровищ ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 26.2.2003 Где: Москва Репутация: нет Всего: 23 |
mr.DUDA
Здорово придумано, респект! Ещё бы поддержку WinXP-стилей сюда впихнуть, а то на фоне закруглённых XP-шных кнопочек и тулбаров стандартный вид кнопки не вписывается... -------------------- Почему же, ё-моё, ты нигде не пишешь "ё"? -------------------- Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Угу, я тож об этом подумывал...
Обещаю сегодня-завтра закинуть вариант с поддержкой XP-тем. -------------------- ![]() |
|||
|
||||
| Paradox |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1135 Регистрация: 18.11.2002 Где: Россия Репутация: нет Всего: 1 |
Немного попарился, с вставкой такой кнопки, но ниче вставил - прикольно !!!
-------------------- --- |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Да, надо бы упростить вставку, но только как по-другому навесить свой класс на контрол ? Как вариант, можно было бы сделать как в FAQ (создание круглой кнопки) - там сам диалог обрабатывает рисование в OnDrawItem, и нужно только поставить "Owner draw" без всяких member variables.
-------------------- ![]() |
|||
|
||||
| CaptainFlint |
|
|||
|
Искатель сокровищ ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 26.2.2003 Где: Москва Репутация: нет Всего: 23 |
Что-то я не пойму - куда уж проще? Добавил два файла в проект, вместо CButton у переменной кнопки прописал CFadingButton, плюс свои настройки добавил - цвет и скорость - и всё! Ну и Owner Draw поставить ещё не забыть. Куда ещё проще-то? И главное - метод универсальный!
-------------------- Почему же, ё-моё, ты нигде не пишешь "ё"? -------------------- Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) |
|||
|
||||
| Paradox |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1135 Регистрация: 18.11.2002 Где: Россия Репутация: нет Всего: 1 |
-------------------- --- |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Если говорить о VC, то сделать студийный ocx, наподобии встроенного для добавления в проект ProgressWindow. |
|||
|
||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Как и было обещано -- улучшенное обновление первого варианта, с поддержкой XP-тем. Данный код подсвечивает кнопку путем умножения текущего цвета каждого пиксела на дробное число (гамма-коэффициент), определяемое для каждого канала своей переменной:
m_fMulGammaGreen - для канала зеленого (значения 0...0.5) m_fMulGammaRed - для канала красного m_fMulGammaBlue - синего Отличия такого способа в том, что кнопка действительно подсвечивается, а не отрисовывается самостоятельно, как в первом варианте. Поэтому, чтобы сделать кнопку красной при подсветке, нужно выставить m_fMulGammaRed равным например 0.3f, а остальные коэффициенты -- 0. Для управления скоростью и плавностью подсветки используются те же две переменные -- m_nStepsColorChange и m_nOneStepMillicecs. Способ "навешивания" эффекта на любую кнопку остался тем же (описан в первом варианте). Заранее спасибо за ваши ответы, all. (для тех, кому лень возиться со вставкой текста в файл - вот все исходники вместе с демонстрационной прогой, в одном архиве: FadeBtnDemo.rar) FadeBtn.h
FadeBtn.cpp
Это сообщение отредактировал(а) mr.DUDA - 8.1.2004, 12:54 -------------------- ![]() |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |