IViewObject::D raw 方法 (oleidl.h)

将对象的表示形式绘制到指定的设备上下文中。

语法

HRESULT Draw(
  [in] DWORD                          dwDrawAspect,
  [in] LONG                           lindex,
  [in] void                           *pvAspect,
  [in] DVTARGETDEVICE                 *ptd,
  [in] HDC                            hdcTargetDev,
  [in] HDC                            hdcDraw,
  [in] LPCRECTL                       lprcBounds,
  [in] LPCRECTL                       lprcWBounds,
  [in] BOOL(* )(ULONG_PTR dwContinue) pfnContinue,
  [in] ULONG_PTR                      dwContinue
);

参数

[in] dwDrawAspect

指定要绘制的方面,即,要如何表示该对象。 表示形式包括内容、图标、缩略图或打印的文档。 有效值取自 枚举 DVASPECTDVASPECT2。 请注意,支持优化绘图接口的较新的对象和容器支持 DVASPECT2 枚举值。 不支持优化绘图接口的旧对象和容器可能不支持 DVASPECT2。 无窗口对象仅允许 DVASPECT_CONTENT、 DVASPECT_OPAQUE和 DVASPECT_TRANSPARENT。

[in] lindex

与绘制操作有关的对象部分。 其解释因 dwAspect 参数中的值而异。 有关详细信息,请参阅 DVASPECT 枚举。

[in] pvAspect

指向 DVASPECTINFO 结构中其他信息的指针,该结构根据指定的方面启用绘图优化。 请注意,支持优化绘图接口的较新对象和容器也支持此参数。 不支持优化绘图接口的旧对象和容器始终为此参数指定 NULL

[in] ptd

指向 DVTARGETDEVICE 结构的指针,该结构描述要呈现对象的设备。 如果 为 NULL,则应为默认目标设备呈现视图, (通常为显示) 。 NULL 以外的值与 hdcTargetDevhdcDraw 一起解释。 例如,如果 hdcDraw 将打印机指定为设备上下文, 则 ptd 参数指向描述该打印机设备的结构。 如果 hdcTargetDev 是有效值,则实际上可以打印数据;如果 hdcTargetDevNULL,则数据可能以打印预览模式显示。

[in] hdcTargetDev

由 ptd 参数指示的目标设备的信息上下文,对象可以从中提取设备指标并测试设备的功能。 如果 ptdNULL;对象应忽略 hdcTargetDev 参数中的值。

[in] hdcDraw

要进行绘制的设备上下文。 对于无窗口对象, hdcDraw 参数应处于MM_TEXT映射模式,其逻辑坐标与包含窗口的客户端坐标匹配。 对于无窗口对象,设备上下文应与通常由WM_PAINT消息传递的设备上下文处于相同的状态。

[in] lprcBounds

指向 RECTL 结构的指针,该结构指定 hdcDraw 上应绘制对象的矩形。 此参数控制对象的定位和拉伸。 此参数应为 NULL ,以绘制无窗口就地活动对象。 在所有其他情况下, NULL 不是法定值,应导致E_INVALIDARG错误代码。 如果容器将非 NULL 值传递给无窗口对象,则 对象应将请求的方面呈现到指定的设备上下文和矩形中。 容器可以从无窗口对象请求此操作,以呈现该对象的第二个非活动视图或打印该对象。

[in] lprcWBounds

如果 hdcDraw 是图元文件设备上下文,则指向 RECTL 结构的指针,该结构指定基础图元文件中的边界矩形。 矩形结构包含窗口范围和窗口原点。 这些值可用于绘制图元文件。 lprcBounds 指示的矩形嵌套在此 lprcWBounds 矩形中;它们位于同一坐标空间中。

如果 hdcDraw 不是图元文件设备上下文; lprcWBounds 将为 NULL

[in] pfnContinue

一个指向回调函数的指针,视图对象应当在持续时间很长的绘制操作过程中定期调用该函数,以确定该操作应当继续还是应当取消。 此函数返回 TRUE 以继续绘制。 它返回 FALSE 以停止绘图,在这种情况下 ,IViewObject::D raw 返回DRAW_E_ABORT。

dwContinue

[in] dwContinue

要作为参数传递给 pfnContinue 参数指向的函数的值。 通常, dwContinue 是指向回调函数内所需的应用程序定义结构的指针。

返回值

此方法在成功时返回S_OK。 其他可能的返回值包括以下内容。

返回代码 说明
OLE_E_BLANK
没有要从中提取的数据。
DRAW_E_ABORT
绘制操作已中止。
VIEW_E_DRAW
绘图时出错。
DV_E_LINDEX
lindex 的值无效;目前仅支持 -1。
DV_E_DVASPECT
dwAspect 的值无效。
OLE_E_INVALIDRECT
无效的矩形。

注解

容器应用程序发出对 IViewObject::D raw 的调用,以创建包含对象的表示形式。 此方法在指定设备上下文 (hdcDraw) 上绘制指定视图 (dwAspectpvAspect) 的指定部分 (lindex) 。 格式设置、字体和其他呈现决策是根据 ptd 参数指定的目标设备做出的。

dwDrawAspect 值和 lprcbounds 值之间存在关系。 lprcbounds 值指定要将绘图映射到的 hdcDraw 上的矩形。 对于 DVASPECT_THUMBNAIL、 DVASPECT_ICON和 DVASPECT_SMALLICON,对象绘制它想要绘制的任何绘图,然后以最佳方式将其映射到给定的空间中。 某些对象可能会缩放以适应,而有些对象可能会缩放以适应,但会保留纵横比。 此外,有些人可能会缩放,使绘图以全宽显示,但底部会裁剪。 容器可以通过 IOleObject::SetExtent 建议大小,但它无法控制呈现大小。 对于 DVASPECT_CONTENT,IViewObject::D raw 实现应使用 IOleObject::SetExtent 提供的盘区或使用 lprcBounds 参数中给定的边框。

对于支持优化绘图技术和无窗口对象的较新对象,应按如下所示使用此方法:

  • dwAspect 支持DVASPECT2中定义的新绘图方面。
  • pvAspect 参数可用于传递其他信息,以便通过 DVASPECTINFO 结构进行绘制优化。
  • 可以通过将 lrpcBounds 参数设置为 NULL 来调用 IViewObject::D raw 方法来重新绘制无窗口就地活动对象。 在所有其他情况下, NULL 都是非法值,应导致E_INVALIDARG错误代码。 无窗口对象使用激活谓词传递的矩形,或者调用 IOleInPlaceObject::SetObjectRects ,而不是使用此参数。 如果容器将非 NULL 值传递给无窗口对象,则 对象应将请求的方面呈现到指定的设备上下文和矩形中。 容器可以从无窗口对象请求此操作,以呈现该对象的第二个非活动视图或打印该对象。 有关绘制无窗口对象的详细信息,请参阅 IOleInPlaceSiteWindowless 接口。
  • 对于无窗口对象, dwAspect 参数仅允许 DVASPECT_CONTENT、 DVASPECT_OPAQUE和 DVASPECT_TRANSPARENT方面。
  • 对于无窗口对象,hdcDraw 参数应处于MM_TEXT映射模式,其逻辑坐标与包含窗口的客户端坐标匹配。 对于无窗口对象,设备上下文应与通常由WM_PAINT消息传递的设备上下文处于相同的状态。
为了保持与不支持绘图优化的旧对象和容器的兼容性,所有对象(矩形与否)都需要维护原点和矩形盘区。 这允许容器仍将其所有嵌入对象视为矩形,并在 Draw 中传递相应的呈现矩形。

对象的范围取决于绘图方面。 对于非矩形对象,范围应是覆盖整个方面的矩形的大小。 按照约定,对象的原点是 DVASPECT 的矩形的左上角_CONTENT方面。 换句话说,原点始终与对象的站点维护的矩形的左上角重合,即使对于非矩形对象也是如此。

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 oleidl.h

另请参阅

DVASPECT

DVASPECT2

DVASPECTINFO

IOleInPlaceSiteWindowless

IViewObject

OleDraw