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

时间:2015-04-12 17:43:35

标签: 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 rect,所以我宁愿保存剪切矩形并恢复它。我的问题是这样做的最佳方式是什么。

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);

我不确定这是否会实际上完全替换现有剪辑区域,或者只是做另一个交叉。

还是别的什么?

感谢。

1 个答案:

答案 0 :(得分:2)

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