2
那么记得this answer?事实证明,如果我点击一个按钮并使用此代码应用于它的选项卡控件,整个窗口就会空白,直到我将鼠标悬停为止。我确定,这是因为传递给WM_CTLCOLORxxx
信息设备上下文的剪辑区域未设置:保存DC裁剪区域并在稍后恢复的正确方法是什么?
(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到该按钮的客户端矩形。如果Windows的内部工作(或其他完全)在不同的cilp矩形中传递,我不想仅仅调用IntersectClipRect()
,所以我宁愿保存剪切矩形并将其恢复。我的问题是这样做的最好方法是什么。
是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);
我不确定这是否会实际上完全替换现有的剪辑区域,或者只是做另一个相交。
还是别的东西?
谢谢。
太棒了,谢谢! – andlabs
更新:我现在只是到了可以开始实施的地步;手动剪切实际上并没有解决问题我认为它会(在问题中):(我也尝试使用裁剪区域,并从兼容的DC使用BitBlt();什么都没有,更重要的是,我无法重现问题用MCVE,至少现在还没有,我们将会看到...这将会暂时避开我,但是,这确实回答了我所问的问题,并且无论如何都知道这一点,所以谢谢不管! – andlabs