MFC ActiveX 控件:绘制 ActiveX 控件

本文介绍 Activex 控件绘制过程,以及如何修改绘制代码优化处理。(请参见技术的 最佳控件绘制 有关如何由具有优化绘制控件单个还原以前选定的 GDI 对象。在所有控件绘制后,容器可以自动恢复原始对象。)

示例本文中是从 MFC Activex 控件向导创建的控件的默认设置。有关创建使用 MFC Activex 控件向导的主干控制应用程序的更多信息,请参见中的文章 MFC Activex 控件向导

下面的主题包括:

  • 所有用于绘制 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。,如果您在矩形中绘制区域之外,可能会出现意外的结果。

控件实现文件 (.CPP) MFC Activex 控件向导提供的默认实现,如下所示,绘制一个空白画笔的矩形并用当前背景色填充椭圆。

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提供优化的一种简便方法,需要重绘控件的矩形范围。小于整个控件大小,加速绘制过程使用此区域,通常是。

绘制您使用图元文件中的控件

在许多情况下为 OnDraw 功能的 pdc 参数指向屏幕设备上下文 (DC)。但是,在中,当控件的打印图形或在打印预览会话期间,用于呈现接收的 DC 是称为 “图元文件 DC”的特殊类型。不同屏幕 DC,处理请求立即发送到它,图元文件 DC 存储请求之后使用。一些容器应用程序还可以选择呈现控件图像使用图元文件 DC,在设计模式下。

图元文件绘制请求可由容器进行通过两个接口功能: IViewObject::Draw (此功能可用于非图元文件绘图也称为) 和 IDataObject::GetData。当图元文件 DC 将作为参数之一个参数时, MFC 框架仅仅是对 COleControl::OnDrawMetafile。由于这是一个虚拟成员函数,请将重写控件类的此功能执行任何特殊处理。默认行为调用 COleControl::OnDraw

若要确定该控件在屏幕中绘制,并且图元文件设备上下文,必须使用在屏幕和图元文件 DC 支持的成员函数。请注意坐标系不能在像素为单位。

由于 OnDrawMetafile 的默认实现调用控件的 OnDraw 功能,请使用应用到图元文件和屏幕设备上下文仅的成员函数,因此,除非您重写 OnDrawMetafile。下面的列表 CDC 可用于图元文件和屏幕设备上下文的成员函数的子集。有关这些功能的更多信息,请参见 MFC 引用 中的 CDC 类。

弧线

BibBlt

个字符串

Ellipse

转义符

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 成员函数外,还有兼容在元文件 DC 的多个其他功能。其中包括 CPalette::AnimatePaletteCFont::CreateFontIndirectCBrush的三个成员函数: CreateBrushIndirectCreateDIBPatternBrushCreatePatternBrush

在元文件不会记录的功能包括: DrawFocusRectDrawIconDrawTextExcludeUpdateRgnFillRectFrameRectGrayStringInvertRectScrollDCTabbedTextOut。由于图元文件 DC 实际上并没有与设备,不能使用 SetDIBits、 GetDIBits 和 CreateDIBitmap 与图元文件 dc:date。可以使用 SetDIBitsToDevice 和 StretchDIBits 与图元文件 DC 为目标。CreateCompatibleDCCreateCompatibleBitmapCreateDiscardableBitmap 并没有意义与图元文件 dc:date。

另一个点考虑使用图元文件 DC 何时为坐标系不能在像素为单位。为此,应访问与调整所有的绘图代码矩形传递给 rcBounds 参数的 OnDraw。,因为 rcBounds 表示控件的窗口中,的大小这样可防止在控件外的意外绘图。

在实现了呈现为控件后的图元文件,使用测试容器该图元文件。有关如何访问测试容器的信息,请参见用测试容器测试属性和事件

若要测试控件的图元文件使用测试容器

  1. 在测试容器的 编辑 菜单上,单击 Insert New Control

  2. Insert New Control 框中,选择控件并单击 确定

    控件将显示测试容器。

  3. 控件 菜单上,单击 Draw Metafile

    单独的窗口显示哪个图元文件显示。可以更改此窗口的大小查看调用如何影响控件的图元文件。您可以随时关闭此窗口。

请参见

概念

MFC ActiveX 控件