GetClipBox()和SeletClipRgn()問題

由於項目需要,需要過濾掉一些區域,就是用了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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章