1.笔记
1.1绘制椭圆弧函数
函数原型:
BOOL CDC::Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);
BOOL CDC::Arc(LPCRECT lpRect,POINT ptStart,POINT ptEnd);
调用成功返回非零,否则返回零。参数关系如图所示(以坐标系满足x2-x1>0、y2-y1>0时举例):
两个空心圆圈为椭圆弧上的点,填写到参数中的顺序取决于椭圆弧的绘制方向,默认情况下椭圆弧逆时针绘制。
1.2设置椭圆弧绘制方向
当我们需要顺时针方向绘制椭圆弧,需要通过特定的成员函数设置。
1.2.1函数原型
int CDC::SetArcDirection(int nArcDirection);
调用成功返回弧的方向,否则返回0。
1.2.2椭圆弧的方向宏
宏代码 | 方向 |
AD_COUNTERCLOCKWISE | 逆时针 |
AD_CLOCKWISE | 顺时针 |
2.使用练习
2.1在客户区从12点到3点逆时针绘制黑色实线椭圆弧,从12点到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 Twelve(rect.CenterPoint().x, rect.Height() / 2);//12点位置
CPoint Three(rect.Width() / 2, rect.CenterPoint().y);//3点位置
pDC->Arc(rect, Twelve, Three);//逆时针方向绘制
pDC->SetArcDirection(AD_CLOCKWISE);//设置椭圆弧方向为顺时针
CPen NewPen, * pOldPen;
NewPen.CreatePen(PS_DASHDOT, 1, RGB(0, 0, 255));
pOldPen = pDC->SelectObject(&NewPen);
pDC->Arc(rect, Twelve, Three);//顺时针方向绘制
pDC->SelectObject(pOldPen);
}