ActiveX с нуля

Рисование элемента управления.


Отрисовка элемента управления осуществляется в методе OnDraw. Параметры этого метода содержат указатель на контекст устройства, размеры прямоугольника, определяющего границы элемента и прямоугольник , в пределах которого необходимо выполнить перерисовку.

В общем случае внешний вид элемента может зависеть от некоторых свойств элемента, в нашем случае – от свойств Shape и Select, связанных с переменными m_bSelected и m_nShape:

void CMyCtrlCtrl::OnDraw(

     CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)

{

     CPen pen;

     CBrush foreBrush, backBrush;

     CPoint points[3];

     pdc->SaveDC();

     pen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));

     backBrush.CreateSolidBrush(TranslateColor(AmbientBackColor()));

     foreBrush.CreateSolidBrush(GetSelected() ? RGB(255, 0, 0) : RGB(0, 255, 0));

     pdc->FillRect(rcBounds, &backBrush);



     pdc->SelectObject(&pen);

     pdc->SelectObject(&foreBrush);

     switch (m_nShape)

     {

     case 0:

          pdc->Ellipse(rcBounds);

          break;

     case 1:

          pdc->Rectangle(rcBounds);

          break;

     case 2:

          points[0].x = rcBounds.left;

          points[0].y = rcBounds.bottom - 1;

          points[1].x = (rcBounds.left + rcBounds.right - 1) / 2;

          points[1].y = rcBounds.top;

          points[2].x = rcBounds.right - 1;

          points[2].y = rcBounds.bottom - 1;

          pdc->Polygon(points, 3);

          break;

     }

     pdc->RestoreDC(-1);

}

Обратите внимание на использование функции AmbientBackColor. Это одна из функций, которые обеспечивают получение свойств окружения контейнера. В нашем случае фон элемента будет совпадать с фоном контейнера. Функция AmbientBackColor возвращает значение типа OLE_COLOR. Для  его преобразования в RGB-значение используется функция TranslateColor, также определенная в классе COLEControl.



Содержание раздела