如何正确保存设备上下文的剪切区并在以后恢复?

3
所以还记得这个答案吗?好吧,事实证明,如果我点击一个应用了这段代码的选项卡控件,整个窗口会变空白,直到我移动鼠标。我确定这是因为传递给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 的内部工作(或其他完全不同的事情)传入不同的剪辑矩形,因此我宁愿保存剪辑矩形并恢复它。我的问题是如何最好地做到这一点。

是使用 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://dev59.com/M0_Ta4cB1Zd3GeqPDsI1
GetClipRgn(dc, rgn);
IntersectClipRect(dc, r.left, r.top, r.right, r.bottom);
// ...
SelectClipRgn(dc, rgn);

我不确定这是否会完全替换现有的剪辑区域,还是只会进行另一个交集。

还是其他什么东西?

谢谢。

1个回答

3

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


更新:我现在才到可以开始实现它的地步;手动裁剪并没有真正解决我认为会解决的问题(在问题中):( 我还尝试使用裁剪区域并从兼容的 DC 中使用 BitBlt();什么也没有发生。更重要的是,我还不能用 MCVE 复制这个问题,至少目前还没有。我们会看到的... 这将让我困惑一段时间。不过,这确实回答了我提出的问题,并且无论如何都很有用,所以还是谢谢! - andlabs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接