c - 保存 DC 的剪辑区域并在以后恢复它的正确方法是什么?

标签 c winapi gdi clipping

所以记住this answer ?事实证明,如果我单击应用了此代码的选项卡控件的按钮,整个窗口会空白,直到我将鼠标悬停在上面。我确定这是因为未设置传递给 WM_CTLCOLORxxx 消息的设备上下文的剪辑区域:

(results from windows 7 64-bit)
on a normal redraw
window rect 435 301 591 324
client rect 4 96 160 119
clip rect 4 96 230 119

after clicking a button
window rect 435 301 591 324
client rect 4 96 160 119
clip rect 0 0 320 240 (this is the top level window's client rect)

所以现在我想暂时将 DC 剪辑到按钮的客户端矩形。我不想只调用 IntersectClipRect() 以防 Windows 的内部工作(或其他完全)通过不同的 cilp 矩形,所以我宁愿保存剪辑矩形并恢复它。我的问题是这样做的最佳方式是什么。

SaveDC() 吗?

i = SaveDC(dc);
IntersectClipRect(dc, r.left, r.top, r.right, r.bottom);
// ...
RestoreDC(dc, i);

MSDN 的文档没有将剪辑列为使用 SaveDC() 保存的内容之一。

GetClipRgn()SelectClipRgn() 吗?

rgn = CreateRectRegion(0, 0, 0, 0); // see also https://stackoverflow.com/questions/3478180/correct-usage-of-getcliprgn
GetClipRgn(dc, rgn);
IntersectClipRect(dc, r.left, r.top, r.right, r.bottom);
// ...
SelectClipRgn(dc, rgn);

我不确定这是否真的会完全替换现有的裁剪区域,或者只是做另一个相交。

还是别的什么?

谢谢。

最佳答案

SaveDC()/RestoreDC() 包含剪辑区域。

关于c - 保存 DC 的剪辑区域并在以后恢复它的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29592510/

相关文章:

c++ - 如何检测给定的 PE 文件(exe 或 dll)是 64 位还是 32 位

c# - 如何添加系统 "windows hook"以便在创建/激活窗口时收到通知?

c - Mmap 与大型分配的静态分配

c - &"string"与 "string"是同一地址吗?

c++ - 在 Windows 10 上尝试获取默认 Web 浏览器路径失败

c++ - 使用 WinGDI 旋转 HDC

c++ - 如何在windows中直接在屏幕上绘图?

c++ - 获取字距调整信息

c - 函数内的函数(引用)

计算 100 阶乘中的数字和