MFC之学习绘制线段、画笔使用与画金刚石图案

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_SOLID0实线任意指定
PS_DASH1虚线1或更小
PS_DOT2点线1或更小
PS_DASHDOT3点划线1或更小
PS_DASHDOTDOT4双点划线1或更小
PS_NULL5不可见线任意指定
PS_INSIDEFRAME6内框架线任意指定

线型效果图:

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]);
		}
}

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赴星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值