Шаг 210 - Градиентная заливка

----- Original Message ----- 
From: SLY 
To: kaev@yandex.ru
Sent: Wednesday, July 26, 2000 7:15 PM
Subject: MFCByStep

Привет всем ! Посылаю пример организации градиентной заливки контекста
окна. Пример реализован для диалогового окна но может быть применен где угодно
так как сама заливка реализована в виде функции GradientFillRect

Вот как она выглядит:

210.jpg (10239 b)

Давайте посмотрим код. Реализуется эта заливка в функции OnPaint. То есть при перерисовке диалогового окна вызывается функция GradientFillRect.

void CGradientDlg::OnPaint() 
{
	if (IsIconic())
	{
		.........
	}
	else
	{
		CPaintDC dc(this); // получаем контекст устройтсва для рисования
		CRect rect;	  
		GetClientRect(rect); // получаем размер области рисования
		// вызываем функцию рисования
		GradientFillRect(dc.GetSafeHdc(),rect,RGB(255,0,0),RGB(0,0,255),128);
	}
}

Теперь при изменении размера окна вызывется перерисовка, используя Invalidate в ответ на сообщение WM_SIZE.

void CGradientDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	//обновить при изменении размеров
    	Invalidate();	
}

Ну вот и сама функция:

void CGradientDlg::GradientFillRect(HDC pDC, CRect ARect,
	COLORREF StartColor,COLORREF EndColor, int Colors)
{

//если квадрат пустой то выйти if (ARect.IsRectEmpty()) return; HBRUSH Brush; //если кол-во цветов меньше двух то закрасить первым цветом и выйти if (Colors < 2) { Brush = CreateSolidBrush(StartColor); FillRect(pDC, ARect, Brush); DeleteObject(Brush); return; } BYTE StartRGB[3]; int RGBDelta[3]; CRect ColorBand; int I,Delta; //начальные состовляющие цвета StartRGB[0] = GetRValue(StartColor); StartRGB[1] = GetGValue(StartColor); StartRGB[2] = GetBValue(StartColor); //шаг изменения цвета RGBDelta[0] = GetRValue(EndColor) - StartRGB[0]; RGBDelta[1] = GetGValue(EndColor) - StartRGB[1]; RGBDelta[2] = GetBValue(EndColor) - StartRGB[2]; ColorBand = ARect; Colors = max(2, min(Colors, ARect.Height())); Delta = (int)(ARect.Height() / Colors); //закрасить основную часть окна if (Delta>0) for (I=0;I<Colors;I++) { ColorBand.top = ARect.top + I * Delta; ColorBand.bottom = ColorBand.top + Delta; Brush = CreateSolidBrush(RGB( StartRGB[0] + MulDiv(I, RGBDelta[0], Colors - 1), StartRGB[1] + MulDiv(I, RGBDelta[1], Colors - 1), StartRGB[2] + MulDiv(I, RGBDelta[2], Colors - 1))); FillRect(pDC, ColorBand, Brush); DeleteObject(Brush); } //закрасить оставшуюся часть окна div_t Res; Res=div(ARect.Height() , Colors); Delta =Res.rem;//остаток от деления if (Delta>0) for (I=0;I<Colors;I++) { ColorBand.top = ARect.bottom - Delta; ColorBand.bottom = ColorBand.top + Delta; Brush = CreateSolidBrush(EndColor); FillRect(pDC, ColorBand, Brush); DeleteObject(Brush); } }

Вот так оно и красится. Если есть еще вопросы смотрите проект.

Материалы для шага прислал SLY (sly@vmz.nnov.ru).


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 27.07.2000