所以请记住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);
我不确定这是否会实际上完全替换现有剪辑区域,或者只是做另一个交叉。
还是别的什么?
感谢。
答案 0 :(得分:2)
SaveDC()
/ RestoreDC()
包含裁剪区域。