1.笔记
1.1路径层函数
1.1.1打开路径层
函数原型:
BOOL CDC::BeginPath();
没有参数,如果调用成功,返回非零,否则返回零。功能是在设备上下文中打开路径层。
1.1.2关闭路径层
函数原型:
BOOL CDC::EndPath();
没有参数,如果调用成功,返回非零,否则返回零。功能是关闭路径层,并将路径层选入设备上下文。该函数在完成绘制后使用。
1.1.3填充路径层
函数原型:
BOOL CDC::FillPath();
没有参数,如果调用成功,返回非零,否则返回零。功能是使用当前画刷以及当前填充模式对路径层内部进行填充。
1.1.4绘制并填充路径层
函数原型:
BOOL CDC::StrokeAndFillPath();
没有参数,如果调用成功,返回非零,否则返回零。功能是使用当前画笔绘制当前路径层轮廓,使用当前画刷填充路径层内部。
2.使用练习
2.1给定4个顶点P0(200,300)、P1(700,500)、P2(1200,300)、P3(700,100),使用直线函数分别绘制三角形P0P1P2、P0P2P3,三角形内部使用GRAY_BRUSH库画刷填充,在设备坐标系中使用路径层函数编程,实现通过绘制两个三角形来绘制一个四边形。
编程实现:
void CExample1View::OnDraw(CDC* pDC)
{
CExample1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
CPoint p[4];
p[0] = CPoint(200, 300); p[1] = CPoint(700, 500);
p[2] = CPoint(1200, 300); p[3] = CPoint(700, 100);
CBrush* p0ldBrush = (CBrush*)pDC->SelectStockObject(GRAY_BRUSH);
pDC->BeginPath();//打开路径层
pDC->MoveTo(p[0]);//绘制三角形P0P1P2
pDC->LineTo(p[1]);
pDC->LineTo(p[2]);
pDC->LineTo(p[0]);
pDC->EndPath();//绘制完,关闭路径层
pDC->FillPath();//填充路径层内部
pDC->BeginPath();
pDC->MoveTo(p[0]);//绘制三角形P0P2P3
pDC->LineTo(p[2]);
pDC->LineTo(p[3]);
pDC->LineTo(p[0]);
pDC->EndPath();
pDC->FillPath();
pDC->SelectObject(p0ldBrush);
}
2.2使用直线函数绘制顶点为P0(-280,40)、P1(-440,200)、P2(-520,0)、P3(-440,-200)、P4(-320,-80)、P5(-240,-200)、P6(-80,-80)的多边形P,多边形边界为3像素宽黑色实线,内部填充为红色,在自定义坐标系内实现。
编程实现:
void CExample1View::OnDraw(CDC* pDC)
{
CExample1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
CRect rect;
GetClientRect(rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(rect.Width(), rect.Height());
pDC->SetViewportExt(rect.Width(), -rect.Height());
pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);
rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);
CPoint p[7];
p[0] = CPoint(-280, 40); p[1] = CPoint(-440, 200);
p[2] = CPoint(-520, 0); p[3] = CPoint(-440, -200);
p[4] = CPoint(-320, -80); p[5] = CPoint(-240, -200);
p[6] = CPoint(-80, 80);
CBrush NewBrush, * pOldBrush;
NewBrush.CreateSolidBrush(RGB(255, 0, 0));
pOldBrush = pDC->SelectObject(&NewBrush);
CPen NewPen, * pOldPen;
NewPen.CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
pOldPen = pDC->SelectObject(&NewPen);
pDC->BeginPath();
pDC->MoveTo(p[0]);
for (int i = 1; i < 7; ++i)pDC->LineTo(p[i]);
pDC->LineTo(p[0]);
pDC->EndPath();
pDC->StrokeAndFillPath();
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
}