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。 其他可能的返回值包括以下内容。
返回代码 | 说明 |
---|---|
|
容器已处于绘制会话的中间。 也就是说,此方法已被调用,并且尚未调用 IOleInPlaceSiteWindowless::ReleaseDC 方法。 |
注解
应通过调用 IOleInPlaceSiteWindowless::ReleaseDC 来释放此方法获取的设备上下文。
与此接口中的其他方法一样,矩形在包含窗口的客户端坐标中指定。 容器应将此矩形与对象的站点矩形相交,并剪裁出生成的矩形之外的所有内容。 这可以防止对象在不应绘制的位置无意中进行绘制。
容器还应该映射设备上下文原点,以便对象可以绘制包含窗口(通常是容器窗口)的客户端坐标。 如果容器只是传递其窗口设备上下文,则会自动发生这种情况。 如果返回另一个设备上下文(例如,屏幕外内存设备上下文),则应适当设置视区原点。
实施者说明
根据它是返回屏幕还是屏幕外设备上下文,以及它的复杂程度,容器可以使用以下算法之一:- 屏幕上的“一次通过”绘图
-
屏幕上的“双通道”绘图
- 在 IOleInPlaceSiteWindowless::GetDC 方法中,容器应:
- 获取窗口设备上下文。
- 剪裁任何重叠对象的不透明区域。 这些区域不需要重新绘制,因为它们在屏幕上已经正确。
- 如果未设置OLEDC_PAINTBKGND,则返回设备上下文。
- 否则,请剪裁请求设备上下文的 对象的不透明部分,并从前到后绘制每个对象的不透明部分。
- 绘制每个对象的透明方面,返回到前面,每次都适当设置剪切区域。
- 最后返回设备上下文。
- 在 IOleInPlaceSiteWindowless::ReleaseDC 方法中,容器应:
- 绘制每个重叠对象的透明部分。
- 释放设备上下文。
- 在 IOleInPlaceSiteWindowless::GetDC 方法中,容器应:
-
屏幕外绘图
- 在 IOleInPlaceSiteWindowless::GetDC 方法中,容器应:
- 创建屏幕兼容的内存设备上下文,其中包含适当大小的兼容位图。
- 映射设备上下文的视区原点,以确保调用对象可以使用包含窗口的工作区坐标进行绘制。
- 如果设置了OLEDC_PAINTBKGND,则绘制调用对象后面的每个对象的DVASPECT_CONTENT。
- 返回设备上下文。
- 在 IOleInPlaceSiteWindowless::ReleaseDC 方法中,容器应:
- 绘制每个重叠对象的DVASPECT_CONTENT方面。
- 将屏幕外位图复制到 IOleInPlaceSiteWindowless::GetDC 中最初请求调用对象的位置的屏幕。
- 删除并释放内存设备上下文。
- 在 IOleInPlaceSiteWindowless::GetDC 方法中,容器应:
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | ocidl.h |