由於項目需要,需要過濾掉一些區域,就是用了GetClipBox()和SelectClipRgn()函數來實現,其中碰到了一些問題。
1、調用GetClipBox()獲得當前的剪切區,得到的是邏輯座標。
CRect rcOldClip;
pDC->GetClipBox(rcOldClip);
2、調用SelectClipRgn()設置過濾後的剪切區。
//CRect rcNewClip(100, 100, 200, 200)
//CRgn rgnNew;
//rgnNew.CreateRectRgnIndirect(rgNew);
//pDC->SelectClipRgn(&rgnNew);
上面的代碼一點都沒有問題,可是到正真的項目中肯定不會這麼做。一般是一個對象繪畫時,設置它的剪切區,防止畫出他的區域範圍。
CPeople p;//可以繪畫的對象
CRect rcNewClip;
CRgn rgnNew;
p.GetRect(rcNewClip);//得到一個對象的RECT,問題就出在這裏了,我們得到是邏輯座標,可能是(100, -100, 200, -300),此時調用rcNewClip.IsRectEmpty()得到是true,究其原因是,如果CRect的寬度或高度<=0是,就認爲他是Empty,所以接下來的,SelectClipRgn()會調用不成功,返回NULLREGION表明區域爲空。
//解決辦法,調用LPtoDP轉換一下
pDC->LPtoDP(rcNewClip);//設備座標不會出現是負值的情況,總是從(0,0)開始橫向/縱向不斷變大。
rgnNew.CreateRectRgnIndirect(rgNew);
pDC->SelectClipRgn(&rgnNew);
p.Draw(pDC);
3、還原。
CRgn rgnOld;
pDC->LPtoDP(rcOldClip);//理由同上。
rgnNew.CreateRectRgnIndirect(rgnOld);
pDC->SelectClipRgn(&rgnOld);