2015-04-12 51 views
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); 

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

还是别的东西?

谢谢。

回答

2

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

+0

太棒了,谢谢! – andlabs

+0

更新:我现在只是到了可以开始实施的地步;手动剪切实际上并没有解决问题我认为它会(在问题中):(我也尝试使用裁剪区域,并从兼容的DC使用BitBlt();什么都没有,更重要的是,我无法重现问题用MCVE,至少现在还没有,我们将会看到...这将会暂时避开我,但是,这确实回答了我所问的问题,并且无论如何都知道这一点,所以谢谢不管! – andlabs

相关问题