Учебник по Visual C++ .Net


Двойственные интерфейсы Технология - часть 3


HRESULT OnDraw(ATL_DRAWINFO& di)

{

//===== Преобразование RECTL в RECT

RECT& r = *(RECT*)di.prcBounds;

//===== Запоминаем текущую поврежденную область

HRGN hRgnOld = 0;

//== Функция GetClipRgn может возвратить: 0, 1 или -1

if (GetClipRgn(di.hdcDraw, hRgnOld) != 1) hRgnOld = 0;

//====== Создание новой области

HRGN hRgnNew = CreateRectRgn(r.left,r.top, r.right,r.bottom);

// Оптимистический прогноз (новая область воспринята)

bool bSelectOldRgn = false;

//=== Устанавливаем поврежденную область равной г

if (hRgnNew)

{

bSelectOldRgn = SelectClipRgn(di.hdcDraw,hRgnNew) == ERROR;

}

//=== Изменяем цвет фона и обрамляем объект

::rSelectObject(di.hdcDraw,

::CreateSolidBrush(m_clrFillColor)); Rectangle(di.hdcDraw, r.left, r.top,r.right,r.bottom);

//=== Параметры выравнивания текста и сам текст

SetTextAlign(di.hdcDraw, TA_CENTER | TA_BASELINE);

LPCTSTR pszText = _T("ATL 4.0 : OpenGL");

//=== Вывод текста в центр прямоугольника

TextOut(di.hdcDraw, (r.left + r.right)/2,

(r.top + r.bottom)/2,

pszText,Istrlen(pszText));

//=== Если был сбой, то устанавливаем старую область

if (bSelectOldRgn)

SelectClipRgn(di.hdcDraw, hRgnOld);

return S_OK;

}

В этой реализации функции OnDraw мы намеренно пошли на поводу у схемы, предложенной в заготовке. Структура RECTL, на которую указывает prcBounds, идентична структуре RECT, но при заливке она ведет себя на один пиксел лучше (см. справку). Здесь это никак не используется. Автору фрагмента не хотелось много раз писать выражение di. prcBounds->, поэтому он завел ссылку на объект типа RECTL, приведя ее к типу RECT. Здесь хочется «взять в руки» CRect, cstring и переписать фрагмент заново в более компактной форме, однако если вы попробуете это сделать, то получите сообщения о том, что CRect и cstring — неизвестные сущности. Они из другого царства MFC. Мы можем подключить поддержку MFC, но при этом многое потеряем. Одной из причин создания ATL была неповоротливость объектов на основе MFC в условиях web-страниц. Мы не можем себе этого позволить, так как собираемся работать с трехмерной графикой. Поэтому надо привыкать работать по правилам Win32-API и классов СОМ.




Начало  Назад  Вперед



Книжный магазин