VC通过GDI创建裁剪区

来源:互联网 发布:淘宝产品上架流程 编辑:程序博客网 时间:2024/05/23 00:03

就是说,比如窗口是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.csdn.net/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.csdn.net/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);

}

 

原创粉丝点击