1.笔记
1.1绘制直线段
1.1.1移动当前位置
函数原型:
CPoint CDC::MoveTo(int x,int y);
CPoint CDC::MoveTo(POINT point);
返回值是先前位置。
1.1.2绘制直线段
函数原型:
BOOL CDC::LineTo(int x,int y);
BOOL CDC::LineTo(POINT point);
调用成功返回非0,否则返回0
1.2改变直线段属性
使用CPen画笔类。
1.2.1创建画笔
函数原型:
BOOL CPen::CreatePen(int nPenStyle,int nWidth,COLORREF crColor);
参数顺序为线型,线宽,颜色。调用成功返回非0,否则返回0。
1.2.2线型种类
画笔样式 | 宏定义值 | 线型 | 宽度 |
PS_SOLID | 0 | 实线 | 任意指定 |
PS_DASH | 1 | 虚线 | 1或更小 |
PS_DOT | 2 | 点线 | 1或更小 |
PS_DASHDOT | 3 | 点划线 | 1或更小 |
PS_DASHDOTDOT | 4 | 双点划线 | 1或更小 |
PS_NULL | 5 | 不可见线 | 任意指定 |
PS_INSIDEFRAME | 6 | 内框架线 | 任意指定 |
线型效果图:
1.2.3 将画笔选入设备上下文
函数原型:
CPen* CDC::SelectObject(CPen* pPen);
调用成功返回正在被替换的对象的指针,否则返回NULL。
2.使用练习
2.1将圆10等分,使用直线段将各等分点相连。
这就是所谓的金刚石图案,为了方便绘图,仍然自建坐标系。
2.1.1使用圆周率的宏定义
在math.h文件中有其宏定义M_PI
#if defined _USE_MATH_DEFINES && !defined _MATH_DEFINES_DEFINED
#define _MATH_DEFINES_DEFINED
// Definitions of useful mathematical constants
//
// Define _USE_MATH_DEFINES before including <math.h> to expose these macro
// definitions for common math constants. These are placed under an #ifdef
// since these commonly-defined names are not part of the C or C++ standards
...
#define M_PI 3.14159265358979323846 // pi
...
#endif
但是在math.h中默认并没有定义_USE_MATH_DEFINES,因此如果需要使用M_PI的话需要在引用math.h前先定义_USE_MATH_DEFINES
2.1.2编程实现
#define _USE_MATH_DEFINES
#include <math.h>
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);
int r = 200, n = 10;//半径,等分数
CPoint p[10];
double theta = 2 * M_PI / n;//等分角弧度
for (int i = 0; i < 10; ++i) {
p[i].x = (int)(r * cos(i * theta));//注意像素坐标是整数,要取整
p[i].y = (int)(r * sin(i * theta));
}
for(int i=0;i<n-1;++i)//连线
for (int j = i + 1; j < n; ++j) {
pDC->MoveTo(p[i]);
pDC->LineTo(p[j]);
}
}