就是说,比如窗口是640x480的,我创建一个(10,10)-(100,100)的裁剪区域,那么任何在该区域外的绘图都会被忽略掉。
比如画一条(0,0)-(300,300)的直线,那么只会出现在自己定义的裁剪区域内,别的地方是不会绘制任何东西的。
VC通过GDI怎样创建这样的裁剪区域呢?
void CGView::OnDraw(CDC* pDC)
{
CGDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRgn rgn;
rgn.CreateRectRgn(10, 10, 100, 100);
pDC->SelectClipRgn(&rgn);
// test
pDC->Rectangle(10, 10, 100, 100);
pDC->MoveTo(0, 0);
pDC->LineTo(300, 300);
}
http://topic.youkuaiyun.com/u/20090328/14/73a4019f-125b-4db0-8d8f-418ce291b0d2.html
MS规定,如果要在一个窗口上画图,它要有三个层次相结合才能在窗口中画出图形。
这三个层次一般为系统层、剪贴层和元层,其中后两层属用户层,默认情况下没有这二个层。系统层为系统产生的层,比如说窗口的重画产生的区域等,而剪贴层可以用SelectClipRng()产生,元层可以用SetMetaRgn()产生,所以用户可以用SelectClipRgn()或SetMetaRgn()产生其中的一个层次,这样就可以限制系统要画的区域。
比如说画线,特别是窗口具有CS_PARENTDC风格的(一般来说控件窗口都具有这个风格),它的系统区域就为父窗口区域,那样当用户得到这个控件的DC时,它可以画出超过控件本身区域的线条,所以这时应该加上其它一层,比如说剪帖层,设置这个区域为控件本身的区域范围,就可以限制这个线条不超过控件本身的区域。
例如:下面画一个直线,控件本身区域为RECT rc = (0,0,50,25) ;
void DrawLine(DC hdc)
{
SelectClipRgn(hdc,&rc) ;
MoveToEx(hdc,0,0,NULL) ;
LineTo(hdc,100,100) ;//超过控件本身的区域,但实际上不会画出SelectClipRgn()设置的区域
}
http://topic.youkuaiyun.com/t/20040731/09/3228897.html
//
/
应用实例:
void CTabPage2::OnDraw()
{
// TODO: Add your control notification handler code here
CDC *pDC; //创建DC指针
pDC=GetDlgItem(IDC_Bmp)->GetDC(); //将该指针指向所选位图DC
//Draw BMP Position
CRgn rgn;
rgn.CreateRectRgn(0,0,850,380); //创建一个矩形裁剪区,对象为rgn
pDC->SelectClipRgn(&rgn); //选择该裁剪区,绘图在此裁剪区中完成,超出部分不显示
//Draw BMP background use 128 gray color
CBrush brush(RGB(128,128,128));
CBrush *old = pDC->SelectObject(&brush);
CRect rect;
rect.SetRect(0,0,900,380);
pDC->Rectangle(rect);
pDC->SelectObject(old);
//Draw Circle use brush
CBrush brush1(RGB(255,0,0)); //red
old = pDC->SelectObject(&brush1);
CRect cRect;
cRect.SetRect(0,0,0,0); //圆心是(100,100)
cRect.InflateRect(50,50); //半径是50
pDC->Ellipse(cRect);
pDC->SelectObject(old);
CBrush brush2(RGB(255,255,0)); //yellow
old = pDC->SelectObject(&brush2);
cRect.SetRect(300,50,300,50); //圆心是(100,100)
cRect.InflateRect(30,30); //半径是30
pDC->Ellipse(cRect);
pDC->SelectObject(old);
}