Windows Messaging - 使用非客户区域

时间:2015-11-10 14:22:49

标签: c++ windows winapi

这个问题适用于所有Windows专家。

我正在研究可以获得包含窗口的非客户区域(使用Windows API)的设备上下文(DC)的不同方法

我知道两种方式:

  1. GetWindowDC() - 返回整个窗口的DC,包括非客户区域。
  2. GetDCEx() - 如果您传递DCX_WINDOW标志,则会获得非客户区域的DC。
  3. 有没有其他方法可以获得非客户区域的DC?

2 个答案:

答案 0 :(得分:2)

你使这比现在更复杂。实际上只有一种方法可以获取设备上下文来呈现窗口的非客户区域:GetDCEx

基本原理很简单:如果要渲染窗口的非客户区域,您将从WM_NCPAINT处理程序执行此操作。此消息附带更新区域(可能不是矩形),只有GetDCEx可以为您设置非矩形剪切区域。

<小时/> 当然,您可以通过在SelectClipRgn返回的设备上下文中手动调用GetWindowDC来实现相同目的。但这就像通过在循环中重复添加值而不是使用乘法运算符来实现乘法。

<小时/> 由于您尝试挂钩无法控制的应用程序,因此您可能还需要查找GetDCCreateDC的来电。任何一个都可以为整个屏幕返回一个DC(包括可见的非客户区窗口)。

答案 1 :(得分:0)

这两种方式完全相同 - 我不认为微软会添加第三个功能来做到这一点。 但是,获取桌面窗口的DC并仅绘制到窗口当前所在的部分也可以正常工作。 (但我不推荐它!)

你试图取得成就吗?