路径层、裁剪区域
路径层:为所绘制的点、矩形、椭圆等添加绝对领域;利用CDC类提供的BeginPath和EndPath两个函数来实现。
裁剪区域:可以把它理解为一个绘图区域,其大小可由我们控制;通常可以把客户区看作一个大的裁剪区域,也可以把一个矩形作为裁剪区域,把之后的绘图操作仅限于这个区域内;利用CDC类提供的SelectClipPath函数,让路径层和裁剪区域进行互操作以达到一种特殊的效果。
例:
void CTextView::OnDraw(CDC* pDC) { CTextDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CString str1; str1="hello"; CString str2; str2="MFC"; CString str; str=str1+str2; pDC->TextOut(100,100,str); str.LoadString(IDS_STRING); pDC->TextOut(200,200,str); //获得某个字符串在窗口中显示时所占据的宽度(.cx)和高度(.cy) CSize sz=pDC->GetTextExtent(str); pDC->BeginPath(); //打开路径层 pDC->Rectangle(200,200,200+sz.cx,200+sz.cy); //绘制图形 pDC->EndPath(); //关闭路径层 pDC->SelectClipPath(RGN_DIFF); //pDC->SelectClipPath(RGN_AND); for(int i=0;i<500;i+=10){ pDC->MoveTo(0,i); pDC->LineTo(500,i); pDC->MoveTo(i,0); pDC->LineTo(i,500); } }
“pDC->SelectClipPath(RGN_DIFF);”的效果:
“pDC->SelectClipPath(RGN_AND);”的效果:
例:
void CTextView::OnDraw(CDC* pDC) { CTextDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CString str1; str1="hello"; CString str2; str2="MFC"; CString str; str=str1+str2; pDC->TextOut(100,100,str); str.LoadString(IDS_STRING); pDC->TextOut(200,200,str); //获得某个字符串在窗口中显示时所占据的宽度(.cx)和高度(.cy) CSize sz=pDC->GetTextExtent(str); pDC->BeginPath(); //打开路径层 pDC->Rectangle(200,200,200+sz.cx,200+sz.cy); //绘制图形 pDC->EndPath(); //关闭路径层 pDC->SelectClipPath(RGN_DIFF); //pDC->SelectClipPath(RGN_AND); for(int i=0;i<500;i+=10){ pDC->MoveTo(0,i); pDC->LineTo(500,i); pDC->MoveTo(i,0); pDC->LineTo(i,500); } }
“pDC->SelectClipPath(RGN_DIFF);”的效果:
“pDC->SelectClipPath(RGN_AND);”的效果: