Поделиться через


Элементы управления ActiveX в MFC. Закраска элементов управления ActiveX

В этой статье описывается процесс рисования элементов управления ActiveX и способы изменения кода краски для оптимизации процесса. (См. раздел Оптимизация рисования элементов управления для методов оптимизации рисования путем индивидуального восстановления выбранных объектов GDI. После рисования всех элементов управления контейнер может автоматически восстановить исходные объекты.)

Важно!

ActiveX — это устаревшая технология, которую не следует использовать для новых разработок. Дополнительные сведения о современных технологиях, которые заменяют ActiveX, см. в разделе Элементы ActiveX.

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

Рассмотрены следующие вопросы:

Процесс рисования элемента управления ActiveX

Когда элементы ActiveX изначально отображаются или перезаписываются, они следуют процессу рисования, аналогично другим приложениям, разработанным с помощью MFC, с одним важным различием: элементы ActiveX могут находиться в активном или неактивном состоянии.

Активный элемент управления представлен в контейнере элементов управления ActiveX дочерним окном. Как и другие окна, он несет ответственность за рисование себя при получении WM_PAINT сообщения. Базовый класс элемента управления COleControl обрабатывает это сообщение в своей OnPaint функции. Эта реализация по умолчанию вызывает OnDraw функцию элемента управления.

Неактивный элемент управления по-разному окрашен. Если элемент управления неактивен, его окно является невидимым или несуществующим, поэтому оно не может получить сообщение с краской. Вместо этого контейнер управления напрямую вызывает OnDraw функцию элемента управления. Это отличается от процесса рисования активного элемента управления в том, что OnPaint функция-член никогда не вызывается.

Как описано в предыдущих абзацах, обновление элемента ActiveX зависит от состояния элемента управления. Однако, поскольку платформа вызывает OnDraw функцию-член в обоих случаях, вы добавляете большинство кода рисования в эту функцию-член.

Функция-член обрабатывает рисование OnDraw элементов. Если элемент управления неактивен, контейнер управления вызывает OnDraw, передав контекст устройства контейнера управления и координаты прямоугольной области, занятой элементом управления.

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

Примечание.

Важно, чтобы изменения OnDraw не зависели от верхней левой точки прямоугольника, равной (0, 0), и что вы рисуете только внутри прямоугольника, переданного в OnDraw. Непредвиденные результаты могут возникнуть, если вы рисуете за пределами области прямоугольника.

Реализация по умолчанию, предоставляемая мастером элементов управления ActiveX MFC в файле реализации элемента управления (. CPP), показанный ниже, красит прямоугольник с белой кистью и заполняет многоточие текущим цветом фона.

void CMyAxUICtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
   if (!pdc)
      return;

   // TODO: Replace the following code with your own drawing code.
   pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
   pdc->Ellipse(rcBounds);
}

Примечание.

При рисовании элемента управления не следует делать предположения о состоянии контекста устройства, передаваемого в качестве параметра pdc функции OnDraw . Иногда контекст устройства предоставляется приложением контейнера и не обязательно инициализируется в состоянии по умолчанию. В частности, явно выберите ручки, кисти, цвета, шрифты и другие ресурсы, от которых зависит код рисования.

Оптимизация кода краски

После успешного рисования элемента управления следующим шагом является оптимизация OnDraw функции.

Реализация рисования элемента управления ActiveX по умолчанию красит всю область управления. Это достаточно для простых элементов управления, но во многих случаях повторение элемента управления будет быстрее, если только часть, которая требуется обновить, была перезапущена вместо всего элемента управления.

Функция OnDraw предоставляет простой метод оптимизации, передав rcInvalid, прямоугольную область элемента управления, требующую перераскрытия. Используйте эту область, как правило, меньше всей области управления, чтобы ускорить процесс рисования.

Рисование элемента управления с помощью метафайлов

В большинстве случаев параметр PDC указывает на OnDraw контекст устройства экрана (DC). Однако при печати изображений элемента управления или во время сеанса предварительного просмотра контроллер домена, полученный для отрисовки, является особым типом, называемым "метафайл DC". В отличие от контроллера домена экрана, который немедленно обрабатывает запросы, отправленные в него, метафайл dc сохраняет запросы, которые будут воспроизводиться позже. Некоторые приложения-контейнеры также могут отображать образ элемента управления с помощью контроллера домена метафайла в режиме разработки.

Запросы на рисование метафайлов могут выполняться контейнером с помощью двух функций интерфейса: IViewObject::Draw (эта функция также может вызываться для рисования не метафайлов) и IDataObject::GetData. При передаче контроллера домена метафайла в качестве одного из параметров платформа MFC вызывает COleControl::OnDrawMetafile. Так как это виртуальная функция-член, переопределите эту функцию в классе управления, чтобы выполнить любую специальную обработку. Вызовы COleControl::OnDrawповедения по умолчанию.

Чтобы убедиться, что элемент управления можно нарисовать в контекстах устройства экрана и метафайла, необходимо использовать только функции-члены, поддерживаемые как на экране, так и в контроллере домена метафайла. Помните, что система координат может не измеряться в пикселях.

Так как реализация OnDrawMetafile по умолчанию вызывает функцию элемента управления OnDraw , используйте только функции-члены, которые подходят как для метафайла, так и контекста устройства экрана, если вы не переопределите OnDrawMetafile. Ниже перечислены подмножества CDC функций-членов, которые можно использовать как в метафайл, так и в контексте устройства экрана. Дополнительные сведения об этих функциях см. в справочнике по MFC для класса CDC.

Arc BibBlt Аккорд
Ellipse Escape ExcludeClipRect
ExtTextOut FloodFill IntersectClipRect
LineTo MoveTo OffsetClipRgn
OffsetViewportOrg OffsetWindowOrg PatBlt
Pie Polygon Polyline
PolyPolygon RealizePalette RestoreDC
RoundRect SaveDC ScaleViewportExt
ScaleWindowExt SelectClipRgn SelectObject
SelectPalette SetBkColor SetBkMode
SetMapMode SetMapperFlags SetPixel
SetPolyFillMode SetROP2 SetStretchBltMode
SetTextColor SetTextJustification SetViewportExt
SetViewportOrg SetWindowExt SetWindowORg
StretchBlt TextOut

CDC Помимо функций-членов, существуют несколько других функций, совместимых в контроллере домена метафайла. К ним относятся CPalette::AnimatePalette, CFont::CreateFontIndirect и три функции-члены CBrush: CreateBrushIndirect, CreateDIBPatternBrush и CreatePatternBrush.

Функции, которые не записываются в метафайл: DrawFocusRect, DrawIcon, DrawText, ExcludeUpdateRgn, FillRect, FrameRect, GrayString, InvertRect, ScrollDC и TabbedTextOut. Так как контроллер домена метафайла не связан с устройством, нельзя использовать SetDIBits, GetDIBits и CreateDIBitmap с контроллером домена метафайла. Вы можете использовать SetDIBitsToDevice и StretchDIBits с контроллером домена метафайла в качестве назначения. CreateCompatibleDC, CreateCompatibleBitmap и CreateDis карта ableBitmap не имеют значения для контроллера домена метафайла.

Еще одним моментом, который следует учитывать при использовании контроллера домена метафайла, является то, что система координат может не измеряться в пикселях. По этой причине весь код рисования должен быть скорректирован, чтобы он соответствовал прямоугольнику, переданной OnDraw в параметр rcBounds . Это предотвращает случайное рисование за пределами элемента управления, так как rcBounds представляет размер окна элемента управления.

После реализации отрисовки метафайлов для элемента управления используйте тестовый контейнер для тестирования метафайла. Сведения о том, как получить доступ к Контейнеру для тестирования, см. в разделе Тестирование свойств и событий в Контейнере для тестирования .

Тестирование метафайла элемента управления с помощью тестового контейнера

  1. В меню "Изменить контейнер теста" нажмите кнопку "Вставить новый элемент управления".

  2. В поле "Вставка нового элемента управления" выберите элемент управления и нажмите кнопку "ОК".

    Элемент управления появится в контейнере Test.

  3. В меню "Элемент управления" нажмите кнопку "Рисование метафайла".

    Откроется отдельное окно, в котором отображается метафайл. Вы можете изменить размер этого окна, чтобы узнать, как масштабирование влияет на метафайл элемента управления. Это окно можно закрыть в любое время.

См. также

Элементы ActiveX библиотеки MFC