GetDCEx
该函数为指定窗口的客户区域或整个屏幕取回显示DC的句柄。随后的GDI函数中可以该句柄在窗口客户区域绘图。
GetDCEx 是GetDC的扩展,对如何剪裁客户区域或是否剪裁客户区域提供给程序更多的控制。
原型:
HDC
GetDCEx(
HWND
hWnd,
HRGN
hrgnClip,
DWORD
flags);
参数:
hWnd:将要取回DC的窗口句柄。如果该值为NULL,GetDCEx取回整个屏幕的DC。
hrgnClip:指定可能和DC的可见区域合并的剪切区域。
flags:指定DC的创建方式。可能为下表中的值的组合:
值 | 描述 |
DCX_WINDOW | 返回于窗口矩形而不是客户端矩形对应的DC。 |
DCX_CACHE | 从缓存中取回DC,而不是OWNDC 或 CLASSDC 窗口。实际上重写了CS_OWNDC 和CS_CLASSDC 了。 |
DCX_PARENTCLIP | 使用父窗口的可见区域。取消父窗口的WS_CLIPCHILDREN 和 CS_PARENTDC 标志位。DC的起始坐标设置为由hWnd标识的窗口的左上角。 |
DCX_CLIPSIBLINGS | 排除由hWnd标识的窗口的所有同级窗口的可见区域。 |
DCX_CLIPCHILDREN | 排除由hWnd标识的窗口的所有子窗口的可见区域。 |
DCX_NORESETATTRS | 当该DC释放时,不用设置该DC的属性为默认值。 |
DCX_EXCLUDERGN | 从返回的DC的可见区域里去除hrgnClip标识的剪切区域。 |
DCX_EXCLUDEUPDATE | 返回一个区域,该区域去除了窗口更新的区域。 |
DCX_INTERSECTRGN | hrgnClip表示的剪切区域和返回DC的可见区域取交集。 |
DCX_INTERSECTUPDATE | 返回一个区域,该区域包含窗口更新的区域。 |
DCX_VALIDATE | 当指定DCX_INTERSECTUPDATE,引起DC完全有效(causes the device context to be completely validated.)。 在该函数中使用DCX_INTERSECTUPDATE 和DCX_VALIDATE 等价于使用BeginPaint函数。 |
返回值:
成功,返回指定窗口DC句柄。失败返回NULL。如果传入的hWnd为无效值,返回失败。调用GetLastError获取扩展错误信息。
备注:
flags支持这些值:
DCX_WINDOW,
DCX_CACHE,
DCX_CLIPCHILDREN,
DCX_CLIPSIBLINGS,
DCX_EXCLUDERGN,
DCX_INTERSECTRGN,
DCX_EXCLUDEUPDATE 和
DCX_INTERSECTUPDATE。
和GetDC返回的DC不同,GetDCEx返回的DC不会和相关窗口保持同步。
如果窗口移动或改变大小,可能会产生异常错误。如果程序获取DC、绘图然后再释放DC,错误的机会将会减少。
除非显示DC属于窗口类,否则在绘图后必须调用
ReleaseDC来释放DC。
因为一次只能有5个公共DC可用,如果释放DC失败,将可能导致其他程序访问DC失败。
如果
CS_CLASSDC, CS_OWNDC 或
CS_PARENTDC被指定为WNDCLASS结构中的一个类型,当该窗口类被注册时,函数将返回属于窗口类的DC。
GetWindowDC
函数取回整个窗口DC,包括标题栏、菜单和滚动栏。
原型:
HDC
GetWindowDC(
HWND
hWnd);
参数:
hWnd:要取回DC的窗口句柄。如果该值为NULL,取回整个屏幕的DC。
返回值:
成功,返回指定窗口DC的句柄。NULL表示失败或传入的hWnd为无效参数。调用GetLastError获取扩展错误信息。
备注:
GetWindowDC专为在窗口非客户区域绘图而设计。不推荐在任何窗口的非客户区域绘图。
使用
GetSystemMetrics函数获取象标题栏、菜单和滚动栏等非客户区域的尺寸大小。
GetDC用来取回整个
屏幕的DC。
在绘图完成后,必须调用ReleaseDC来释放DC。如果不释放窗口DC,应用程序的绘图请求将会产生不良影响