路径层 就是开辟一块独立的区域,将字符串圈起来,不受周围环境的影响。 下面的例子就是将之前显示的文本“机械工程”通过路径层将其保护起来,并通过画网格的方式对比出效果。
首先创建路径层,通过BeginPath()开启路径层,pDC->EndPath()关闭路径层。中间用Rectangle()画出矩形,画矩形需要知道两个点的坐标,字符串的左上角的坐标在创建字符串的时候就知道了,右下角的坐标需要通过GetTextExtent() 函数来获取,它的返回值是CSize类的对象,直接通过zx. zy 就可以得到所需坐标。
void CTEXTView::OnDraw(CDC* pDC)
{
CTEXTDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
/********************wjl***********************
1.文本显示
2.路径层 就是将所选择的区域产生于整体不同的效果
*********************wjl********************/
//CString str("机械工程");
CString str;
str = "机械工程";
pDC->TextOut (50,50,str);
CSize sz = pDC->GetTextExtent(str); // GetTextExtent 函数 返回一个CSize 类 的 对象
str.LoadString(IDS_XIAOBEI);
pDC->TextOutW(0,200,str);
// 创建路径层 (用一个矩形把 “机械工程”框起来 )
pDC->BeginPath(); // 开启路径层
pDC->Rectangle(50,50,50+sz.cx,50+sz.cy); // 获取字符串的坐标 创建矩形窗口
pDC->EndPath(); // 关闭路径层
pDC->SelectClipPath(RGN_DIFF); // 路径层与窗口互操作功能
最后要通过SelectClipPath函数进行互操作,也就是要求这个路径层和周围环境达到什么效果,RGN_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);
}
pDC->SelectClipPath(RGN_AND); // 另一种互操作方式