15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту




Создание круглых кнопок и кнопок в виде элипса.

Автор: Chris Maunder

Sample Image

Вам захотелось в свою программу добавить какой-то нестандартности?. Можно начать с кнопок :) Два класса, которые здесь представлены, не что иное, как обыкновенная замена стандартному классу 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

EllipticButtons.jpg (8697 bytes)

Данный пример основан на предыдущем классе, с той лишь разницей, что кнопки не круглые, а в виде элипса. Класс используется точно так же как предыдущий.