mfc简单绘图程序_第1页
mfc简单绘图程序_第2页
mfc简单绘图程序_第3页
mfc简单绘图程序_第4页
mfc简单绘图程序_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、mfc简单绘图程序 -CAL-FENGHAI-(2020YEAR-YICAI)INGBIAN MFC 简 单 的 绘 图 程 王帅 摘要 目录 1引言 错误!未定义书签。 错误!未定义书签。 设计目的 2功能说明. 菜单栏 图形 画笔 画硬币 工具栏5 状态栏5 3功能的实现5 视图设计5 编辑资源6 编程思路及各个函数的实现 思路7 (2)代码的实现7 1 为基本形状创建一个基类8 2 基本形状类的创建8 矩形类的创建及定义8 圆形类的创建及定义10 正五边形类的创建及定义11 正三角形类的创建及定义14 椭圆类的创建及定义16 正四边形类的创建及的定义17 正六边形类的创建及定义18 直线

2、类的创建及定义19 3各基本形状类在CMyDraw2_0类中的调用和绘图的实现20 矩形类的调用与与绘图的实现20 圆形类的调用24 正三角形类的调用25 基本类型调用的剩余代码26 4画笔的使用、颜色及大小的调整29 5 画硬币35 6 工具栏中的自定义控件38 7 状态栏中的显示39 4程序功能的测试41 5最后总结42 摘要: 本绘图程序能够进行基本图形的绘画,如直线,圆,矩形,三 角形等等,并且在此基础上添加了多边形的绘画,如正五边形等。 除此之外,还能够进行随手画,即用鼠标随意画线条。为了更好的 绘图,还添加了对画笔粗细的调整,以及对画笔颜色的调整,除了 特定的颜色,颜色还可根据输入

3、的RGB值随意更改。还有一些老师 的要求,加入了画硬币、显示硬币数目即鼠标坐标等信息。本程序 主要采用面向对象写法。 关键字:程序设计,MFC,绘图 1引言 设计目的 木绘图程序的设计不仅仅局限于老师课堂的要求,通过C+的编 写实现绘图要求,我还想要在此基础上,加入自己的一些想法,想 要更好地了解MFC,更好地去实现自己的想法。 2功能说明 菜单栏 图形 图形栏中包括直线、矩形、圆形、椭圆、多边形,多边形中包括正三角 形、正四边形、正五边形、正六边形。 选择直线,可用鼠标拖动画出一条直线 选择矩形,可用鼠标拖动画出矩形 选择圆形,可用鼠标拖动画出圆形 选择椭圆,可用鼠标拖动画出椭圆 选择正三角

4、形,可用鼠标拖动画出正三角形 选择正四边形,可用鼠标拖动画出正方形 选择正五边形,可用鼠标拖动画出正五边形 选择正六边形,可用鼠标拖动画出正六边形 (注:为了验证自己的想法以及想让画出的图形随意地变换方向,特意在正三 角形一项中加入了旋转效果,使鼠标在拖动时能旋转三角形) 画笔 画笔栏中包括颜色、大小及铅笔 颜色 颜色中包括黑色、红色、绿色、蓝色、橙色、黃色、青色、紫色、粉色、 自定义 选择黑色,画岀的图形将为黑色 选择红色,画出的图形将为红色 选择绿色,画出的图形将为绿色 选择橙色,画出的图形将为橙色 选择黄色,画出的图形将为黃色 选择青色,画出的图形将为青色 选择紫色,画出的图形将为紫色

5、选择粉色,画出的图形将为粉色 选择自定义,可输入RGB值,画出的图形将显示输入的颜色 (2) 大小 大小中包括1、2、3、4、5、6、7 选择1,画笔大小设为1 选择2,画笔大小设为2 选择3,画笔大小设为3 选择4,画笔大小设为4 选择5,画笔大小设为5 选择6,画笔大小设为6 选择7,画笔大小设为7 (3) 铅笔 选中铅笔后,将可以用鼠标进行随意画线 画硬币 画硬币中包括画、增加、减少、清除 选择画,将在客户端窗口中画岀初始数量为10的硬币 选择增加,窗口中的硬币数目将增加1个 选择减少,窗口中的硬币数目将减少1个 选择清除,刷新窗口,将硬币消去 工具栏 工具栏中除了原有的图标外,还加入了

6、自定义的图标 选择/,可用鼠标拖动画出一条直线 选择口 L可用鼠标拖动画出矩形 选择,可用鼠标拖动画出圆形 选择仝,可用鼠标拖动画出正三角形 选择二,可用鼠标进行随手画 选择+,可在窗口画出硕币后,将硬币数量 选择一,可在窗口画出硕币后,将硬币数量j 选择匚1,可利用鼠标对所绘图形进行擦除,橡皮擦的大小与画笔大小相 同 状态栏 状态栏中除了原有的显示外,还加入了硬币的数量以及鼠标的X 坐标和y坐标 3.功能的实现 视图设计 利用MFC生成画图应用程序框架具体步骤如下: 执行VC程序,选择File I New命令,弹出New对话框单击Projects标 签,转到Projects选项卡,选择MFC

7、 AppWizard(exe)选项,然后在Project name文本框中输入MyDraw2_0 (原来也做过一个,不过并没有以面向对象的写法去 写,这个就当作是我的第二个版本),文本框是指项目的本地路径。 (2)由于本程序是实现画线,要在视图中完成,所以首先创建一个基于单文 档的应用程序 编辑资源 利用Resourceview中的Menu编辑器在菜单栏添加菜单,该流程 图如下所示: 利用Resourceview中的ToolBar编辑器,在工具栏中添加自定义控件。控件 图案如下所示: 编程思路及各个函数的实现 思路: 首先,画定义好的形状。直线、矩形、圆形等等都属于基本的形状,那么 我设定一个

8、基类,称它为CShape,给这个基类定义一个画画的虚函数 Draw(CDC*pDC),在这个类里面派生岀各个需要的类,如CCircle类,并为这些 派生类定义各自的属性及方法,重写基类的Draw函数。当我需要用到这些类 的时候,只需要在View类里创建指针,然后调用里面Draw方法。山于是当鼠 标拖动的时候画出所需的图形,需要添加鼠标响应函数, on LButt onDown(),on LButt on Up,以及 onMouseMove()o 画画主要是在 onMouseMove()里实现。 接着,是画笔的颜色和大小,本来是想单独创建一个画笔类,定义颜色和 大小属性,使CCircle等派生类

9、多继承,在继承一个画笔类,但尝试了儿遍,发 现在菜单里选择颜色时就会使程序停止运行,于是就放弃了。重新构思之后, 山于画图是在CMyDraw2_0里实现的,就直接在CMyDraw2_0中定义了颜色和 大小的变量,这样也方便。 然后是画硬币。并没有为这个创建单独的类,直接在CMyDraw2_0中的 OnDraw()中画硬币,并且在CMyDraw2_0中添加了增加和减少硕币石方法。 工具栏中只要和为各个图标添加函竅,作用和菜单栏中的图形一栏中对应 即可。 最后还有硬币的数量和鼠标坐标放在状态栏中显示,下面开始进行函数代码 的实现。 代码的实现: 1为基本形状创建一个基类,命名为CShapeo 在

10、ClassViewz 中右键点击 MyDraw2_0 classes-new class,在弹出窗1 的 顶部下拉框中选择Generic Class,如图所示 72: Description:Indicates when left mouse button is pressed |Generic Class 类信息 名称E:|CShape| 文件名:Shapel .cpp 在头文件中添加虚函数Draw(CDC *pDC) public: CShapef); virtual Draw(CDC* pDc)=O; CE 新夥 类的类型Hl:|Generic Class耳 类信息 名称(E;|CRec

11、tangle 文件名:Rectangle!.cpp 基类冋: 更I Derived From As FlCShape public |CRectanlge* 变宦名称NJ: 60 Message Maps Member Variables | Automation | ActiveX Events | Class Info | Project: Class name: Add Class. |MyDraw2_0 | |cMyDraw2_0View zl D:V AMyDraw2_0View.h, D:V- MyDrawZOView.cpp Object IDs: Add Function De

12、lete Function ID_ADD_COIN ID_APP_ABOLJT IDAPPEXIT ID_DRAW_CIRCLE ID_DRAW_DELTA IDFRAW一 LINE |V/M LBUTTONDBLCLK WM LDUTTONDOWN WM LBUTTONUP VA1MOUSEMOVE WM MOUSEWHEEL WM MOVE WM PAINT Messages: Edit Code Member functions: ON ID DRAW LINE:COMMAND W OnDrawLinc W OiiDrawRcctangle ONJD.DRAW.RECTANGLECOMM

13、AND V OnEndPrinting W OnErascr a ON ID ERASEFtCOMMAND OnLDuttonDown ON WM LBUTTONDOWN vi rv iiasswizara Message Maps Member Variables | Automation | ActiveX Events Class Info | Project |MyDraw2l03 Class name: |CMyDraw2l0View Add Class. D:t AMyDraw2_0View.h. D:t .MyDraw2_0View.cpp Add Function Object

14、 IDs: ID_ME N U_GRAPH_LI N E I 匸 MENU【GRAPH【POLYGON_DELTA l”MENU_GRAPH_POLYGON_PENl ID_MENU-GRAPH_POLYGON_QUADP ID_MENU_GIV、PH_POLYGON_ ID MENU PEN COLOR CUSTOM Messages: COMMAND UPDATECOMMANDUI Delete Functinn Edit Code Member functions: REGU* W OnAddCoin V OnBeginPrinting V OnDraw W OnDrawCircle W

15、 OnDrawDcIta ON ID ADD COIN:COMMAND ON_ID_DRAW_CIRCLE:COMMAND ON_ID_DRAW_D ELTAzCOMMAND Description: 确定取消 OK Cancel Adding a Class IDD_DIALOG1 is a new resource Since it is a dialog resource you probably want to create a new class for it You can also select an existing class e Create a new class Sel

16、ect an existing class New ClassCE etEventMask() etEventMask() etEventMask() / TODO: Add your control notification handler code here CString strB; GetDlgltemText(IDC_COLOR_B,strB); B=atof(strB); 通过以上代码,就可以获取对话框中输入的值了,就可以在 View类中使用它们: 为View类添加私有成员变量: int R; int G; int B; 在自定义的响应函数中添加如下代码: void CMyDraw

17、2_0View:OnMenuPenColorCustom() _ / TODO: Add your comma nd han dler code here CDialogColor DlgColor;创建 CDialogColor 的弓| 用 ();调用DoModal()函数弹出对话框 R=;将 CDialogColor 中的 R 赋给 View 类的 R G=;将 CDialogColor 中的 G 赋给 View 类的 G B=;将 CDialogColor 中的 B 赋给 View 类的 B pen_color=RGB(R,G,B);/将传入的值作为 RGB 值 2.画硬币 画硬币菜单下

18、有四个选项:画、增加、减少、清除 显然,是在点击画之后才开始在窗口上显示画出的硬币,由 于画硬币的代码直接写在View类的OnDraw中,所以需要一个标 记,判断是否需要画: 为View类添加私有成员变量: bool draw; 在View类构造函数中初始化该变量: draw=false; 在画的响应函数中将其标记为true: draw=true; 这样,在OnDraw函数中就会根据draw的值判断是否开始画硬 币。 画硬币还需要知道硬币的数量,而且,在画的时候,使用椭圆 代替硬币,变化的只是椭圆的两个纵坐标,所以,还需要为View 类添加三个私有成员变量: int CoinsNumber;硬

19、币的数量 int coinjy;/椭圆左上角的纵坐标 int coin_ry;/椭圆右上角的纵坐标 在构造函蛟中初始硬币数量: CoinsNumber=10; 在OnDraw函数中,先定义第一个硬币的左、右纵坐标: coin_ly=300; coin_ry=330; 然后判断是否开始画硬币,当条件为真时开始画硬币,代码如下: 讦(draw) for(int i=0;iEllipse(100zcoin _ly,300,coin_ry);/ 画出椭圆 coinJy-=10;/循环一次就将左上角的 纵坐标-10,表示下一个椭圆的位置上移10 coin_ry-=10; 循环一次就将右下角的 纵坐标-1

20、0,表示下一个椭圆的位置上移10 此时,如果在菜单里选择画选项,就需要调用onDrawO函数,在响应函数中 添加如下代码: CDC*pDC=GetDC(); OnDraw(pDC); 在此基础上,增加对硬币数量的增减操作: 很明显,增减硬币操作是在画硬币之后才会执行,所以需要一个标记来判断是 否已经画出硬币: 为View类添加一个私有成员变量: bool menu_draw_coin;用来标记菜单里画选项是否执 行 在View类构造函数里初始化该变量: men u_draw_coin=false; 当选择画时,将该变量标记为true: men u_draw_coi n二 true; 已经有了标

21、记后,只需判断是否已经执行画命令,再对硬币的数量进行增 减,代码如下: void CMyDraw2_0View:OnMenuDrawcoinAdd() _ if(menu_draw_coin)/判断是否已经执行过画命令 draw=true;/将 draw 标记为 true,以便 OnDraw函数中的画硕币顺利执行 CDC *pDC=GetDC();/打开图形设备接口 / TODO: Add your command handler code here 讦(CoinsNumberUpdateAIIViews(NULL);/ 刷新 视图 ReleaseDC(pDC);/ 释放 void CMyDr

22、aw2_0View:OnMenuDrawcoinReduce。 if(menu_draw_coin)/判断是否已经执行过画命令 draw=true;将 draw 标记为 true,以便 OnDraw函数中的画硕币顺利执行 CDC *pDC=GetDC();打开图形设备接口 / TODO: Add your comma nd han dler code here if(CoinsNumber0)/硬币数量应在大于0时才 能减少 CoinsNumber-;/ 将硬币数量-1 GetDocument()-UpdateAIIViews(NULL);/ 刷新 视图 ReleaseDC(pDC);/ 释放

23、 最后的问题就是,画岀的硬币会一直存在视图内,在清除选项的响应函数中 添加如下代码:_ draw=false;/将draw重新标记为false,表示停止画硕 币 menu_draw_coin=false;/将改变量重新标记为false,表示 增减操作停止 GetDocument()-UpdateAIIViews(NULL);/ 刷新视图 以上就完成了画硬币的相应操作。 3工具栏中的自定义控件 如果在工具栏中有控件,可以直接点击后执行相应的操作无疑 会更方便,以直线控件为例: 双击ResourceView的Toolbar,出现如下界面: 点击上方工具栏图标所在的最右侧空图标,在该空白图标中画出直

24、线,作为直 线的图标,双击该图笹弹出对话框,按下图才 工具属性画 按CE+W打开类向导,为该ID添加响应函数,在该函数中添加代码: void CMyDraw2_OView:OnDrawLine() _ / TODO: Add your comma nd handler code here ShapeType=l; 与原先调用直线类画直线同理 接下来给岀已添加的控件对应的代码: void CMyDraw2_OView:OnDrawRectangle() _ / TODO: Add your comma nd han dler code here ShapeType=2;/与原先调用矩形类画矩形同

25、理 void CMyDraw2_OView:OnDrawCircle() / TODO: Add your comma nd han dler code here ShapeType=3; 与原先调用圆形类画圆形同理 void CMyDraw2_OView:OnDrawDelta() _ / TODO: Add your command handler code here ShapeType=5; 与原先调用正三角形类画正三角形同理 void CMyDraw2_OView:OnAddCoin() / TODO: Add your comma nd han dler code here OnMe

26、nuDrawcoinAdd();/直接调用硬币增加的函数 void CMyDraw2_OView:OnReduceCoin() _ / TODO: Add your comma nd handler code here OnMenuDrawcoinReduce();/直接调用硬币减少的函数 void CMyDraw2_OView:OnEraser() 橡皮擦 _ / TODO: Add your comma nd han dler code here pen_color=RGB(255,255,255);/ 将颜色设置为口色 ShapeType=-l; 使用随手画 注:做橡皮擦比较偷懒,所以需

27、要用户自己重新选择画笔颜色 4 状态栏中的显示 以鼠标坐标的显示为例: 双击ResourceView中的StringTable出现如下界面: IPI值I ID APP EXir沁3 ID NEaPANErszwo ID PREYPANE| 57$81 怡NOICATOR_EXT59136 IDNOICAIOR_CAPS59137 IDNDICATOR_NUM5913B IDNOICAIOR.SCRL59139 ID INOICAIOR_OVRS9140 NOIATOR_RE591 卅 ID_WW_100LBAR(55332 ID.VgW_STATVS_BAR59J93 Af=X_IDS_SCS

28、IZES1164 AFX_IDS_SCMOES1185 AFXJZSCMINIMIZES1186 AFXllDSlSCMAXJMIZE$1187 (III AFX_IDS_SCTA AFX_IOS_PRV1EWJ ID_liICATOR_CO*i IDNOICA1OR.MO IDNDICA1OR_MO 厂一一一 iim ci w $145 S1447 耳云殴海工且栏A且尬工具栏 塁厉唾興歩态栏S丘復农怎栏 刃士小 刃艾窗口位u 将宙口缩小成也轿 把留口敦大到最才尺才 切悅到下一个交档宙口 切悅到尢罚的文档窗口 关闭涪动的商口目抿示保谆历有文:档 荒式V趣常预阅 AFX_IDS_SCNfXTWl

29、NDO、1168 AfX_IDS_SCPRfVWINO(n (1189 AFX_IDS_SCCLOSEillSO 双击最下方的空tl处,弹岀对话框,按下图操作: 其中 ID 为 IDDICATOR_MOUSE_XPOSITION,将该 ID 写入到 CMainFrame 的 app 中: static UINT indicators!)= ID_SEPARATOR/ / status line indicator IDJNDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, IDNDICATOR_MOUSE_XPOSITION, 该 ID 为新添加的 ID ; 山于鼠标坐标随着鼠标移动而变动,所以在OnMouseMove()中添加如下代 码: CString strXPosition;定义 String 变量 strPosition CStatusBar* pStatus=(CStatusBar* )AfxGetApp()-m_pMainWncb GetDe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论