mfc简单绘图程序
mfc基于对话框绘制曲线
mfc基于对话框绘制曲线
在MFC(Microsoft Foundation Classes)中,可以使用对话框来绘制曲线。
首先,您需要在对话框资源中添加一个静态控件来作为曲线的绘制区域,然后在对话框类中添加绘制曲线的代码。
在对话框资源中,您可以添加一个静态控件,比如一个“Picture Control”或者“Static”控件,作为曲线的绘制区域。
然后,在对话框类的头文件中添加控件的变量声明,比如`CStatic m_curveArea;`。
接下来,在对话框类的源文件中,您可以重载对话框类的
`OnPaint`函数来进行曲线的绘制。
在`OnPaint`函数中,您可以使用GDI(图形设备接口)函数来绘制曲线,比如`MoveToEx`和
`LineTo`函数来绘制曲线的轨迹。
另外,您也可以使用MFC类库中提供的绘图类(如`CDC`和
`CPen`)来进行曲线的绘制。
您可以创建一个`CDC`对象,然后使用`MoveTo`和`LineTo`函数来绘制曲线。
总的来说,您需要在对话框资源中添加绘制曲线的控件,然后
在对话框类中编写绘制曲线的代码,可以使用GDI函数或MFC提供的绘图类来实现曲线的绘制。
希望这些信息能够帮助您开始在MFC 基于对话框绘制曲线。
建立一个简单地画直线的MFC单文档对话框并实现在对话框里面画直线
建立一个简单地画直线的MFC单文档对话框并实现在对话框里面画直线在MFC单文档应用程序中创建一个对话框窗口并实现在对话框内画直线的过程如下:1.创建MFC单文档应用程序- 在 Visual Studio 中创建一个新的 MFC 单文档应用程序项目。
选择"对话框"作为应用程序类型。
-设置应用程序名称和位置,然后单击"完成"创建项目。
2.设置对话框窗口- 在对话框中添加一个自定义控件。
选择"工具箱"中的"Picture Control"控件,拖动到对话框上。
- 选中图片控件,右键单击并选择"属性"。
更改 ID 为IDC_DRAW_AREA,并将 Border 属性设置为 None。
-拖动控件大小以适应窗口布局,并保存对话框。
3.修改对话框类- 打开对话框类的头文件(例如 CMyDialog.h),添加一个标志变量来跟踪鼠标左键按下的状态:```cppBOOL m_bDrawing;```- 在 CMyDialog.cpp 文件中添加以下消息映射函数:```cppBEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)ON_WM_LBUTTONDOWNON_WM_LBUTTONUPON_WM_MOUSEMOVEEND_MESSAGE_MAP```-在头文件中声明回调函数```cppafx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);```4.实现画线功能- 在 CMyDialog.cpp 文件中实现 OnLButtonDown 函数,该函数用于开始画线:```cppvoid CMyDialog::OnLButtonDown(UINT nFlags, CPoint point)m_bDrawing = TRUE;CClientDC dc(this);dc.MoveTo(point);}```- 实现 OnLButtonUp 函数,该函数用于结束画线:```cppvoid CMyDialog::OnLButtonUp(UINT nFlags, CPoint point) m_bDrawing = FALSE;}```- 实现 OnMouseMove 函数,该函数用于动态绘制线段:```cppvoid CMyDialog::OnMouseMove(UINT nFlags, CPoint point) if (m_bDrawing)CClientDC dc(this);dc.LineTo(point);}}5.更新对话框消息映射```cppafx_msg void OnPaint(;afx_msg BOOL OnEraseBkgnd(CDC* pDC);```6重写重绘和擦除背景函数- 在 CMyDialog.cpp 文件中添加以下代码来重绘对话框:```cppvoid CMyDialog::OnPaintCPaintDC dc(this); // 用于在对话框上绘制//TODO:在此处添加您的消息处理程序代码}```-添加以下代码来防止对话框背景擦除:```cppBOOL CMyDialog::OnEraseBkgnd(CDC* pDC)return TRUE;}7.运行程序-单击“开始调试”(F5)以运行应用程序。
MFC画直线
MFC画直线最近自己在学习如何在VC 6.0 开发环境下的使用MFC AppWizard(exe)来绘画一条直线,虽然比较简单,通过这样的练习可以帮助你熟悉MFC的开发环境以及其中的消息传递机制,希望对于像我一样初入MFC图形绘制学习的人有帮助第一步:构建MFC窗体打开Visual C++ 6.0编译器新建→工程→MFC AppWizard(exe),工程名以DrawLine为例,然后确定。
为了方便,在MFC应用程序向导—步骤1当中选择“单文档”,其余所有的步骤都为默认值,直接“完成”。
这样一个简单的MFC 窗体就构建好了,自己不妨Compile—Build—BuildExecute一下。
第二步:编辑菜单项选择ResourceView视窗展开Menu文件夹,左键双击IDR_DRAWLITYPE,右边就会出现菜单图形编辑界面,为了简化,我们只在添加帮助→DrawLine功能选择项。
双击空白会弹出“菜单项目属性”对话框。
ID:ID_DRAW_LINE;标明:DrawLine(&D),其它的为缺省。
第三步:建立消息命令如果此时运行该程序,你会发现帮助—DrawLine的功能选项是灰色的,原因就在于我们还没有添加该功能的消息命令相应函数。
通过“查看—Message Maps—Project:DrawLine—Class name:CDrawLineView—Object IDs:ID_DRAW_LINE—选定COMMAND—Add Function…”,其它为默认,最后确定完成。
现在如果再重新运行该程序的话,会发现原来的灰色已经消除了。
第四步:添加鼠标消息响应打开ClassView视窗,右键选定CDrawLineView,选择Add Windows Messsage Handler会弹出对话框,完成CDrawLineView类的WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP三个Windows消息事件的新建。
MFC中的CDC 绘图
MFC中的CDC 绘图绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行,例如:void CTestView::OnDraw(CDC* /*pDC*/) {CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码}每次需要重绘窗口时(程序启动/窗口大小改变/全部或部分窗口重现/程序员调用RedrawWindow或UpdateWindow),应用程序框架都会调用该CWnd的消息响应成员函数(的覆盖)来绘制窗口客户区。
在Windows中,绘图一般在视图窗口的客户区进行,使用的是MFC的设备上下文(DC = Device-Context)类CDC中各种绘图函数。
在绘图前,必须先得到客户区大小和DC、设置绘图颜色,然后再根据文档数据或用户操作来绘制图形。
1 几何对象的结构和类为了使用绘图函数,应该先了解绘图所用到的几种表示几何对象的结构和类。
这些结构和类分别定义在头文件windef.h和afxwin.h中。
1.点1)点结构POINT点数据结构POINT用来表示一点的x、y坐标:typedef struct tagPOINT {LONG x;LONG y;} POINT;2)点类CPoint点类CPoint为一个没有基类的独立类,封装了POINT结构,有成员变量x和y,其构造函数有5种:CPoint( );CPoint( int initX, int initY );CPoint( POINT initPt );CPoint( SIZE initSize );CPoint( LPARAM dwPoint ); // 低字设为x、高字设为yCPoint类还定义了4个平移和设置函数:void Offset(int xOffset, int yOffset);void Offset(POINT point);void Offset(SIZE size);void SetPoint(int X, int Y);CPoint类还重载了+、-、+=、-=、==、!=等运算符来支持CPoint对象和CPoint、POINT、SIZE对象之间的运算。
mfc 简单例程
mfc 简单例程摘要:1.MFC 简单例程概述2.MFC 简单例程的实现步骤3.MFC 简单例程的应用示例正文:一、MFC 简单例程概述MFC(Microsoft Foundation Class)是微软提供的一个用于开发Windows 应用程序的类库。
它包含了大量预定义的类和函数,可以帮助开发者快速、简便地创建Windows 应用程序。
MFC 简单例程是指使用MFC 类库创建的一个简单的程序实例,通常用于演示MFC 的基本功能和操作方法。
二、MFC 简单例程的实现步骤1.打开Visual Studio,创建一个新的MFC 应用程序项目。
2.在Visual Studio 中,选择“File”>“New”>“MFC AppWizard”,然后点击“Next”。
3.在“AppWizard”对话框中,选择“A simple MFC application”,然后点击“Next”。
4.输入项目名称、选择项目位置,然后点击“Finish”。
5.在“Solution Explorer”窗口中,双击“MainFrame.cpp”文件,打开代码编辑器。
6.在代码编辑器中,可以编写MFC 简单例程的代码。
例如,可以创建一个窗口,添加按钮和文本框等控件,以及实现按钮点击事件的处理函数等。
三、MFC 简单例程的应用示例以下是一个MFC 简单例程的应用示例,它实现了一个简单的计算器功能:1.创建一个MFC 应用程序项目,并添加一个名为“Calculator”的窗口。
2.在“Calculator”窗口中,添加两个文本框(Text1 和Text2),用于输入两个数字;添加一个按钮(Button1),用于执行计算操作。
3.为“Button1”按钮添加一个点击事件处理函数(ON_BN_CLICKED)。
在函数中,编写计算两个文本框中数字之和的代码,并将结果显示在文本框(Text1)中。
4.编译并运行程序,可以看到一个简单的计算器界面。
MFC基本绘图函数使用方法
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数 绘制图形如下所示,坐标(100, 150)表示距离左边100,距离顶部 150。
计算机图形学
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数 注意:绘制图形主要调用CDC* pDC方法实现,MFC可以补充 提示函数。
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数
(1)绘制直线
计算机图形学
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数
void CTest01View::OnDraw(CDC* pDC) {
CTest01Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->MoveTo(100,150); pDC->LineTo(300,400); // TODO: add draw code for native data here }
MFC绘图工具类包括CGdiObject、CBitmap、CBrush、 CFont、CPallette、CPen和CRgn等。常用的包括:
(4) CPen:封装了GDI画笔,选作设备上下文的当前画笔, 画笔用于绘制图形边界线;
(5) CPallette:封装了GDI调色板,提供应用程序和显示器 之间的颜色接口;
计算机图形学
一.MFC基本绘图函数使用方法
一. MFC绘图基础知识 CDC类
CDC类派生出CClientDC类、CMetaFileDC类、 CPaintDC类和CWindowDC类。
mfc简单绘图程序报告
mfc简单绘图程序报告简单绘图程序1 需求说明1.1 问题描述设计一个简单的绘图应用程序,可以绘制图形或自由绘制线段,可以更改颜色、画笔粗细、保存文件。
1.2功能说明1.图形绘制功能:直线、椭圆、矩形。
在菜单栏中选择需要的图形(也可以通过工具栏中选择)用鼠标便能在视图中绘出相应的图形。
2.可以绘制自由线段3.对图形的操作:能通过菜单栏弹出对话框选择线宽、自定义颜色,也可以擦除绘制的线段。
4.可以保存绘图文件,保存后打开可以继续绘制。
2.1.3 数据说明在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。
在CDzyView类中添加一个私有变量xz;用来保存用户的选择(直线、矩形、椭圆、自由绘图)在绘制时都可有两点来确定其图形。
当鼠标左击时得到一个点,当鼠标停止移动时得到另外一个点。
为视图类CDzyView分别捕获鼠标左键按下和弹起这两个消息。
当鼠标左键按下时,需要将鼠标当前按下点保存至sx、sy,在鼠标移动停止后,将当前坐标保存至ex,ey.其他主要数据说明:int fd 判断是否为自由绘图模式int w 线宽int R RGB中的Rint G RGB中的Gint B RGB中的BCGraph类中int m_nType:保存后重绘时用户的选择int qdx; 重绘起点xint qdy; 重绘起点yint zdx; 重绘终点xint zdy; 重绘终点yCLine类中int cx; 重绘线宽int sx; 重绘起点xint sy; 重绘起点yint zx; 重绘终点xint zy; 重绘终点yint w; 重绘线宽自定义颜色对话框关联变量:IDC_EDIT_RED int m_RedIDC_EDIT_GREEN int m_GreenIDC_EDIT_BLUE int m_BlueIDC_SCROLL_RED CScrollBar m_SredIDC_SLIDER_GREEN CSliderCtrl m_SgreenIDC_SPIN_BLUE CSpinButtonCtrl m_Sblue2 分析、设计与实现2.1 主要功能设计与实现2.1.1 有关文档视图功能的设计与实现单文档结构可序列化的类CGraph从CObject派生可序列化的类CLine从CObject派生对话框类zdyyanse从CDialog派生2.1.2 有关消息处理的设计与实现方案:需要响应的消息应有:鼠标移动、鼠标左键按下、鼠标左键抬起、菜单栏中的画矩形、画直线、画椭圆、自由绘图、更多选项中的自定义颜色、工具栏中的红色、蓝色、绿色、线宽1、线宽2、线宽3、橡皮擦。
MFC画图程序步骤
MFC画图程序步骤MFC(Microsoft Foundation Class)是一种用于开辟Windows应用程序的C++类库。
在MFC中,我们可以使用GDI(Graphics Device Interface)来创建和操作图形。
下面是使用MFC创建一个简单的画图程序的步骤。
步骤1:创建一个新的MFC项目首先,打开Visual Studio并选择创建一个新的项目。
在项目类型中,选择Visual C++ -> MFC,然后选择MFC应用程序类型。
输入项目名称并选择保存的位置。
在应用程序类型中,选择“单文档”或者“多文档”视图,具体根据你的需求而定。
点击“确定”按钮创建项目。
步骤2:设计用户界面在MFC应用程序中,用户界面是通过对话框资源来设计的。
在资源视图中,双击IDD_DIALOG(或者其他对话框资源)以打开对话框编辑器。
在对话框编辑器中,你可以添加按钮、文本框、菜单等控件来设计你的用户界面。
在画图程序中,你可以添加一个画布控件来显示绘制的图形。
步骤3:添加绘图功能在MFC中,你可以使用GDI来进行绘图操作。
打开你的对话框类的头文件(例如,CMyDialog.h),添加以下头文件引用:#include <afxwin.h>#include <afxext.h>#include <afxdisp.h>在对话框类的源文件(例如,CMyDialog.cpp)中,添加以下代码来处理绘图操作:```void CMyDialog::OnPaint(){CPaintDC dc(this); // 用于绘制的设备上下文// 在这里进行绘图操作dc.Rectangle(100, 100, 200, 200); // 绘制一个矩形dc.Ellipse(300, 100, 400, 200); // 绘制一个椭圆}```步骤4:处理绘图事件在对话框类的消息映射中添加对绘图事件的处理。
简单画图程序设计
面向对象程序设计课程设计报告设计题目:简单画图程序的设计学院:信息工程学院专业:计算机科学与技术(交通)学号:姓名:指导教师:2015 年1 月4 日目录1.设计目的和内容1 1.1.设计目的11.2.设计内容12.基本功能1 2.1.图形样式1 2.2.颜色样式2 2.3.画笔样式22.4.线型选择33.设计思路34.软件设计5 4.1.设计步骤5 4.2.界面设计8 4.3.关键功能的实现95.心得体会116.参考文献117.附录11 7.1.调试报告11 7.2.调试结果12 7.3.关键源代码121.设计目的和内容1.1.设计目的1、学习Visual C++的MFC开发程序的步骤2、综合运用所学的类、继承和多态的知识3、进一步掌握程序调试的方法1.2.设计内容1、利用MFC的向导,创建基于单文档的应用程序2、编程实现,绘制线、圆、矩形的功能3、能够设定当前要画的图形样式(最少为以上3种)和图形颜色(最少能够设为以下4种颜色:黑、红、绿、蓝)4、当窗口重绘后,还能保持原来的图形5、选做1:能够选中某些已绘制的图形,并删除之6、选做2:能够保存已绘制的图形,下次打开时恢复原状2.基本功能2.1.图形样式在菜单栏的设置里面有图形样式的选择,可以点击选中也可以在工具栏里点击图形的图标,能够实现绘制点、直线、矩形和椭圆的功能。
《编译原理》预备实验四:MFC 中编写绘图程序
《编译原理》预备实验四:在MFC中编写绘图程序实验目的:建立MFC Windows 程序设计的形象概念,激发程序设计兴趣。
实验要求:掌握MFC应用程序框架的建立;MFC菜单的编写;模态对话框及常用控件的编写;鼠标响应消息的编写;类的建立;了解用于图形编程的CDC类及OnDraw函数作用;了解C++的STL标准模板库。
实验内容:编写一个简单的画直线程序。
直线的生成既可以通过对话框方式(键盘方式),也可以通过鼠标方式。
主要思想:建立一个直线类CLine,直线由起点和终点构成,两个端点可以通过对话框或者鼠标指定。
将每次生成的直线放入STL的list链表中,在OnDraw函数中遍历list链表,只要list链表不空就依次取出每条直线并绘制。
实验步骤:一、建立MFC应用程序框架步骤一:打开Microsoft Visual C++ 6.0 应用程序。
如图1所示。
图1:VC应用程序界面步骤二:在菜单中选择“文件”—>“新建”打开建立用户应用程序对话框,在对话框的“工程”页面左边选择MFC AppWizard[exe];在右边“位置”编辑框中键入要建的项目存放位置,例如D盘根目录;在右边“工程”编辑框中键入要建的项目的名称,例如MFCTest,这时我们会看到“位置”编辑框中信息变为“D:\MFCTest”,表示我们的项目文件都将存放在这个目录中。
如图2所示。
图2:建立MFC应用程序1步骤三:我们点击“确定”按钮进行下一步设置。
在“MFC AppWizard – Step 1”对话框中有“S单个文档”、“M多个文档”“D基本对话框”三个选项。
“S单个文档”表示用户程序一次只能打开一个文档窗口;“M多个文档”表示用户程序除了一个文档主窗口外,还可以打开若干个显示不同文档的小窗口,即子窗口;“D基本对话框”表示用户程序的界面是对话框形式的。
这里我们选择“S单个文档”,然后,单击“下一个”按钮。
如图3所示。
图3:MFC AppWizard – Step 1步骤四:“MFC AppWizard – Step 2 of 6”对话框是关于所建立的程序是否用到数据库,我们选择“否”,然后,单击“下一个”按钮。
实验四 MFC图形绘制编程实验
实验四 MFC图形绘制编程实验一、实验目的(1) 熟悉Visual C++ 6.0开发环境;(2) 掌握MFC消息映射的操作步骤;(2) 掌握MFC图形输出的方法;(3) 理解设备环境、画笔、画刷的概念,掌握常用的绘图函数。
二、实验内容请编写程序,要求如下:(1) 定义一支黄色画笔,绘制一条线段;(1) 定义一支紫色画笔,绘制一条多段线;(3) 定义一支红色画笔,绘制一个正方形,并用适当的画刷填充图形内部;(4) 定义一支绿色画笔,绘制一个圆,并用适当的画刷填充图形内部;(5) 定义一支蓝色画笔,绘制一个正六边形,并用适当的画刷填充图形内部。
三、实验报告1.列出图形绘制程序代码清单:(1)在头文件Demo.h中:#include "afxwin.h"class CDemoWnd:public CFrameWnd{public:CDemoWnd();~CDemoWnd();public:LRESULT OnPaint(WPARAM wParam,LPARAM lParam);DECLARE_MESSAGE_MAP()public:int m_nX0;int m_nY0;int m_nX1;int m_nY1;};class CDemoApp:public CWinApp{public:BOOL InitInstance();};CDemoApp ThisApp;(2)在源文件Demo.cpp中:#include "tpd1.h"CDemoWnd::CDemoWnd(){m_nX0 = 0;m_nY0 = 0;m_nX1 = 0;m_nY1 = 0;}CDemoWnd::~CDemoWnd(){}BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd)ON_MESSAGE(WM_PAINT,OnPaint)END_MESSAGE_MAP()LRESULT CDemoWnd::OnPaint(WPARAM wParam,LPARAM lParam) {CPaintDC dc(this);CPen Pen1,*pOldPen1;Pen1.CreatePen(PS_SOLID,10,RGB(255,255,0));pOldPen1=dc.SelectObject(&Pen1);dc.SelectObject(&Pen1);dc.MoveTo(10,10);dc.LineTo(100,100);CPen Pen2,*pOldPen2;Pen2.CreatePen(PS_SOLID,4,RGB(255,0,255));pOldPen2=dc.SelectObject(&Pen2);dc.SelectObject(&Pen2);POINT pt1[]={{100,10},{10,180},{200,150}};dc.Polyline(pt1,3);CPen Pen3,*pOldPen3;dc.SelectStockObject(BLACK_BRUSH);Pen3.CreatePen(PS_SOLID,4,RGB(255,0,0));pOldPen3=dc.SelectObject(&Pen3);dc.SelectObject(&Pen3);dc.Rectangle(300,50,400,150);CPen Pen4,*pOldPen4;dc.SelectStockObject(GRAY_BRUSH);Pen4.CreatePen(PS_SOLID,4,RGB(0,255,0));pOldPen4=dc.SelectObject(&Pen4);dc.SelectObject(&Pen4);dc.Ellipse(500,200,700,400);CPen Pen5,*pOldPen5;Pen5.CreatePen(PS_SOLID,4,RGB(0,0,255));pOldPen5=dc.SelectObject(&Pen5);dc.SelectStockObject(DKGRAY_BRUSH);dc.SelectObject(&Pen5);POINT pt2[]={{250,250},{400,250},{475,379},{400,509},{250,509},{175,379}};dc.Polygon(pt2,6);return 0;}BOOL CDemoApp::InitInstance(){CDemoWnd *pMainWnd = new CDemoWnd();pMainWnd->Create(NULL,"Demo Mini-MFC");pMainWnd->ShowWindow(m_nCmdShow);pMainWnd->UpdateWindow();m_pMainWnd = pMainWnd;return TRUE;}2、程序运行结果:3、总结在MFC 程序中绘制图形的基本操作步骤:(1)获取图形设备接口。
MFC画图的基本方法
MFC画图的基本方法1.画笔类,CPen,创建画笔类的对象后,需要调用CreatePen(......)函数创建画笔。
然后将其选入设备描述表中。
pDC->SelectObject(.......);2.设置起点坐标。
在这里调用一个函数来设置坐标原点。
pDC->SetViewportOrg(100,255);3.调用LineTo(point),MoveTo(Point)函数画图。
4.删除创建的画笔对象。
pen.DeleteObject();以下是今天所写的画正弦函数的图像。
创建一个单文档的应用程序。
并且在VIEW类中的OnDraw(。
)函数里面做消息响应。
由于调用了sin()函数,所以要把math.h头文件包含进来。
#include "math.h"void CDrawSinXView::OnDraw(CDC* pDC){CDrawSinXDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data here//建立画笔CPen pen_Zuobixi,pen_sinx;pen_Zuobixi.CreatePen(PS_SOLID,4,RGB(0,0,0));pen_sinx.CreatePen(PS_SOLID,2,RGB(0,0,255));pDC->SelectObject(&pen_Zuobixi);//指定原点pDC->SetViewportOrg(100,255);pDC->SetTextColor(RGB(255,0,0));//绘制横坐标CString sPIText[]={"-1/2π","","1/2π","π","3/2π","2π","5/2π","3π","7/2π","4π","9/2π","5π"};int n=-1;int nTemp=0;while (nTemp<=660){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]);n++;nTemp +=60;}pDC->MoveTo(0,0);CString strTemp;//绘制纵坐标for(n=-4,nTemp = 0;nTemp<=180;n++,nTemp+=60) {pDC->LineTo(0,60*n);pDC->LineTo(5,60*n);pDC->MoveTo(0,60*n);strTemp.Format("%d",-n);pDC->TextOut(10,60*n,strTemp);}double y,radian;pDC->SelectObject(&pen_sinx);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);}pen_sinx.DeleteObject();。
MFC画板程序教程-图文
MFC画板程序教程-图文第四章屏幕绘图4.1、MFC绘图的基本知识4.1.1、设备描述表(deviceconte某t)的概念绝大多数的Window应用程序都要向不同的输出设备(打印机、屏幕)上绘制文本和图形。
由于Window是一个具有与设备无关性的操作系统,所以任何向屏幕上进行输出的功能都要间接地通过一个叫做设备描述表DC(deviceconte某t)的对象(简称为DC对象)来完成。
用户向设备描述表对象提出输出的要求,然后由Window自己来调用具体输出设备的驱动程序,及完成实际的输出工作。
使用设备描述表带来的最大的好处就是输出格式的一致性,因为输出不再是直接针对具体的设备,而是通过统一格式的设备描述表间接地实现。
设备描述表实际上是一种Window的数据结构,它保存了设备(打印机、屏幕等)的绘图属性和绘图函数。
设备描述表对象就是设备描述表数据结构的一个具体的实例,它提供了一个绘图的环境,所有的绘图工作都要通过它来实现。
MFC提供了不同类型的设备描述表类,每一个类都封装了代表Window设备描述表的句柄(HDC)和函数。
因此,使用MFC获取设备描述表的操作比使用WindowAPI方法容易的多。
围绕设备描述表,MFC还提供了一系列与其配合使用的绘图工具对象,这其中包括:画笔对象、刷子对象以及字体对象等等。
它们的工作流程是这样的:首先对设备描述表进行设置,即获取设备描述表对象;然后选择进行输出所需要的绘图工具;最后用设备描述表对象的输出函数绘制图形。
4.1.2、窗口、客户区和非客户区的概念窗口是Window应用程序基本的操作单元,是其运行及与用户进行交互的基本平台。
屏幕输出的目标一般都是窗口内的客户区,它不包括窗口的边框、水平和垂直滚动条、状态条、工具条、菜单栏和标题栏。
窗口内的客户区是一个万能的输出区域,可以接受无论是图形、文本、位图、还是其他类型的数据(例如OLE对象)。
窗口内除客户区之外的区域即为非客户区。
实验一 MFC基本绘图
数学与计算科学系学生实验报告实验课程名称:计算机图形学实验内容:实验一 MFC基本绘图系别:年级:专业班:学生姓名:学号:开课时间:年下学期一、实验要求1. 按照教材第40页2.2节所介绍的操作步骤,熟悉MFC应用程序的创建过程,并完成第50页的例2-5。
2.在上面程序的基础上,通过设置不同的画笔和画刷,至少实现8个不同图形的绘制,如:椭圆、矩形、实线、虚线、位图显示、五角星(多边形)、圆弧、扇形、Bezier曲线等等。
二、实验过程1.启动Visval 6.0++,创建MFC单文档工程。
2. 在MFC的OnDraw(CDC* pDC)中“ // TODO: add draw code for native data here”下进行编程。
3.建立直角坐标系,并标出x,y轴和原点O。
4.在坐标系里画图。
5.用图片填充背景时要先将图片导入MFCresources中。
6.画五角星时在头文件中加入以下代码:#include "math.h"#define PI 3.1415926#define Round(d) int(floor(d+0.5))三、程序代码void CMywork1View::OnDraw(CDC* pDC){CMywork1Doc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereCRect rect;//定义矩阵GetClientRect(&rect);//获得客户区矩阵pDC->SetMapMode(MM_ANISOTROPIC);//设置映射模式pDC->SetWindowExt(100,100);//设置窗口pDC->SetViewportExt(100,100);//设置视区:x轴水平向右为正,y轴垂直向上为正pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);//设置客户区中心为坐标系原点rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);//客户区矩阵校正//建立坐标系CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(0,255,0));//画实线,选择绿色画笔pOldPen=pDC->SelectObject(&NewPen);pDC->MoveTo(-rect.right,0); //自定义坐标轴pDC->LineTo(rect.right,0);pDC->MoveTo(0,-rect.bottom);pDC->LineTo(0,rect.bottom);pDC->MoveTo(rect.right,0); //画x轴的箭头pDC->LineTo(rect.right-10,-7);pDC->MoveTo(rect.right,0); //画x轴的箭头pDC->LineTo(rect.right-10,7);pDC->MoveTo(0,-rect.bottom); //画y轴的箭头pDC->LineTo(7,10-rect.bottom);pDC->MoveTo(0,-rect.bottom); //画y轴的箭头pDC->LineTo(-7,10-rect.bottom);pDC->TextOut(rect.right-15,5,"x"); //显示x轴pDC->TextOut(25,15-rect.bottom,"y"); //显示y轴pDC->TextOut(-15,10,"O"); //显示原点//直线---画实线1CPoint A(50,50),B(450,300);CPen NewPen1,*pOldPen1;NewPen1.CreatePen(PS_SOLID,1,RGB(0,225,225));//画实线,选择青色画笔pOldPen1=pDC->SelectObject(&NewPen1);pDC->MoveTo(A);pDC->LineTo(B);pDC->SelectObject(pOldPen1);pDC->TextOut(50,50,'A');pDC->TextOut(450,300,'B');pDC->TextOut(200,200,"实线");//直线---画虚线2CPoint C(300,150),D(600,100);CPen NewPen2,*pOldPen2;NewPen2.CreatePen(PS_DASH,1,RGB(225,0,0));//画虚线,选择红色画笔pOldPen2=pDC->SelectObject(&NewPen2);pDC->MoveTo(C);pDC->LineTo(D);pDC->SelectObject(pOldPen2);pDC->TextOut(300,150,'C');pDC->TextOut(600,100,'D');pDC->TextOut(450,100,"虚线");//画椭圆3rect.DeflateRect(100,50);CBrush * pOldBrush3;pOldBrush3=(CBrush *)pDC->SelectStockObject(NULL_BRUSH);//选择透明画刷pDC->Ellipse(rect);//绘制椭圆pDC->SelectObject(pOldBrush3);//画圆角矩形4CBrush NewBrush4,*pOldBrush4;NewBrush4.CreateSolidBrush(RGB(255,0,0));pOldBrush4=pDC->SelectObject(&NewBrush4);pDC->RoundRect(-400,-200,-50,-40,40,20);pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush4);//画Bezier样条9CPoint pp[7];pp[0]=CPoint(20,-200);pp[1]=CPoint(90,-70);pp[2]=CPoint(220,-30);pp[3]=CPoint(250,-160);double a=(pp[3].y-pp[2].y)/(pp[3].x-pp[2].x);double x=270,y=a*(x-pp[3].x)+pp[3].y;pp[4]=CPoint(Round(x),Round(y));pp[5]=CPoint(480,-130);pp[6]=CPoint(400,-25);for(int j=0;j<7;j++){if(0==j)pDC->MoveTo(pp[j]);elsepDC->LineTo(pp[j]);pDC->Ellipse(pp[j].x-5,pp[j].y-5,pp[j].x+5,pp[j].y+5);//黑色实心圆绘制控制点}CPen NewPen9,*pOldPen9;NewPen9.CreatePen(PS_SOLID,3,RGB(255,0,0));//红色画笔绘制样条pOldPen9=pDC->SelectObject(&NewPen9);pDC->PolyBezier(pp,7);//绘制Bezier样条pDC->SelectObject(pOldPen9);pDC->TextOut(280,-100,"Bezier曲线");//绘制五角星6CPen penBlue(PS_SOLID,5,RGB(0,0,255));//定义五个像素宽的蓝色画笔CPen *pOldPen6=pDC->SelectObject(&penBlue);CBrush brushRed(RGB(255,0,0));//定义红色画笔CBrush * pOldBrush6=pDC->SelectObject(&brushRed);pDC->SetPolyFillMode(WINDING);//设置填充模式int r=200;//正五边形外接圆的半径CPoint p[5];//定义正五边形顶点数组double Beta=2*PI/5;//定义每个顶点的圆心角double Alpha=PI/10;//定义起始角for(int i=0;i<5;i++){p[i].x=Round(r*cos(i*Beta+Alpha));//计算正五边形顶点坐标p[i].y=Round(r*sin(i*Beta+Alpha));}CPoint v[5];//定义五角星顶点数组v[0]=p[0];v[1]=p[2];v[2]=p[4];v[3]=p[1];v[4]=p[3];//转储顶点pDC->Polygon(v,5);//绘制五角星pDC->SelectObject(pOldPen6);//恢复画笔pDC->SelectObject(pOldBrush6);//恢复画刷//画扇形7CBitmap NewBitmap7; CBrush NewBrush7,*pOldBrush7;NewBrush7.CreatePatternBrush(&NewBitmap7);//将背景图作为画刷填充扇形pOldBrush7=pDC->SelectObject(&NewBrush7);CPen *pOldPen7;pOldPen7=(CPen*)pDC->SelectStockObject(NULL_PEN);CPoint ld,rt,sp,ep;ld=CPoint(500,150),rt=CPoint(100,300);//第一个扇形的位置sp=CPoint(-100,-300),ep=CPoint(-500,-150);pDC->Pie(CRect(ld,rt),sp,ep);//画扇形函数CBrush Brush7;Brush7.CreateSolidBrush(RGB(0,255,255));//为下面的的扇形配青色pDC->SelectObject(&Brush7);ld=CPoint(-400,-170),rt=CPoint(-300,-130);//第二个扇形的位置sp=CPoint(-200,-100),ep=CPoint(-500,-100);pDC->Pie(CRect(ld,rt),sp,ep);//画获取像素图8srand((unsigned)time(NULL));//随机变量(随时间变化)COLORREF crColor;int m,n;for(n=50;n<100;n++)for(m=-100;m<-50;m++)pDC->SetPixelV(m,n,RGB(rand()%256,rand()%256,rand()%256));//生成随机像素点for(n=50;n<100;n++)for(m=-100;m<-50;m++){crColor=pDC->GetPixel(m,n);//获取原矩形区域的像素点pDC->SetPixelV(m-200,n+50,crColor);//用获取的像素点在y-90的位置生成原图}}四、实验结果。
计算机程序设计实践 MFC画图软件
}
void CCGraphicsView::OnPie()
{
// TODO: Add your command handler code here
m_nDrawType=7;
}
void CCGraphicsView::OnRoundrect()
{
// TODO: Add your command handler code here
{
// TODO: Add your command handler code here
CSettingDlg dlg;
dlg.m_nLineWidth=m_nLineWidth;/*保存用户设定的值*/
dlg.m_nLineStyle=m_nLineStyle;
if (IDOK==dlg.DoModal())
目的:
1.掌握用VC++6.0开发环境开发软件的方法;
2.熟悉获得帮助的方法;
3.掌握SDI应用程序结构,熟悉基于对话框的应用程序编程方法;
4.掌握用资源编辑器进行图标,菜单,工具栏,对话框等资源的编辑;
5.掌握对话框,常用控件的使用方法;
6.熟悉文档/视图结构,掌握文档和视图的相互控制技巧;
2.需求分析
计算机程序设计实践
课程设计报告
班级_计算机科学与技术1303班
学号130405320
姓名__________韦昌杆___________
指导教师___________杨威_____________
2015年1月8日
交互式绘图程序
1.引言
计算机的发展也是计算机语言的发展得到了很大的提高,人们的生活中离不 开图像,除了我们可以用铅笔在纸上画图外,我们也可以在电脑上绘制我们的想象,本实验就是基于VC++的一个小型的绘图软件。
mfc读取数据绘制曲线
mfc读取数据绘制曲线一、概述本篇文章将介绍如何使用Microsoft Foundation Class (MFC)库,从数据源读取数据,并将其绘制成曲线。
MFC是微软提供的一套用于开发Windows应用程序的类库,它提供了许多现成的类和函数,方便开发者快速开发应用程序。
二、需求分析在绘制曲线之前,我们需要明确数据来源和绘制方式。
通常,数据来源可以是数据库、文件、网络等。
绘制方式可以采用图表、曲线等方式。
在实际应用中,我们需要根据具体需求选择合适的数据源和绘制方式。
三、实现步骤1. 建立MFC应用程序:首先,我们需要创建一个MFC应用程序,以便于实现数据读取和曲线绘制功能。
2. 配置数据源:根据实际需求,配置数据源,如数据库、文件等。
可以使用MFC提供的数据库访问类(如CDatabase、CRecordSet等)或文件读取类(如CFile、CFileStream等)来实现数据读取。
3. 实现数据读取:使用MFC提供的函数或类(如AfxODBC、CFile等)从数据源中读取数据,并将其存储到变量中。
4. 绘制曲线:使用MFC提供的绘图类(如CPointF、CFont、CBrush等)和绘图函数(如CDC::DrawLine等)将数据绘制成曲线。
5. 调试和优化:在实现过程中,需要不断调试和优化代码,确保程序的正确性和性能。
四、代码示例以下是一个简单的代码示例,用于从文件中读取数据并绘制曲线:```cpp// 创建MFC应用程序// ...// 打开文件并读取数据CFile file("data.txt", CFile::modeRead);CString line;while (file.ReadLine(line)) {// 解析数据并存储到变量中double x, y;sscanf(line, "%lf %lf", &x, &y);// 绘制曲线CPen pen(PS_SOLID, 1, RGB(0, 0, 255)); // 绘制红色实线CPen* oldPen = pDC->SelectObject(&pen); // 选择画笔pDC->DrawLine(x1, y1, x2, y2); // 绘制曲线段pDC->SelectObject(oldPen); // 恢复旧画笔x1 += 1; // 更新x坐标}```五、总结通过以上步骤和代码示例,我们可以使用MFC库从数据源读取数据,并将其绘制成曲线。
简易绘图程序 使用API和MFC
XXX大学程序设计实践报告课题名称:程序设计实践学生姓名:XXXXXxxxxx班级:2012XXXXX班内序号:XXX学号:XXxx21XXX日期:2014年5月1.课题概述1.1课题目标和主要内容本课题了实现一个基于API和MFC的简易绘图软件。
此简易绘图软件,满足用户进行绘图时的基本需求,主要功能包括绘制会动的时钟,绘制三角形(API实现),绘制线条(MFC实现)。
应具有良好的界面、必要的交互信息和简易的菜单进行操作。
在程序的设计与实现中,系统开发平台为Windows7,主要工具为Visual Studio 2012。
1.2系统的主要功能主要功能与说明:DROW1(API):1)会动的时钟的绘制:模拟一个真实的表盘,绘制图形,显示实际的时间。
2)绘制简单的三角形;MFC:1)图形的绘制:a)线形绘图函数:Lineto:绘制直线Polyline:绘制折线Arc:绘制圆弧线Polybezir:绘制弯曲线b)区域绘图函数Rectant:绘制矩形Roundrect:绘制圆边矩形Ellips:绘制椭圆Pie:绘制扇形2)自由绘图:拖动鼠标可以自由绘制曲线,可以通过一个对话框选择所需线形线宽等。
3)清空功能:1)全部清空:可以清空整个屏幕内容。
2. 系统设计2.1 系统总体框架API:MFC:2.2 系统详细设计2.2.1 模块划分图及描述a) 绘图函数模块:通过各种系统自带的绘图函数,直接调用绘图。
设置他们的位置,并添加到菜单项,使点击菜单项则可出现相应图形。
Lineto:绘制直线 Polyline:绘制折线 Arc:绘制圆弧线 Polybezir:绘制弯曲线 Rectant:绘制矩形 Roundrect:绘制圆边矩形 Ellips:绘制椭圆Pie :绘制扇形b) 自由绘图模块:按下鼠标左键,初始化起始位置,在选定自由绘图模式的情况下,拖动鼠标的同时,获取鼠标当前位置为终点位置,调用MoveTo 和LineTo 函数连接两点。
C++课设:简单画图程序
简单画图程序1.基本功能描述本次课程设计的任务是利用计算机和VC开发环境编写一个简单画图程序,该程序的设计指标(即主要功能)有:①用鼠标拖动绘制圆、椭圆、矩形,线等基本图形;②能控制画笔的线宽和颜色;③能对图形进行颜色填充;④在鼠标移动的过程中能实时显示当前绘制的图形。
除了以上几点功能,我有另外添加了工具栏、铅笔、橡皮等功能来使程序更方便地让用户使用,简化了人机交互的过程。
2.设计思路首先是界面的问题,既然课设的题目是简单画图,那在建立工程的时候就要选择文档结构而不是以前做的基于对话框。
可选择单文档结构或多文档结构,但想到画图界面一般只有一个,从简洁的角度考虑,选择单文档结构。
而且用户界面在设计的时候要尽可能简单美观,一目了然,对相应功能有图标提示,使用户方便使用。
然后便是画图功能的具体实现。
分析课设要求,可以发现功能一要求的的椭圆、矩形、直线可以分别通过Ellipse();、Rectangle();、MoveTo();、LineTo();这四个函数来实现。
功能二控制画笔线宽和颜色可以给二者分别关联参数,通过改变线宽参数值来控制线宽,通过调用通用对话框改变颜色参数值来控制颜色。
功能三对图形进行颜色填充虽以前未接触过,但查阅资料后发现可以调用ExtFloodFill();并合理设定参数值来实现。
功能四的实时显示功能可以通过调用MouseMove();函数来实现。
这些功能需要建立菜单资源来表示各个功能选项,并建立相应的消息响应函数来进行实现。
另外,画图程序主要是通过鼠标来进行操作,所以要对鼠标消息的响应及处理函数多下功夫来思考和编写。
至于额外添加的功能,工具栏通过添加工具栏资源和关联相应菜单中画图功能ID实现;铅笔、橡皮的功能则是利用MouseMove();函数,在其中做了一些改动来实现。
图1 程序流程图MouseMove 函数2.1.程序流程图:鼠标左键弹起响应函数开始变量初始化(m_nDrawType ,m_clr 等)铅笔橡皮点直线椭圆线宽线型设置颜色选择填充响应函数m_Pen(m_Eraser)=TRUE 并将其他橡皮(铅响应函数 m_nDrawType =1/2/3/4;对应点、直线、矩矩形响应函数 创建相应对话框IDOK==1更改变量m_clr (m_nLineWidth ,m_nLineStyle)参数值响应函数m_Fill=TRUE 并将其他橡皮、铅笔等所关联变量置为鼠标左键按下 响应函数进行填充铅笔功能橡皮功能画点画直线画矩形画椭圆结束判断各参数值以确定功能3.软件设计3.1.设计步骤1)打开VS2010,选择新建项目,选中MFC应用程序,标题为CWN_Graphic;2)选择单文档结构,其他为默认值,点击完成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
M F C简单的绘图程序——王帅目录摘要 (2)关键字 (2)1 引言 (2)设计目的 ............................................................................................................... 错误!未定义书签。
2 功能说明 (2)2.1菜单栏.......................................................................................................... 错误!未定义书签。
2.1.1图形 (3)2.1.2画笔 (4)2.1.3画硬币 (4)2.2工具栏 (5)2.3状态栏 (5)3 功能的实现 (5)3.1 视图设计 (5)3.2 编辑资源 (6)3.3 编程思路及各个函数的实现 (7)(1)思路 (7)(2)代码的实现 (7)1.为基本形状创建一个基类 (8)2.基本形状类的创建 (8)2.1矩形类的创建及定义 (8)2.2圆形类的创建及定义 (10)2.3正五边形类的创建及定义 (11)2.4正三角形类的创建及定义 (14)2.5椭圆类的创建及定义 (16)2.6正四边形类的创建及的定义 (17)2.7正六边形类的创建及定义 (18)2.8直线类的创建及定义 (19)3.各基本形状类在CMyDraw2_0类中的调用和绘图的实现 (20)3.1矩形类的调用与与绘图的实现 (20)3.2圆形类的调用 (24)3.3正三角形类的调用 (25)3.4基本类型调用的剩余代码 (26)4.画笔的使用、颜色及大小的调整 (29)5.画硬币 (35)6.工具栏中的自定义控件 (38)7.状态栏中的显示 (39)4程序功能的测试 (41)5最后总结 (42)摘要:本绘图程序能够进行基本图形的绘画,如直线,圆,矩形,三角形等等,并且在此基础上添加了多边形的绘画,如正五边形等。
除此之外,还能够进行随手画,即用鼠标随意画线条。
为了更好的绘图,还添加了对画笔粗细的调整,以及对画笔颜色的调整,除了特定的颜色,颜色还可根据输入的RGB值随意更改。
还有一些老师的要求,加入了画硬币、显示硬币数目即鼠标坐标等信息。
本程序主要采用面向对象写法。
关键字:程序设计,MFC,绘图1.引言设计目的本绘图程序的设计不仅仅局限于老师课堂的要求,通过C++的编写实现绘图要求,我还想要在此基础上,加入自己的一些想法,想要更好地了解MFC,更好地去实现自己的想法。
2.功能说明2.1菜单栏2.1.1图形图形栏中包括直线、矩形、圆形、椭圆、多边形,多边形中包括正三角形、正四边形、正五边形、正六边形。
①选择直线,可用鼠标拖动画出一条直线②选择矩形,可用鼠标拖动画出矩形③选择圆形,可用鼠标拖动画出圆形④选择椭圆,可用鼠标拖动画出椭圆⑤选择正三角形,可用鼠标拖动画出正三角形⑥选择正四边形,可用鼠标拖动画出正方形⑦选择正五边形,可用鼠标拖动画出正五边形⑧选择正六边形,可用鼠标拖动画出正六边形(注:为了验证自己的想法以及想让画出的图形随意地变换方向,特意在正三角形一项中加入了旋转效果,使鼠标在拖动时能旋转三角形)2.1.2画笔画笔栏中包括颜色、大小及铅笔(1)颜色颜色中包括黑色、红色、绿色、蓝色、橙色、黄色、青色、紫色、粉色、自定义①选择黑色,画出的图形将为黑色②选择红色,画出的图形将为红色③选择绿色,画出的图形将为绿色④选择橙色,画出的图形将为橙色⑤选择黄色,画出的图形将为黄色⑥选择青色,画出的图形将为青色⑦选择紫色,画出的图形将为紫色⑧选择粉色,画出的图形将为粉色⑨选择自定义,可输入RGB值,画出的图形将显示输入的颜色(2)大小大小中包括1、2、3、4、5、6、7①选择1,画笔大小设为1②选择2,画笔大小设为2③选择3,画笔大小设为3④选择4,画笔大小设为4⑤选择5,画笔大小设为5⑥选择6,画笔大小设为6⑦选择7,画笔大小设为7(3)铅笔选中铅笔后,将可以用鼠标进行随意画线2.1.3画硬币画硬币中包括画、增加、减少、清除①选择画,将在客户端窗口中画出初始数量为10的硬币②选择增加,窗口中的硬币数目将增加1个③选择减少,窗口中的硬币数目将减少1个④选择清除,刷新窗口,将硬币消去2.2工具栏工具栏中除了原有的图标外,还加入了自定义的图标①选择,可用鼠标拖动画出一条直线②选择,可用鼠标拖动画出矩形③选择,可用鼠标拖动画出圆形④选择,可用鼠标拖动画出正三角形⑤选择,可用鼠标进行随手画⑥选择,可在窗口画出硬币后,将硬币数量+1⑦选择,可在窗口画出硬币后,将硬币数量-1⑧选择,可利用鼠标对所绘图形进行擦除,橡皮擦的大小与画笔大小相同2.3状态栏状态栏中除了原有的显示外,还加入了硬币的数量以及鼠标的x坐标和y坐标3.功能的实现3.1视图设计利用MFC 生成画图应用程序框架具体步骤如下:(1)执行VC程序,选择File|New命令,弹出New对话框.单击Projects标签,转到Projects选项卡,选择MFC AppWizard(exe)选项,然后在Project name文本框中输入MyDraw2_0(原来也做过一个,不过并没有以面向对象的写法去写,这个就当作是我的第二个版本),文本框是指项目的本地路径。
(2)由于本程序是实现画线,要在视图中完成,所以首先创建一个基于单文档的应用程序3.2编辑资源(1)利用ResourceView中的Menu编辑器在菜单栏添加菜单,该流程图如下3.2所示:图3.2(2)利用ResourceView中的ToolBar编辑器,在工具栏中添加自定义控件。
控件图案如下所示:3.3编程思路及各个函数的实现(1)思路:首先,画定义好的形状。
直线、矩形、圆形等等都属于基本的形状,那么我设定一个基类,称它为CShape,给这个基类定义一个画画的虚函数Draw(CDC *pDC),在这个类里面派生出各个需要的类,如CCircle类,并为这些派生类定义各自的属性及方法,重写基类的Draw函数。
当我需要用到这些类的时候,只需要在View类里创建指针,然后调用里面Draw方法。
由于是当鼠标拖动的时候画出所需的图形,需要添加鼠标响应函数,onLButtonDown(),onLButtonUp,以及onMouseMove()。
画画主要是在onMouseMove()里实现。
接着,是画笔的颜色和大小,本来是想单独创建一个画笔类,定义颜色和大小属性,使CCircle等派生类多继承,在继承一个画笔类,但尝试了几遍,发现在菜单里选择颜色时就会使程序停止运行,于是就放弃了。
重新构思之后,由于画图是在CMyDraw2_0里实现的,就直接在CMyDraw2_0中定义了颜色和大小的变量,这样也方便。
然后是画硬币。
并没有为这个创建单独的类,直接在CMyDraw2_0中的OnDraw()中画硬币,并且在CMyDraw2_0中添加了增加和减少硬币的方法。
工具栏中只要和为各个图标添加函数,作用和菜单栏中的图形一栏中对应即可。
最后还有硬币的数量和鼠标坐标放在状态栏中显示,下面开始进行函数代码的实现。
(2)代码的实现:1.为基本形状创建一个基类,命名为CShape。
在ClassViewz中右键点击MyDraw2_0 classes->new class,在弹出窗口的顶部下拉框中选择Generic Class,如图所示在头文件中添加虚函数Draw(CDC *pDC)public:CShape();virtual Draw(CDC* pDc)=0;//添加的虚函数virtual ~CShape();2.基本形状类的创建(注:以矩形、圆形、正五边形、正三边形为重点介绍)2.1矩形类的创建及定义创建一个矩形类,继承CShape类,如图在该类中重新定义画画函数Draw(),并添加带参数的构造函数,矩形的左上角,以及矩形的宽度和高度,代码如下:Public:CRectangle();Draw(CDC* pDC); //重新定义Draw函数CPoint point_LeftUp; //矩形的左上角坐标CRectangle(int x,int y,int w=0,int h=0);//带参数的构造函数,x表示左上角的横坐标,y表示左上角的纵坐标int width; //矩形的宽度int height; //矩形的高度virtual ~CRectangle();在无参数构造函数中初始化point_LeftUp的坐标和宽度以及高度的值,代码如下:CRectangle::CRectangle(){point_LeftUp.x=0; //左上角坐标x值设置为0point_LeftUp.y=0; //左上角坐标x值设置为0width=0; //矩形的宽度初始为0height=0; //矩形的高度初始为0}在带参数的构造函数中将值赋给point_LeftUp和宽度以及高度,代码如下:point_LeftUp.x=x; //将传入的x值赋给左上角坐标的x值point_LeftUp.y=y; //将传入的y值赋给左上角坐标的y值width=w; //将传入的w值赋给widthheight=h; //将传入的h值赋给height 重写Draw(CDC* pDC)函数,代码如下:CRectangle::Draw(CDC* pDC){pDC->Rectangle(point_LeftUp.x,point_LeftUp.y,point_LeftUp.x+width,point_LeftUp.y+height);//利用Rectangle()函数画出矩形,其中的值分别为矩形的左上角横坐标,左上角纵坐标,右下角横坐标,右下角纵坐标}在CMyDraw2_0View中引入矩形类的头文件:双击CMyDraw2_0View,在代码// MyDraw2_0View.h : interface of the CMyDraw2_0View class///////////////////////////////////////////////////////////////////////////////#if !defined(AFX_MYDRAW2_0VIEW_H__3809529C_6744_4AD2_80A4_D44683D0A5AF__INCLUDED_)#defineAFX_MYDRAW2_0VIEW_H__3809529C_6744_4AD2_80A4_D44683D0A5AF__INCLUDED_下添加如下代码:#include "Rectangle.h"并在View类中添加私有成员变量,创建矩形类的指针:右键点击CMyDraw2_0View,选择Add Member Variable,在弹出的对话框中如下输入:将在CMyDraw2_0View头文件中出现如下代码Private:CRectangle *rectangle;//定义指向矩形类的指针,为私有变量2.2圆形类的创建及定义创建一个圆形类,命名为CCircle,继承CShape类,在该类中添加公有成员变量,代码如下:public:CCircle();CCircle(int x,int y,int radius=0);//带参数的构造函数,其中,x表示圆心的x值,y表示圆心的y值,radius 表示圆的半径Draw(CDC* pDC); //重新定义Draw函数virtual ~CCircle();int Radius; //定义圆的半径CPoint center_point; //定义圆的中心点在无参数的构造函数中初始化变量值,代码如下:CCircle::CCircle(){center_point.x=0; //圆心的横坐标初始为0center_point.y=0; //圆心的纵坐标初始为0Radius=0; //圆的半径初始为0}在带参数的构造函数中将传入的值赋给各变量,代码如下:CCircle::CCircle(int x,int y,int radius){center_point.x=x; //将传入的x值赋给圆心的横坐标center_point.y=y; //将传入的y值赋给圆心的纵坐标Radius=radius; //将传入的radius值赋给圆的半径}重写定义的Draw函数,代码如下:CCircle::Draw(CDC* pDC){pDC->Ellipse(center_point.x-Radius,center_point.y-Radius,center_point.x+Radius,center_point.y+Radius);//利用Ellipse()函数进行圆的绘制,其中的值分别为圆的外接正方形的左上角横坐标、纵坐标,右下角横坐标、纵坐标}在CMyDraw2_0View中引入圆形类的头文件:#include "Circle.h"添加私有成员变量,创建圆形类的指针变量:CCircle *circle; //创建圆形类的指针,可以直接写在矩形类只针对下方2.3正五边形类的创建及定义创建一个正五边形类,命名为CPentangle,继承CShape类,在该类中添加公有成员变量,代码如下:public:CPentangle();CPentangle(int x,int y,int radius=0);//带参数的构造函数,x为外接圆圆心的横坐标,y为外接圆圆心的纵坐标,radius为外接圆的半径int Radius; //定义外接圆半径CPoint cP; //定义外接圆圆心Draw(CDC* pDC); //重新定义Draw函数virtual ~CPentangle();在无参数的构造函数中初始化各变量,代码如下:CPentangle::CPentangle(){cP.x=0; //圆心横坐标初始为0cP.y=0; //圆心纵坐标初始为0Radius=0; //外接圆半径初始为0}在带参数的构造函数中将传入的值赋给各变量,代码如下: CPentangle::CPentangle(int x,int y,int radius){cP.x=x; //将传入的x值赋给圆心的横坐标cP.y=y; //将传入的y值赋给圆心的纵坐标Radius=radius; //将传入的radius值赋给外接圆半径}下面重写的Draw函数与前两个不同,需要用到数学函数cos()以及sin(),由于两个函数用的是弧度制,还需引入数学变量PI,为了能够顺利的写入这些函数,需要在CPentangle类的客户端中引入数学类的头文件:双击ClassView中的CPentangle(),在出现的构造函数上方,在如下代码// Pentangle.cpp: implementation of the CPentangle class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "MyDraw2_0.h"#include "Pentangle.h"下添加数学类头文件:#include “math.h”再定义一个宏变量PI,添加如下代码:#define PI 3.1415926开始重写Draw(CDC* pDC)函数,代码如下:CPentangle::Draw(CDC* pDC){double rc=Radius*cos(36*PI/180); //将半径和36度的余弦值相乘并且赋给新的变量rcdouble rs=Radius*sin(36*PI/180); //将半径和36度的正弦值相乘并且赋给新的变量rsdouble Rc=Radius*cos(18*PI/180); //将半径和18度的余弦值相乘并且赋给新的变量Rcdouble Rs=Radius*sin(18*PI/180); //将半径和18度的正弦值相乘并且赋给新的变量RsPOINT pts[]={{cP.x+rs,cP.y+rc},{cP.x-rs,cP.y+rc},{cP.x-Rc,cP.y-R s},{cP.x,cP.y-Radius},{cP.x+Rc,cP.y-Rs}};//利用点类的数组将五个点储存在点数组pts 中pDC->Polygon(pts,5); //利用函数Polygon()进行多边形的绘画,其中pts 为储存的点,5为点的个数}下面对Draw 函数中各数据进行深层次的分析,表明它们的来历:如图所示:以外接圆圆心为坐标轴中心,设该点的坐标为(cP.x,cP.y);则右下角的坐标为cP.x+R*sin(36*PI/180),cP.y+R*cos(36*PI/180)按顺时针方向看,接下去的几个点的坐标分别为cP.x-R*sin(36*PI/180),cP.y+R*cos(36*PI/180)cP.x-R*cos(18*PI/180),cP.y-R*sin(18*PI/180)cP.x ,cP.y-RcP.x+R*cos(18*PI/180),cP.y-R*sin(18*PI/180)以上为正五边形5个点的来历,接下来在CMyDraw2_0View 中引入正五边形类的头文件: 。