C++ MFC 画函数曲线(包含坐标)


第一步:新建MFC。

VC++6.0的话是文件--新建--工程--MFCAppWizard(exe)--填写工程名称--确定(其他的可以不动)--点单文档--直接点完成就行了。

第二步:找到OnDraw(CDC *pDC)这个函数名。

这个函数名在--C+你的工程名字+View里面,点开这个,就可以看见OnDraw(CDC *pDC)了,双击,然后看见:// TODO: add draw code for native data here。在下面插入画函数曲线代码就可以了,其他的地方代码不需要修改。
下面我给个案例:y=sinx 函数的曲线代码。当然头文件不能少:#include "math.h" 和 #define PI 3.14159;
void CGraphView::OnDraw(CDC* pDC)
{
	CGraphDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	//绘制画笔
	CPen cpen,pen;
	cpen.CreatePen(PS_SOLID,4,RGB(0,0,0));
	pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
	pDC->SelectObject(&cpen);
	
	//指定原点
	pDC->SetViewportOrg(300,300);
	pDC->SetTextColor(RGB(255,0,0));
	
	//绘制横坐标
	CString sPIText[]={"-1/2π","1/2π","π","3/2π","2π","5/2π","3π","7/2π","4π","9/2π","5π"};
	for(int n=-1,nTemp=0;nTemp<=660;n++,nTemp+=60)
	{
		pDC->LineTo(60*n,0);//坐标横线
		pDC->LineTo(60*n,-5);
		pDC->MoveTo(60*n,0);
		pDC->TextOut(60*n-sPIText[n+1].GetLength()*3,16,sPIText[n+1]);
	}
	pDC->MoveTo(0,0);
	CString sTemp;
	//绘制纵坐标
	for(n=-4,nTemp=0;nTemp<=180;n++,nTemp=60*n)
	{
		pDC->LineTo(0,60*n);
		pDC->LineTo(5,60*n);
		pDC->MoveTo(0,60*n);
		sTemp.Format("%d",-n);
		pDC->TextOut(10,60*n,sTemp);
	}
	double y,radian;
	pDC->SelectObject(&pen);
	
	//绘制相关曲线
	for(int x=-60;x<600;x++)
	{
		//弧度=X坐标/曲线宽度*角度*π
		//Y坐标=振幅*曲线宽度*sin(弧度)
		radian=x/((double)60*2)*PI;
		y=sin(radian)*2*60;
		pDC->MoveTo((int)x,-(int)y);
		pDC->LineTo((int)x,-(int)y);
	}
	cpen.DeleteObject();
	pen.DeleteObject();}

代码运行如下:








下面说一下在VS2010下的MFC画函数曲线:

第一步:新建MFC项目

文件--新建--项目--其他语言--Visual C++--MFC--MFC应用程序--输入名称--点确定(其他不动)--下一步--单个文档--在项目类型你可以选自己喜欢的,都有预览--完成。

第二步:插入画函数曲线代码

同样的,在源文件夹下找到 ”你的项目名称+view.cpp“”文件,如果没有解决方案窗口,在视图菜单下可以打开。接着找到“void CtestView::OnDraw(CDC* /*pDC*/)”这个函数,在“// TODO: 在此处为本机数据添加绘制代码”下插入代码,代码跟刚才的代码一样,不过跑的结果不太一样,你可以把"//绘制曲线"那部分代码放在"//绘制横纵坐标"的前面,运行结果就跟上面是一样的了。当然也要插入那两个头文件。
做完之后会发现很有意思,想画什么函数就画什么函数曲线。这篇文章横纵坐标都是扩大了60倍,我们可以自己折腾一下,很快就懂了画函数曲线MoveTO()和LineTo()两个函数了。谢谢了!文章不妥之处望批评指正,有什么问题可以私信我,知无不言,我也是一个菜鸟。
/*=============================================== 作者:LXZ-2008 FROM:CUMT 计08级 时间:2012-04-22 功能:能在SDK、MFC编程中实现笛卡尔 坐标系统的绘制,以及曲线,点的绘制。 特性:1.本程序采用面向对象思想设计; 2.具备很好的独立性,随时可以把这两个文件应 用在任意SDK、MFC开发中; 3.有良好的灵活性,扩展性,易用性,在稍微扩 展一下可以绘制任意曲线,图形; 4.具备良好的组合性,符合模块内高内聚,模块 外低耦合的思路; 5.整个程序仅有1300行左右代码,如果嫌代码过 多,可以把原先变量的PROTECTED保护类型打开, 换成PUBLIC,这样去掉GET和SET函数,这个思路 起源于我对J2EE中STRUTS2框架的学习以及对COM 组件技术的了解,它们也是这种思路这时可以省 下几百行代码。 6.当然也会有设计模式的思路在里面。 个人说明: 本程序花了我将近2天的时间编写,尽管开始有点 不想,但是还是觉得有意义,能给广大网友提供益处。 本系统的雏形来自2010年下半年的程序,当时花了 10天时间,弄了3千行代码。在现在看来当时的程序的 执行效率未必比现在的低,但是可维护性糟糕,可拓展 性糟糕,不具备良好的灵活性。需求改变了,代码会大 幅改变。换句话说,现在看来当时的程序是十分糟糕的, 生命周期已经结束。 而在用了面向对象的思想和设计模式,以及一些数 据结构去重新搭建这个系统的时候,代码其实1千多行就 搞定了,时间3-4天,不需要那么多现在我来弄的话。 主要起源于自己参与真实的有数十万代码的项目的开发, 这样提高了对程序开发的认识,以及商业程序应该如何 开发。同时也是自己面向对象思想和设计模式学习,对 自身思想的提高。 希望阅读代码的人觉得这些代码是优雅的,这就满 足了,尽管注释少了些,你们自己加吧。 QQ:706625262 E-MAIL:706625262@qq.com 不做商业和技术支持。 声明: 本程序代码未经本人同意,或者未给我MONEY的前提下, 不得用于商业目的,别让我鄙视你。在非商业目的使用 下请注明本人是原创,表学腾讯。 ==================================================*/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论 7

打赏作者

残影丶

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值