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::AnimatePalette、 CFont::CreateFontIndirect和 CBrush的三个成员函数: CreateBrushIndirect、 CreateDIBPatternBrush和 CreatePatternBrush。
在元文件不会记录的功能包括: DrawFocusRect、 DrawIcon、 DrawText、 ExcludeUpdateRgn、 FillRect、 FrameRect、 GrayString、 InvertRect、 ScrollDC和 TabbedTextOut。由于图元文件 DC 实际上并没有与设备,不能使用 SetDIBits、 GetDIBits 和 CreateDIBitmap 与图元文件 dc:date。可以使用 SetDIBitsToDevice 和 StretchDIBits 与图元文件 DC 为目标。CreateCompatibleDC、 CreateCompatibleBitmap和 CreateDiscardableBitmap 并没有意义与图元文件 dc:date。
另一个点考虑使用图元文件 DC 何时为坐标系不能在像素为单位。为此,应访问与调整所有的绘图代码矩形传递给 rcBounds 参数的 OnDraw。,因为 rcBounds 表示控件的窗口中,的大小这样可防止在控件外的意外绘图。
在实现了呈现为控件后的图元文件,使用测试容器该图元文件。有关如何访问测试容器的信息,请参见用测试容器测试属性和事件。
若要测试控件的图元文件使用测试容器
在测试容器的 编辑 菜单上,单击 Insert New Control。
在 Insert New Control 框中,选择控件并单击 确定。
控件将显示测试容器。
在 控件 菜单上,单击 Draw Metafile。
单独的窗口显示哪个图元文件显示。可以更改此窗口的大小查看调用如何影响控件的图元文件。您可以随时关闭此窗口。