C++课程设计MFC_第1页
C++课程设计MFC_第2页
C++课程设计MFC_第3页
C++课程设计MFC_第4页
C++课程设计MFC_第5页
已阅读5页,还剩143页未读 继续免费阅读

下载本文档

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

文档简介

1/64,C+课程设计,内容及要求,2,主要内容,课程设计基本要求Windows编程基础什么是C+的MFC什么是MFC编程MFC应用程序的开发流程单文档【ClassView】面板登录对话框与单文档视图联接单文档中菜单项与对话框联接实例介绍,3,一、课程设计基本要求,自学MFC(2学时)知识扩充C+:了解并掌握MFC程序结构、消息映射机制、MFC类库中的常用类(对话框、各种常用控件)。软件开发的基本知识结合设计任务清楚软件开发的基本流程、各个阶段的目标和主要工作。上机调试程序(30学时)其他(14学时)程序调试的基本方法和论文撰写要求(2学时)掌握调试程序的方法与技巧。清楚论文组织结构、格式编排等相关知识学生资料查阅与自主学习(2学时)代码编写(10学时),4,二、Windows编程基础,Windows编程就是基于Windows的应用程序。2种重要的Windows应用程序基于对话框的应用程序基于文档/视图结构的应用程序主要特点具有标准的图形用户界面具有与硬件无关的特性采用“消息传递,事件驱动”的运行机制,即根据Windows发送的消息来处理用户的输入编写Windows应用程序的主要方法(2种)使用Windows提供的应用程序接口(API)函数使用Microsoft提供的微软基础类(MFC),5,三、什么是C+的MFC,MFC(MicrosoftFoundationClassLibrary,基础类库)是微软提供的用来编写Windows应用程序的C+类库;封装了API(Windows的接口函数),是WinAPI与C+的结合。MFC大约有200多个类,封装了Windows的大部分编程对象以及与它们有关的操作。即它由几百个执行文件和源代码文件组成。注意C+和VC+的区别C+是一种程序设计语言,是一种大家都承认的软件编制的通用规范,即C+是一套语法规则的名字,类似汉语,英语。VC+是一个软件IDE(编译、编辑、调试)集成开发环境MFC是一个非外挂式的软件包,类库,MFC类是微软为VC+专配的。,6,四、什么是MFC编程,MFC编程指的就是使用VC+进行开发,并且是在使用VC+提供的各种向导的情况下的MFC编程。在VC+中可以创建3类典型的Windows应用程序基于对话框的应用程序单文档界面(SDI)应用程序多文档界面(MDI)应用程序,文档/视图文档对象:用来保存数据。视图对象:用来显示和编辑数据。,7,五、MFC应用程序的开发流程,应用程序编程的基本步骤:(1)根据应用程序的特性在MFCAppWizardexe应用程序中选择合适的应用程序框架。(2)利用资源编辑器编辑资源,如菜单等。(3)利用类向导(ClassWizard)或手工添加类、成员变量、成员函数声明。(4)编写具体的成员函数代码。(5)编译、链接程序检查程序中是否存在语法错误。(6)调试应用程序。,8,六、单文档【ClassView】面板,CAboutDlg(关于对话框类)管理关于对话框。CFrameWnd(框架窗口类)CWxling_27App(应用程序类)用来处理消息。CWxling_27Doc(文档类)MFC中的数据是存储在类文档中。文档类负责管理和维护数据本身。CWxling_27View(视图类)结果的显示是在视图类中。视图类负责处理用户鼠标和键盘的操作。,9,七、登录对话框与单文档视图联接,新建单文档工程:TEXT(注意此名由设计者自己任取);在ResourceView,单击InsertDialog,插入一对话框IDD_DIALOG1(默认ID号);右键选中新建的对话框,利用类向导建立一个新类Createanewclass,名称为:Cdlg_login;在MainFrm.cpp文件的前面,语句#include“MainFrm.h”的后面添加新类的头文件:#includedlg_login.h在FileView中点击sourcefiles,双击MainFrm.cpp。找到:CMainFrame:OnCreate(LPCREATESTRUCTlpCreateStruct),这是窗体框架创建函数。在该函数的后面(在return0;的前面)加入语句(注意大小写):Cdlg_logindlg;/定义一个登录对话框对象dlgdlg.DoModal();/让对话框对象以有模式形式显示出来此时对话框与单文档联接完成。下载“格式工厂3.011”将自己的照片转换成BMP格式,通过插入Bitmap命令,将照片引入至资源中,并添加至对话框中。,10,七续、登录对话框退出按钮代码,/确定按钮voidCDlg_login:OnOK()/TODO:Addextravalidationherethis-UpdateData(true);if(this-m_name=wxl,/取消按钮voidCDlg_login:OnCancel()/TODO:AddextracleanuphereExitProcess(0);/退出,11,八、单文档中菜单项与对话框联接,新建单文档工程:Ys1(注意此名由设计者自己任取);在ResourceView,单击InsertDialog,插入一对话框IDD_DIALOG1(默认ID号);右键选中新建的对话框,利用类向导建立一个新类Createanewclass,名称为:Cdlg_jc(自己命名),如右图1所示;在/Ys1View.cpp:文件中语句#includeYs1View.h的后面添加新类的头文件:#includedlg_jc.h编辑主菜单如图2所示:在主菜下通过“建立类向导”命令,从“Classname”组合框中选择CYs1View,如图3,4所示,并在函数OnJc()编写代码如下:voidCYs1View:OnJc()/TODO:AddyourcommandhandlercodehereCdlg_jcjc;/定义一个求阶层对话框对象jcjc.DoModal();/让对话框对象以有模式形式显示出来此时单文档菜单项与对话框联接完成。,12,1.求阶层按钮的代码,使用MFC进行程序设计时,如输出结果是单值,可用以下代码作为模板:voidCdlg_jc:OnOK()/TODO:AddextravalidationhereUpdateData(TRUE);/更新控件值doublei,jsz=1.0;for(i=1;iTextOut(x,y,s);/在指定位置输出文本x=x+30;,2.求素数按钮的代码,voidCdlg_zss:OnOK()/TODO:AddextravalidationhereUpdateData(TRUE);/更新控件值CDC*pDC=GetDC();/获取视图初始的客户区DC/DC表示设备环境inta=m_szqz;intb=m_szzz;inti,j,n=0;intx=70,y=220;CStrings;if(bMoveTo(100,100);pDC-LineTo(300,500);,16,4.单文档菜单项中画矩形代码,菜单项“画矩形”按钮代码:voidCWxling_28View:OnHjx()/TODO:AddyourcommandhandlercodehereCClientDCdc(this);CPenpen;/定义画笔/创建红色3号粗细实线画笔pen.CreatePen(PS_SOLID,3,RGB(255,0,0);CPen*oldpen=dc.SelectObject(/画矩形,17,5.单文档菜单项中画椭圆代码,菜单项“画椭圆”按钮代码:voidCWxling_28View:OnHty()/TODO:AddyourcommandhandlercodehereCClientDCdc(this);CPenpen;/设置画笔pen.CreatePen(PS_SOLID,3,RGB(0,255,0);CPen*oldpen=dc.SelectObject(/画椭圆/*(intx1,inty1,intx2,inty2)(x1,y1)和(x2,y2)表示所画椭圆外切矩形的左上角和右下角坐标*/,18,6.单文档菜单项中画sin曲线代码,在/Wxl_30View.cpp中加入头文件:#includemath.h“菜单项“画sin曲线”按钮代码:voidCWxl_30View:OnSin()/TODO:AddyourcommandhandlercodehereCClientDCdc(this);CRectrect;/定义矩形对象GetClientRect(rect);intx0=rect.Width()/2;inty0=rect.Height()/2;dc.MoveTo(20,y0);dc.LineTo(rect.Width()-20,y0);dc.MoveTo(x0,20);dc.LineTo(x0,rect.Height()-20);doublesetp=3.14159/100;for(inti=-200;imessage=WM_KEYDOWN)/键盘消息if(pMsg-wParam=VK_ESCAPE)/键盘上的Esc键returnTRUE;if(pMsg-wParam=VK_RETURN)/键盘上的回车键returnTRUE;returnCDialog:PreTranslateMessage(pMsg);,23,8.常见问题解决方法,建好MFC之后(基于对话框的),然后点击Insert-NewClass弹出对话框之后,ClassType:MFCClass在BaseClass:CRecordset类,点击Ok的时候,会弹出要你添加数据库的对话框你就可以添加了。(9)如何为MFC应用程序添加ODBC功能?(1)在文件Stdafx.h文件末尾添加下面一行:#include/MFCODBCdatabaseclasses(2)在文本模式下编辑RC文件(利用File-OpenAstext方式)在下面的程序行(共有两处)#includel.chsafxprint.rc/printing/printpreviewresources添加下一行:#includel.chsafxdb.rc/Databaseresources,24,9.特殊效果,(1)如何给MFC单文档添加背景?为CTestView类添加一个变量CBrushm_brushBackground;/定义画刷用于画背景在CTestView的构造函数中加入如下代码CBitmapbmp;bmp.LoadBitmap(IDB_BITMAP1);/加载位图m_brushBackground.CreatePatternBrush(编译运行该程序!,25,9.特殊效果,(2)在工程调用其他可执行的文件(.EXE)在w1View.cpp:中加入头文件:#includewindows.h在编辑好的菜单项中编写代码如下voidCW1View:OnWord()/TODO:AddyourcommandhandlercodehereWinExec(CLOCKYS.exe,NULL);/调用可执行文件注意:将可执行文件拷贝至本工程所在的文件夹下,否则要获取文件的路径。若要打开其他类型的文件,见本片的下面的备注。,26,9.特殊效果,(3)在工程调用其他任意文件菜单项按钮代码voidCW12View:OnYy()/TODO:AddyourcommandhandlercodehereCStringpath;/返回文件所在的路径,含该文件名GetModuleFileName(NULL,/要获取文件名的模块句柄(见备注),null表示当前模块path.GetBufferSetLength(MAX_PATH+1),/存放取得的文件名MAX_PATH/存放取得的文件名参数的长度);path.ReleaseBuffer();/字符串的缓冲区长度锁定解除intpos=path.ReverseFind();/从后向前查找path=path.Left(pos)path=path.Left(pos);/取左,参数为字符串的个数/MessageBox(path);/调试程序时用来显示查找到的当前运行程序所在目录ShellExecute(NULL,open,path+2013年C+课程设计任务书wxl.doc,NULL,NULL,SW_SHOWNORMAL);,27,9.特殊效果,(4)仅修改工程中某个对话框的图标对对应的对话框添加初始化函数OnInitDialog(),并添加以下代码:BOOLCdlg_login:OnInitDialog()CDialog:OnInitDialog();/TODO:AddextrainitializationhereHICONm_hIcon;/IDR_ICON1为图标资源名m_hIcon=AfxGetApp()-LoadIcon(IDI_ICON1);SetIcon(m_hIcon,TRUE);/SetbigiconSetIcon(m_hIcon,FALSE);/SetsmalliconreturnTRUE;/returnTRUEunlessyousetthefocustoacontrol/EXCEPTION:OCXPropertyPagesshouldreturnFALSE,28,9.特殊效果,如何去掉单文档界面中主框架的“无标题”?修改IDR_MAINFRAME字符串资源中第2个参数(共有7个参数),分别以n结束,即如下格式:nnnnnnn例,将主框架标题改为”我的应用程序”,29,在程序中使用对话框,(4)用鼠标将新添加的菜单项拖到“查看”和“帮助”菜单项之间,结果如图所示。,菜单项“对话框”拖放后的位置(5)选择“查看”“建立类向导”菜单命令或直接按Ctrl+W快捷键,则出现MFCClassWizard对话框,该对话框会自动切换到MessageMaps页面。(6)从“Classname”组合框中选择CMainFrame,在ObjectIds列表中选择ID_TEST_DLG,然后在Messages框中选择COMMAND消息。,30,在程序中使用对话框,(7)单击AddFunction按钮或双击COMMAND消息,出现“AddMemberFunction”对话框以输入成员函数的名称。系统默认的函数名为OnTestDlg,如图所示。该函数是对菜单项ID_TEST_DLG的映射,也就是说,当在应用程序运行时,用户选择“对话框”,则该函数OnTestDlg被调用,执行函数中的代码。,31,在程序中使用对话框,单击OK按钮,在ClassWizard的“Memberfunctions”列表中将列出新增加的成员函数。选择此函数,单击EditCode按钮(或直接在函数名双击鼠标),在此成员函数中添加下列代码:voidCMainFrame:OnTestDlg()CFirstDlgdlg;/定义对话框类对象dlg.DoModal();/显示对话框代码中,DoModal是CDialog基类成员函数,它是用来显示和终止模式对话框。,32,在程序中使用对话框,在OnTestDlg函数的实现文件MainFrm.cpp的前面添加CFirstDlg类的头文件包含,即:,#includeEx_SDI.h#includeMainFrm.h#includeFirstDlg.h“,(10)编译并运行。在应用程序菜单上,选择“测试”“对话框”菜单项,将出现如图的对话框,这个对话框就是刚才添加的对话框。,33,几种常见的几何图形绘制。,利用MFCAppWizard建立一个SDI应用程序,在OnDraw()函数中添加如下程序代码:voidCMyGraphView:OnDraw(CDC*pDC)CTexthtDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedataherefor(intxPos=20;xPosSetPixel(xPos,30,RGB(0,0,0);/绘制像素点POINTpolylpt5=10,100,50,60,120,80,80,150,30,130;pDC-Polyline(polylpt,5);/绘制4条折线POINTpolybpt4=150,160,220,60,300,180,330,20;pDC-PolyBezier(polybpt,4);/绘制贝塞尔曲线CBrush*pBrhOld;pBrhOld=(CBrush*)pDC-SelectStockObject(LTGRAY_BRUSH);/使用浅灰色堆画刷pDC-RoundRect(400,30,550,100,20,20);/绘制圆角矩形pDC-Arc(20,200,200,300,200,250,20,200);/绘制椭圆弧pDC-Pie(220,200,400,380,380,270,240,220);/绘制扇形pDC-Chord(420,120,540,240,520,160,420,180);/绘制弦形POINTpolygpt5=450,200,530,220,560,300,480,320,430,280;pDC-Polygon(polygpt,5);/绘制五边形pDC-SelectObject(pBrhOld);/恢复系统默认的画刷,34,绘制效果,35/64,九、实例介绍,实例1静态控件的使用实例2编辑框应用实例3单选钮应用程序实例4简易时钟应用程序实例5计算器应用程序实例6调用自定义对话框实例7数据库编程实例,返回目录,36,实例1静态控件的使用,创建步骤:建立基于对话框的MFC应用程序框架;设置对话放置控件;在菜单或工具栏的空白处,单击右键,弹出控件工具栏,再选择所需控件;设置控件属性;调试程序,37,步骤1:建立基于对话框应用程序框架,(1)创建工程:TEST1,38,步骤2、3:放置控件;调试程序,(1)删除现有控件(2)设置对话框标题利用“属性”设置(3)添加组框设置属性(4)添加静态文本框设置属性(5)添加图片单击“插入/资源”命令,通过菜单引入:(位图(BMP或DIB)、图标(Icon)、图元文件(wMF)图片控件属性对对话框中的类型、图像进行设置,返回实例,39,特殊效果对话框中设置静态文本框字体及颜色,操作步骤:1.添加对话框类声明中字体和颜色变量classCDHK2013Dlg:publicCDialog/Constructionpublic:CFontm_myFont;/字体对象COLORREFm_myColor;/颜色对象.2.在对话框初始化函数OnInitDialog()中对字体和颜色进行初始化m_myFont.CreatePointFont(150,_T(“华文彩云”);/150是字体大小m_myColor=RGB(255,0,255);,40,续上:,3.为对话框类添加WM_CTLCOLOR消息响应函数,并在其消息响应函数OnCtlColor()中添加代码/消息响应函数实现HBRUSHCDHK2013Dlg:OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)HBRUSHhbr=CDialog:OnCtlColor(pDC,pWnd,nCtlColor);/TODO:ChangeanyattributesoftheDChere(在此更改DC的任何属性)if(pWnd-GetDlgCtrlID()=IDC_STATIC_1)pDC-SelectObject(,41,实例2编辑框应用,创建步骤:建立基于对话框的MFC应用程序框架;设置对话放置控件;设置控件属性;为控件连接变量,即为控件命名;添加并且编写消息处理函数;调试程序。,42,步骤1,2:建立框架、添加控件,(1)创建工程:TEST2(2)添加控件,并设置控件相关属性,43,步骤3:连接变量,(1)单击“建立类向导”命令,启动类向导;(2)选择“成员变量”选取项卡,连接变量;(3)结果如右图所示,44,BOOLCTEST2Dlg:OnInitDialog()CDialog:OnInitDialog();/AddAbout.menuitemtosystemmenu.m_avg=0.0;UpdateData(FALSE);/省略,步骤4:进行消息映射,(1)初始化对话框(是程序运行时的开始状态的设定)进入ClassWiZard(类向导),MessageMaps,在ObjectIDs里选择要添加OnInitDialog()函数的对话框类,在Messages里选择WM_INITDIALOG,单击AddFunction(增加函数),此时对话框类就新增了一个函数是OnInitDialog()。(2)编辑初始化代码:,45,voidCTEST2Dlg:OnJs()/TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);/更新控件值doubleavg=double(m_sx+m_yw+m_yy)/3.0;m_avg.Format(%6.2f,avg);UpdateData(FALSE);/控件值更新编辑框显示,步骤5:编写代码_对“计算平均分”按钮,(1)双击“计算平均分”按钮,为IDC_JS添加BN_CLICKED消息映射:(2)编写代码。,46,步骤6:编写代码_对“退出”按钮,(1)双击“退出”按钮,为IDC_OK添加BN_CLICKED消息映射:(2)编写代码。,voidCTEST2Dlg:OnOk()/TODO:AddyourcontrolnotificationhandlercodehereOnOK();,47,步骤7:调试程序_运行,注意:对话框中平均分显示部分是在设置属性时,选择了“扩展样式”选项卡中的“客户边缘”选项的效果。,返回实例,48,实例3单选钮应用程序,设计如右图所示的程序。基本步骤:创建工程TESTp246,并进行界面设计;为编辑框连接到CString类型的添加成员变量m_xm,其余控件不需连接;为控件编辑ID4.对单选钮编写初始化函数代码5.对对话框的“确定”按钮编写代码,49,步骤13:建立框架,连接变量,编辑ID,注意对组框1中2个单选按钮,在设置第一个按钮(男)的属性时,需选定“组”选项,表示此组默认第1个按钮;同理对组框2中3个单选按钮,在设置第一个按钮(教授)的属性时,需选定“组”选项,表示此组默认第1个按钮;组框本身的属性不要选中“组”选项。,50,步骤4:单选钮初始化函数代码,BOOLCTESTp246Dlg:OnInitDialog()CDialog:OnInitDialog();CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);CheckRadioButton(IDC_RADIO3,IDC_RADIO5,IDC_RADIO3);/AddAbout.menuitemtosystemmenu.,表示为默认按钮,51,步骤5:对话框的“确定”按钮代码,voidCTESTp246Dlg:OnButton1()/TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);CStrings;s=s+m_xm;if(IsDlgButtonChecked(IDC_RADIO1)s=s+男;elses=s+女;if(IsDlgButtonChecked(IDC_RADIO3)s=s+教授;elseif(IsDlgButtonChecked(IDC_RADIO4)s=s+副教授;elses=s+讲师;AfxMessageBox(s);,返回实例,52,实例4简易时钟程序基于对话框,基本步骤:创建工程(基于基本对话框的)CLOCKYS(时钟演示)添加新类CClockEx,实现时钟控件类。添加消息响应及函数,来建立时钟控件的轮廓。时钟设计时钟元素创建时钟基类CClockElement添加时针类、分针类、秒针类编译执行。步骤1:创建工程CLOCKYS,返回实例,53,步骤2:创建一个新类CClockEx,从CStatic(静态控件)类派生出类CClockEx来实现时钟控件类,这样,就可以继承MFC静态控件的很多已经具备的功能和特点.,54,步骤3:添加消息响应建立时钟控件的轮廓,时钟控件的轮廓单击“查看建立类向导”调出ClassWizard,在classname中选择刚建立的新类CClockEx,进行如下工作:,重载虚函数PreSubClassWindow对时钟控件的基本初始化工作将在该函数中进行。添加WM_PAINT消息响应用于完成时钟的绘制工作。添加WM_SIZE消息响应以便设计的时钟控件能自动适应其大小的变化。添加WM_TIMER的消息响应定时刷新时钟控件让它走动。此时,时钟控件的轮廓已建好。效果如图所示。,55,步骤4:时钟设计时钟元素,时钟绘制的具体实现。时钟大致由:时钟背景、时针、分针、秒针4个部分构成。这4个部分可看作4个不同的对象,可以考虑建立类来分别实现。CClockBackground(背景)CClockHourHand(时针)CClockMinHand(分针)CClockSecHand(秒针)这4个类有它们的共同点:都有自己的绘图函数;都有自己的绘图颜色;都应有颜色设置函数;都有绘图区域和区域设置函数等等。因此,可以为它们的共性建立一个基类,命名为:CClockElement(时钟元素)。,56,步骤4续:创建时钟基类CClockElement,先建各个组成类的基类:CClockElement方法:右键单击ClassView的工程选择NewClass;在ClassType里面选择GenenricClass,类;CClockElement不需要从其它类派生,所以BaseClass可以不填,效果如右图所示。,57,步骤4续:创建时钟基类CClockElement代码,对类CClockElement的源代码进行编写。添加头文件#include因后面的绘图中需要用到sin和cos这两个数学计算公式。为后面计算使用,定义数学常量PI(3.1415926535)。在基类中定义绘图区域变量时钟的每个组成部分都有绘图区域区域,可定义颜色变量。为了是颜色不显得单调,这里为每个控件设置两种颜色(如果想使程序更加绚丽,可以设置更多颜色)。增加接口函数这些变量需增加接口函数来进行访问。每个组成部分都应该有的Draw(绘图)函数也需在基类中定义,但是,该函数对于基类来说是无需函数实现的,因此可定义为纯虚函数。,58,步骤4续:创建时钟基类CClockElement代码,/ClockElement.h:interfacefortheCClockElementclass.CClockElement的实现的头文件代码如下:#if!defined(AFX_CLOCKELEMENT_H_08A9DFB3_95C0_4D70_9BC0_96D3BACAB74A_INCLUDED_)#defineAFX_CLOCKELEMENT_H_08A9DFB3_95C0_4D70_9BC0_96D3BACAB74A_INCLUDED_#if_MSC_VER1000#pragmaonce#endif/_MSC_VER1000#include#definePI3.1415926535classCClockElementpublic:voidSetColor(COLORREFcrMain,COLORREFcrOther);/设置颜色voidSetTime(constCTime,59,CClockElement的实现的源文件关键代码如下:,/ClockElement.cpp:CClockElement:CClockElement()/时钟基类构造函数m_nRadius=0;/时钟半径m_crMain=RGB(255,255,255);/主要颜色m_crOther=RGB(128,128,128);/辅助的其他颜色CClockElement:CClockElement()/时钟基类析构函数/设置绘图区域函数voidCClockElement:SetRegion(LPRECTlprcRect)m_rcRegion=lprcRect;/区域取值m_nRadius=m_rcRegion.Width()/2;/半径取值if(m_rcRegion.Width()m_rcRegion.Height()/半径的宽度和顶点比较m_nRadius=m_rcRegion.Height()/2;/设置当前时间函数voidCClockElement:SetTime(constCTime/获取其他颜色,60,步骤5:创建时钟背景类CClockBackground,时钟背景类CClockBackground操作方法:在ClassView的工程名上面点右键,选择NewClass,在ClassType里面选择GenenricClass,选择类BaseClassCClockElement类因CClockBackground需从类CClockElement派生效果如图所示。,61,步骤5续:创建时钟背景类CClockBackground,CClockBackground只需实现基类的虚函数Draw即可,因此这里重载基类的虚函数Draw,其头文件实现代码如下(不用编写,由系统生成):#includeClockElement.hclassCClockBackground:publicCClockElementpublic:CClockBackground();virtualCClockBackground();,62,CClockBackground源文件代码如下:,/ClockBackground.cpp:/时钟背景函数CClockBackground:CClockBackground()/为时钟背景定义默认的颜色设置m_crMain=RGB(0,255,0);/主颜色为绿色m_crOther=RGB(0,128,0);/其他颜色为深绿色CClockBackground:CClockBackground(),63,CClockBackground源文件代码如下(续1):,/Draw绘图函数voidCClockBackground:Draw(CDC*pDC)/准备设备环境(也称设备上下文,简称DC),是图形设备的主要接口CPenpenMain(PS_SOLID,1,m_crMain),/创建一支主颜色为绿色能画实线(SOLID)1号粗细的画笔penOther(PS_SOLID,1,m_crOther);/创建一支其他颜色为深绿色能画实线1号粗细的画笔CBrushbrMain(m_crMain),brOther(m_crOther);/创建主画刷和其他画刷/将其他画笔选入内存DC,同时暂时挤出并保存原画笔CPen*pOldPen=pDC-SelectObject(,64,CClockBackground源文件代码如下(续2):,/绘制12个小方框,表示12个正点pDC-SelectObject(/恢复内存DC中原有的画刷,65,步骤6:创建时针类CClockHourHand实现,实现时针类CClockHourHand该类新建的过程与CClockBackground一样。选择类BaseClassCClockElement类因CClockHourHand需从类CClockElement派生CClockHourHand同样只需实现基类的虚函数Draw即可其头文件实现代码如下:#includeClockElement.hclassCClockHourHand:publicCClockElementpublic:CClockHourHand();virtualCClockHourHand();virtualvoidDraw(CDC*pDC);,66,CClockHourHand源文件代码如下:,CClockHourHand:CClockHourHand()/定义默认颜色m_crMain=RGB(0,255,100);m_crOther=RGB(128,128,0);CClockHourHand:CClockHourHand()voidCClockHourHand:Draw(CDC*pDC)/初始化设备环境CPenpenMain(PS_SOLID,1,m_crMain),penOther(PS_SOLID,1,m_crOther);CBrushbrMain(m_crMain),brOther(m_crOther);CPen*pOldPen=pDC-SelectObject(,67,CClockHourHand源文件代码如下(续):,/确定绘制菱形指针所需的四个角的坐标CPointptDiamond4;for(inti=0;iPolygon(ptDiamond,4);/恢复设备环境pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);,68,步骤7:创建分针类CClockMinHand实现,实现分针类CClockMinHand该类新建的过程与CClockHourHand一样,类的实现也基本相似,其头文件实现代码如下:CClockMinHand类因CClockMinHand需从类CClockElement派生CClockMinHand同样只需实现基类的虚函数Draw即可#includeClockElement.hclassCClockMinHand:publicCClockElementpublic:CClockMinHand();virtualCClockMinHand();virtualvoidDraw(CDC*pDC);,69,CClockMinHand源文件代码如下:,CClockMinHand:CClockMinHand()/定义默认颜色m_crMain=RGB(0,255,100);m_crOther=RGB(128,128,0);CClockMinHand:CClockMinHand()voidCClockMinHand:Draw(CDC*pDC)/初始化设备环境CPenpenMain(PS_SOLID,1,m_crMain),penOther(PS_SOLID,1,m_crOther);CBrushbrMain(m_crMain),brOther(m_crOther);CPen*pOldPen=pDC-SelectObject(,70,CClockMinHand源文件代码如下(续):,/确定绘制菱形指针所需的四个角的坐标CPointptDiamond4;for(inti=0;iPolygon(ptDiamond,4);/恢复设备环境pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);,71,步骤8:创建秒针类CClockSecHand实现,实现秒针类CClockSecHand此类与CClockHourHand一样建立,类的实现也基本相似其头文件实现代码如下:#includeClockElement.hclassCClockSecHand:publicCClockElementpublic:CClockSecHand();virtualCClockSecHand();virtualvoidDraw(CDC*pDC);,72,CClockSecHand源文件代码如下:,CClockSecHand:CClockSecHand()/设定秒针的默认颜色m_crMain=RGB(0,200,200);m_crOther=RGB(0,200,200);CClockSecHand:CClockSecHand()voidCClockSecHand:Draw(CDC*pDC)intnTime=m_tmCur.GetSecond();CPointptStart=m_rcRegion.CenterPoint();CPointptEnd=ptStart;intnRadius=m_nRadius-10;ptEnd.Offset(int)(nRadius*sin(2*PI*nTime/60),(int)(-nRadius*cos(2*PI*nTime/60);CPenpenMain(PS_SOLID,1,m_crMain);CPen*pOldPen=pDC-SelectObject(,73,步骤9:组装。,到目前为止,时钟的各个部件都已经设计完毕,现在该把它们组装起来了。刚才建立的4个类CClockBackground、CClockHourHand、CClockMinHand、CClockSecHand要为CClockEx服务,正如CClockElement为它们服务一样,不过服务的方式发生了变化,刚才是以继承的方式使用,现在需要将上面4个类实例化供CClockEx使用。因此,首先应该在类CClockEx为上4个类分别建立对象。在CClockEx的头文件中恰当位置加入以下代码:#includeClockBackground.h#includeClockHourHand.h#includeClockMinHand.h#includeClockSecHand.hclassCClockEx:publicCStaticprivate:CClockBackgroundm_clockBK;/时钟背景CClockHourHandm_clockHour;/时指针CClockMinHandm_clockMin;/分指针CClockSecHandm_clockSec;/秒指针为了存储绘图区域的大小,需要在CClockEx中加入一个变量m_rcClient:CRectm_rcClient;/客户区域,74,在PreSubclassWindow函数中进行时钟的初始化工作。首先得为各个部件设定区域大小;然后启动定时刷新的定时器(100毫秒的定时器已经足够)。由于每个部件都有自己的默认颜色配置,因此这里暂且先使用默认配置,当然也可以自定义颜色:GetClientRect(m_rcClient);/获取当前客户区域m_clockBK.SetRegion(m_rcClient);m_clockHour.SetRegion(m_rcClient);m_clockMin.SetRegion(m_rcClient);m_clockSec.SetRegion(m_rcClient);SetTimer(1,100,NULL);/每100毫秒刷新一次,75,当控件大小发生变化时,控件状态要能够自动更新:voidCClockEx:OnSize(UINTnType,intcx,intcy)CStatic:OnSize(nType,cx,cy);GetClientRect(m_rcClient);m_clockBK.SetRegion(m_rcClient);m_clockHour.SetRegion(m_rcClient);m_clockMin.SetRegion(m_rcClient);m_clockSec.SetRegion(m_rcClient);每个定时器时间触发时,需要刷新控件以保证时钟的走动:voidCClockEx:OnTimer(UINTnIDEvent)Invalidate(FALSE);CStatic:OnTimer(nIDEvent);,76,实现时钟的绘制,下面实现时钟的绘制,由于控件在不断刷新,按一般方式绘图,屏幕会不断闪烁,因此此处使用双缓冲绘图就是在内存中绘图,绘制完毕时再Copy到屏幕上,这样可以有效的防止屏幕闪烁:voidCClockEx:OnPaint()CPaintDCdc(this);/devicecontextforpainting/实现双缓冲绘图防止屏幕闪烁CDCdcMem;/建立一个和pDC兼容的内存DC:dcMemdcMem.CreateCompatibleDC(/将dcMem中的图拷贝到pDC上进行显示。,77,DrawClock的函数实现:,将绘图函数放在一个单独的函数DrawClock中。并写入到文件CLOCKYS.cpp中,另外,在ClockEx.h的头文件中添加函数声明如下图所示。/CLOCKYS.cppvoidCClockEx:DrawClock(CDC*pDC)CTimetmCur=CTime:GetCurrentTime();m_clockBK.SetTime(tmCur);m_clockHour.SetTime(tmCur);m_clockMin.SetTime(tmCur);m_clockSec.SetTime(tmCur);m_clockBK.Draw(pDC);m_clockMin.Draw(pDC);m_clockHour.Draw(pDC);m_clockSec.Draw(pDC);,78,步骤5:添加Static控件,打开资源编辑器,在对话框中拖入一个Static控件,调整外观至合适,将其ID改为IDC_CLOCK。如图效果所示:测试看时钟的实现效果。,79,步骤6:为IDC_CLOCK控件映射变量,打开ClassWizard,为IDC_CLOCK映射一个变量,变量类型为CClockEx。如下图效果所示:,80,步骤7:编译执行,在对话框类的头文件中加入头文件:#includeClockEx.h。程序代码基本编写完毕。编译整个工程,执行可执行程序,就可以看到整个时钟控件的效果图了。,81,实例5简易计算器程序,基本步骤:创建工程MyCal(Calculator)及可视化设计为控件编辑ID为控件(IDC_0,IDC_1)插入消息映射及函数为编辑框添加成员变量m_result对主要成员函数编写代码,82,步骤1:创建工程并进行可视化设计,创建工程(基本对话框)MyCal

温馨提示

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

评论

0/150

提交评论