路径层主要运用于画图当中,其概念就像当年军阀割据时圈地一样,在地域上划定了界线,界线之内是各自的地盘,别人不能侵犯。VC++中利用CDC提供的BeginPath和EndPath这两个函数来实现路径层。BeginPath()其作用是在设备描述表中打开一个路径层;然后利用图形设备接口提供的函数进行绘图操作,例如绘制一些点、椭圆等;最后,绘图操作完成之后,应用程序调用EndPath()这个函数关闭这个路径层。
在绘图时,如果希望图的某一部分与其他部分分开处理,就可以利用路径层的独立性,调用
SelectClipPath
函数.
该函数参数如下:
RGN_AND
|
新的剪切区是剪切区与路径层的交集.
|
RGN_COPY
|
剪切区不变
|
RGN_DIFF
|
新的剪切区是旧的剪切区中除去路径层的部分
|
RGN_OR
|
新的剪切区是旧的剪切区和路径层的并集
|
RGN_XOR
|
新的剪切区是旧的剪切区和路径层的并集,但除去他们的交集部分
|
如何在Device Context中建立了一个路径层:
1)先调用BeginPath()
2)再调用其他的GDI绘图函数参数一个区域,如Rectangle生成一个矩形区域
3)调用EndPath() 产生闭环的路径层(即一个绘图区域)
路径区圈好后,还必须与客户区进行5种SelectClipPath()"裁剪"运算,产生新的绘图区域,在新的绘图区域上的绘图就能显示出路径层的特效
//------路径层 CDC::BeginPath, EndPath
CString cstr;
cstr="VC++ 路径层用矩形圈出的绘图区域";
pDC->TextOut(100,100,cstr);
CSize csz;
csz = pDC->GetTextExtent(cstr);
pDC->BeginPath();
pDC->Rectangle(100,100,100+csz.cx,100+csz.cy);//在路径层上绘制一个矩形:就是字符串cstr的所占的区域
pDC->EndPath(); // 如果不取消则下面画的横竖线就看不见,因为还是在路径层上
pDC->SelectClipPath(RGN_XOR);//把路径层的绘图与Device Context中的绘图区域进行 OR,XOR,COPY,AND,DIFF运算,产生了新的绘图区
还可以直接用矩形 (100,100,200,200)来圈一个路径层,不用上面的一行字符的区域来圈了
//------路径层 CDC::BeginPath, EndPath
CString cstr;
cstr="路径层";
pDC->TextOut(150,150,cstr); //把cstr输出在(150,150)这个点是将要创建的路径层的中心
pDC->BeginPath();
pDC->Rectangle(100,100,200,200);//在路径层上绘制一个矩形:就是字符串cstr的所占的区域
pDC->EndPath(); // 如果不取消则下面画的横竖线就看不见,因为还是在路径层上
pDC->SelectClipPath(RGN_OR);//把路径层的绘图与Device Context中的绘图区域进行 OR,XOR,COPY,AND,DIFF运算,产生了新的绘图区
//下面的横竖线就是在新的绘图区上绘制,
for(int i=0;i<300;i+=10)
{
//画横线
pDC->MoveTo(0,i);
pDC->LineTo(300,i);
//画竖线
pDC->MoveTo(i,0);
pDC->LineTo(i,300);
}