| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Кнопка с плавной подсветкой при наведении мыши |
| Автор: mr.DUDA 28.12.2003, 19:01 | ||||
| Обновленный вариант исходного кода с поддержкой 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
|
| Автор: CaptainFlint 28.12.2003, 22:15 |
| mr.DUDA Здорово придумано, респект! Ещё бы поддержку WinXP-стилей сюда впихнуть, а то на фоне закруглённых XP-шных кнопочек и тулбаров стандартный вид кнопки не вписывается... |
| Автор: mr.DUDA 29.12.2003, 11:31 |
| Угу, я тож об этом подумывал... Обещаю сегодня-завтра закинуть вариант с поддержкой XP-тем. |
| Автор: Paradox 29.12.2003, 12:30 |
| Немного попарился, с вставкой такой кнопки, но ниче вставил - прикольно !!! |
| Автор: mr.DUDA 29.12.2003, 13:51 |
| Да, надо бы упростить вставку, но только как по-другому навесить свой класс на контрол ? Как вариант, можно было бы сделать как в FAQ (создание круглой кнопки) - там сам диалог обрабатывает рисование в OnDrawItem, и нужно только поставить "Owner draw" без всяких member variables. |
| Автор: CaptainFlint 29.12.2003, 13:54 |
| Что-то я не пойму - куда уж проще? Добавил два файла в проект, вместо CButton у переменной кнопки прописал CFadingButton, плюс свои настройки добавил - цвет и скорость - и всё! Ну и Owner Draw поставить ещё не забыть. Куда ещё проще-то? И главное - метод универсальный! |
| Автор: Paradox 29.12.2003, 14:45 | ||
|
| Автор: DENNN 29.12.2003, 14:51 | ||
Если говорить о VC, то сделать студийный ocx, наподобии встроенного для добавления в проект ProgressWindow. |
| Автор: mr.DUDA 8.1.2004, 12:41 | ||||
| Как и было обещано -- улучшенное обновление первого варианта, с поддержкой XP-тем. Данный код подсвечивает кнопку путем умножения текущего цвета каждого пиксела на дробное число (гамма-коэффициент), определяемое для каждого канала своей переменной: m_fMulGammaGreen - для канала зеленого (значения 0...0.5) m_fMulGammaRed - для канала красного m_fMulGammaBlue - синего Отличия такого способа в том, что кнопка действительно подсвечивается, а не отрисовывается самостоятельно, как в первом варианте. Поэтому, чтобы сделать кнопку красной при подсветке, нужно выставить m_fMulGammaRed равным например 0.3f, а остальные коэффициенты -- 0. Для управления скоростью и плавностью подсветки используются те же две переменные -- m_nStepsColorChange и m_nOneStepMillicecs. Способ "навешивания" эффекта на любую кнопку остался тем же (описан в первом варианте). Заранее спасибо за ваши ответы, all. (для тех, кому лень возиться со вставкой текста в файл - вот все исходники вместе с демонстрационной прогой, в одном архиве: http://www.logicsoftware.net/sos/downloads/FadeBtnDemo.rar) FadeBtn.h
FadeBtn.cpp
|