----- Original Message ----- From: SLY To: kaev@yandex.ru Sent: Wednesday, July 26, 2000 7:15 PM Subject: MFCByStep Привет всем ! Посылаю пример организации градиентной заливки контекста окна. Пример реализован для диалогового окна но может быть применен где угодно так как сама заливка реализована в виде функции GradientFillRect
Вот как она выглядит:
Давайте посмотрим код. Реализуется эта заливка в функции 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).