Создание круглых кнопок и кнопок в виде элипса.
Автор: Chris Maunder
Вам захотелось в свою
программу добавить какой-то нестандартности?.
Можно начать с кнопок :) Два класса, которые здесь
представлены, не что иное, как обыкновенная
замена стандартному классу CButton. Всё, что от Вас
требуется, это включить исходники в Ваш проект и
прописать хедеры(#include).
После этого достаточно объявить ваш объект как
CRoundButton или CEllipticalButton (для элипса)вместо обычного
CButton.
Как видно из скриншота, по краям кнопка имеет
плавный переход цвета, что добавляет её
элегантности :) Ключевой момент - это алгоритм, по
которому производится вычисление цвета:
COLORREF GetColour(double dAngle, COLORREF crBright, COLORREF crDark)
{
#define Rad2Deg 180.0/3.1415
#define LIGHT_SOURCE_ANGLE -2.356 // -2.356 радиан = -135 градусов,
// Т.е. с верхнего левого края экрана
ASSERT(dAngle > -3.1416 && dAngle < 3.1416);
double dAngleDifference = LIGHT_SOURCE_ANGLE - dAngle;
if (dAngleDifference < -3.1415) dAngleDifference = 6.293 + dAngleDifference;
else if (dAngleDifference > 3.1415) dAngleDifference = 6.293 - dAngleDifference;
double Weight = 0.5*(cos(dAngleDifference)+1.0);
BYTE Red = (BYTE) (Weight*GetRValue(crBright) + (1.0-Weight)*GetRValue(crDark));
BYTE Green = (BYTE) (Weight*GetGValue(crBright) + (1.0-Weight)*GetGValue(crDark));
BYTE Blue = (BYTE) (Weight*GetBValue(crBright) + (1.0-Weight)*GetBValue(crDark));
return RGB(Red, Green, Blue);
}
Это простая линейная интерполяция между двумя
цветами, основанная на косинусе угла между
источником света и точкой. Углы измеряются от +ve
x-оси (т.е. (1,0) = 0 градусов, (0,1) = 90 градусов ), не
забудьте, что положительная y-координата идёт
вниз.
Кнопки в виде элипса
Автор: Raghav Gupta
Данный пример основан на предыдущем классе, с
той лишь разницей, что кнопки не круглые, а в виде
элипса. Класс используется точно так же как
предыдущий.
|