В данном документе описывается элемент управления кнопка CStyleButton объемного стиля. CStyleButton - полноценная объемная кнопка ОС Windows. Кнопка моделирует освещение цилиндрической поверхности под различными углами к горизонту. Выпуклость кнопки изменяется от нулевой, до полукруглой. Минимальная освещённость кнопки так же варьируется. Для работы с кнопкой необходимо использовать библиотеку NCViewPanel.dll. Соглашениеоб использовании.
Соглашение об использовании
Разрешается использовать библиотеку NCViewPanel.dll в программных проектах (в том числе коммерческих) со ссылкой на разработчика.
Принцип отрисовки
Для придания элементу управления объемной (цилиндрической) формы используется следующая схема расчета освещенности (см. Рис. 1).
Рис. 1
Обозначения:
H - высота кнопки;
R - радиус воображаемой цилиндрической поверхности кнопки;
F - фронтальная плоскость кнопки;
S - воображаемый источник света;
Jmax - точка с максимальной интенсивностью освещённости - зенит;
Jmin - точка с минимальной интенсивностью освещённости;
h - текущая высота, при отрисовке кнопки;
- угол освещения;
- текущий угол при отрисовке кнопки;
- угол выпуклости кнопки.
На цилиндрической поверхности элемента управления выделяется наиболее освещённая его часть (зенит), и от неё идет постепенное уменьшение интенсивности освещёния до какого-то минимального значения.
Т.о. возможно принять интенсивность освещённости (J) самой освещённой части (зенита) за единицу. А интенсивности отраженного света будет пропорциональна косинусу угла ( -).
В схеме приняты следующие допущения:
все лучи от источника света идут параллельно
интенсивность освещенности участков, на которые не падают лучи от источника, равна некоторой начальной минимальной величине интенсивности (Jmin).
Итак, входными параметрами для данной задачи будут являться:
- угол освещения;
- угол выпуклости кнопки и
H - размер самого элемента управления.
Два последних связанны с радиусом цилиндрической поверхности кнопки через следующую формулу.
Угол является текущим углом при рисовании фона кнопки. Этот угол характеризует некоторую горизонтальную линию. Весь фон кнопки состоит из горизонтальных линий, яркость цвета которых зависит от удалённости данной линии от линии с максимальной освещённостью.
где h ограничено,H/2>h>0.Начальным значением является угол .
Таким образом, последовательно сверху вниз рисуем горизонтальные линии, яркость которых будет зависеть от величин углов и .Текущая величина интенсивности освещенности линии вычисляется следующим образом:
Использование библиотеки в приложении
Библиотека NCViewPanel.dll предоставляет следующие возможностей по изменению внешнего вида кнопки (элемента управления):
Изменение фона кнопки, с имитацией цилиндрической поверхности. Угол освещенности и величина выпуклости цилиндра величины изменяемые.
Изменение надписи на кнопки, с возможностью табуляции и выбора шрифтов.
В библиотеке реализован механизм двойной буферизации, который предотвращает мерцание при перерисовке.
Чтобы использовать базовые возможности библиотеки NCViewPanel.dll необходимо сделать следующее:
Создать элемент управления, который необходимо изменить. Для этого требуется подключить к проекту NCViewPanel.dll, NCViewPanel.lib и заголовочный файл NCViewPanel.h. Объявить переменную класса CStyleButton.
CStyleButton m_Btn;
В функции инициализации выполнить связывание объекта типа CStyleButton с элементом управления:
m_Btn.SubclassDlgItem(IDC_BUTTON1, this);
Далее используем функции настройки вида кнопки. Вначале устанавливаем базовый цвет кнопки, соответствующие уголы, задаём текст (Рис. 2).
Класс CStyleButton содержит следующую функциональность.
Функции для работы с освещённостью
Позволяют изменить цвет, угол падения света, радиус выпуклости (вогнутости).
void SetBaseColor(COLORREF Color)
Устанавливает базовый цвет кнопки и минимальную её освещённость.
Parameters
COLORREF Color
Базовый цвет кнопки.
void SetGamm(double Gamm)
Задаёт угол освещения цилиндрической кнопки источником света.
Parameters
double Gamm
Угол освещения. При условии, что источник света находится сверху от цилиндрической кнопки и этот параметр лежит в пределах [0;90], то цилиндрическая кнопка будет выглядеть как выпуклый цилиндр. При тех же условиях, но при этом параметре лежащем в приделах [0;-90], цилиндрическая кнопка будет выглядеть как вогнутый цилиндр.
void SetTau(double Tau)
Задаёт радиус цилиндрической кнопки, учитывая её высоту.
Parameters
double Tau
Угол между двумя линиями, проходящими через центр окружности цилиндра кнопки. Одна из которых проходит через среднюю линию прямоугольника кнопки, а другая через одну из горизонтальных её сторон (см. Рис. 1).
void SetMinIntens(int Jmin)
Задаёт минимальную интенсивность освещённости.
Parameters
int Jmin
Минимальная интенсивность освещения кнопки. Задаётся в процентах от 0 до 100.
Эти функции задают шрифт текста кнопки. Первая из них обладает расширенными возможностями для создания шрифта.
Parameters
LOGFONT* lpLf
Указатель на структуру описывающую шрифт текста.
double SizeFont
Размер символов шрифта в пунктах (эти единицы используются, например в MSWord, одна единица составляет 1/72 дюйма).
CString NameFont
Задаёт имя шрифта.
LPLOGFONT GetCurLf()
Функция возвращает текущий шрифт кнопки.
Return Values
Возвращает структуру, определяющую шрифт кнопки.
Свойства для работы с цветом и текстом
Предоставляют пользователю возможность работы с цветами кнопки с помощью своих get put методов.
COLORREF BackColor
Позволяет взять/установить цвет кнопки.
COLORREF FontColor
Позволяет взять/установить цвет шрифта текста кнопки.
CString strTextBut
Позволяет взять/установить текст, выводимый на кнопке.
Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.