IOleInPlaceSiteWindowless::GetDC 方法 (ocidl.h)

从其容器为屏幕或兼容设备提供具有设备上下文句柄的对象。

语法

HRESULT GetDC(
  [in]  LPCRECT pRect,
  [in]  DWORD   grfFlags,
  [out] HDC     *phDC
);

参数

[in] pRect

指向对象要重绘的矩形的指针,以包含窗口的客户端坐标表示。 如果此参数为 NULL,则重绘对象的完整盘区。

[in] grfFlags

OLEDCFLAGS 枚举中的值的组合。

[out] phDC

指向返回的设备上下文的指针。

返回值

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

返回代码 说明
OLE_E_NESTEDPAINT
容器已处于绘制会话的中间。 也就是说,此方法已被调用,并且尚未调用 IOleInPlaceSiteWindowless::ReleaseDC 方法。

注解

应通过调用 IOleInPlaceSiteWindowless::ReleaseDC 来释放此方法获取的设备上下文。

与此接口中的其他方法一样,矩形在包含窗口的客户端坐标中指定。 容器应将此矩形与对象的站点矩形相交,并剪裁出生成的矩形之外的所有内容。 这可以防止对象在不应绘制的位置无意中进行绘制。

容器还应该映射设备上下文原点,以便对象可以绘制包含窗口(通常是容器窗口)的客户端坐标。 如果容器只是传递其窗口设备上下文,则会自动发生这种情况。 如果返回另一个设备上下文(例如,屏幕外内存设备上下文),则应适当设置视区原点。

实施者说明

根据它是返回屏幕还是屏幕外设备上下文,以及它的复杂程度,容器可以使用以下算法之一:
  1. 屏幕上的“一次通过”绘图
    1. IOleInPlaceSiteWindowless::GetDC 方法中,容器应:
      • 获取窗口设备上下文。
      • 如果设置了 OLEDC_PAINTBKGND,则绘制请求设备上下文的对象后面的每个对象的 DVASPECT_CONTENT方面。
      • 返回设备上下文。
    2. ReleaseDC 方法中,容器应:
      • 绘制每个重叠对象的DVASPECT_CONTENT。
      • 释放设备上下文。
  2. 屏幕上的“双通道”绘图
    1. IOleInPlaceSiteWindowless::GetDC 方法中,容器应:
      • 获取窗口设备上下文。
      • 剪裁任何重叠对象的不透明区域。 这些区域不需要重新绘制,因为它们在屏幕上已经正确。
      • 如果未设置OLEDC_PAINTBKGND,则返回设备上下文。
      • 否则,请剪裁请求设备上下文的 对象的不透明部分,并从前到后绘制每个对象的不透明部分。
      • 绘制每个对象的透明方面,返回到前面,每次都适当设置剪切区域。
      • 最后返回设备上下文。
    2. IOleInPlaceSiteWindowless::ReleaseDC 方法中,容器应:
      • 绘制每个重叠对象的透明部分。
      • 释放设备上下文。
  3. 屏幕外绘图
    1. IOleInPlaceSiteWindowless::GetDC 方法中,容器应:
      • 创建屏幕兼容的内存设备上下文,其中包含适当大小的兼容位图。
      • 映射设备上下文的视区原点,以确保调用对象可以使用包含窗口的工作区坐标进行绘制。
      • 如果设置了OLEDC_PAINTBKGND,则绘制调用对象后面的每个对象的DVASPECT_CONTENT。
      • 返回设备上下文。
    2. IOleInPlaceSiteWindowless::ReleaseDC 方法中,容器应:
      • 绘制每个重叠对象的DVASPECT_CONTENT方面。
      • 将屏幕外位图复制到 IOleInPlaceSiteWindowless::GetDC 中最初请求调用对象的位置的屏幕。
      • 删除并释放内存设备上下文。
此方法返回时,应设置设备上下文中的剪裁区域,以便对象不能在不应绘制的任何区域。 如果对象不透明,则应该已绘制背景。 如果设备上下文是屏幕,则应剪裁掉任何重叠的不透明区域。

要求

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

另请参阅

IOleInPlaceSiteWindowless

IOleInPlaceSiteWindowless::ReleaseDC

OLEDCFLAGS