所以还记得这个答案吗?好吧,事实证明,如果我点击一个应用了这段代码的选项卡控件,整个窗口会变空白,直到我移动鼠标。我确定这是因为传递给
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);
我不确定这是否会完全替换现有的剪辑区域,还是只会进行另一个交集。
还是其他什么东西?
谢谢。