Создание круглых кнопок и кнопок в виде элипса.Автор: 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
Данный пример основан на предыдущем классе, с той лишь разницей, что кнопки не круглые, а в виде элипса. Класс используется точно так же как предыдущий.
|