C++课程设计MFC市公开课获奖课件_第1页
C++课程设计MFC市公开课获奖课件_第2页
C++课程设计MFC市公开课获奖课件_第3页
C++课程设计MFC市公开课获奖课件_第4页
C++课程设计MFC市公开课获奖课件_第5页
已阅读5页,还剩143页未读 继续免费阅读

下载本文档

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

文档简介

1、C+课程设计内容及要求1第1页第1页主要内容课程设计基本要求Windows 编程基础什么是C+MFC什么是MFC编程MFC应用程序开发流程单文档【ClassView】面板登录对话框与单文档视图联接单文档中菜单项与对话框联接实例简介2第2页第2页一、课程设计基本要求自学MFC(2学时)知识扩充C+:理解并掌握MFC程序结构、消息映射机制、MFC类库中惯用类(对话框、各种惯用控件)。软件开发基本知识结合设计任务清楚软件开发基本流程、各个阶段目的和主要工作。上机调试程序(30学时)其它(14学时)程序调试基本办法和论文撰写要求(2学时)掌握调试程序办法与技巧。清楚论文组织结构、格式编排等相关知识学生

2、资料查阅与自主学习(2学时)代码编写(10学时)3第3页第3页二、Windows 编程基础Windows 编程就是基于Windows 应用程序。2种主要Windows应用程序基于对话框应用程序基于文档/视图结构应用程序主要特点含有原则图形用户界面含有与硬件无关特性采用“消息传递,事件驱动”运营机制,即依据Windows发送消息来处理用户输入编写Windows应用程序主要办法(2种)使用Windows提供应用程序接口(API)函数使用Microsoft提供微软基础类(MFC)4第4页第4页三、什么是C+MFCMFC(Microsoft Foundation Class Library,基础类库)

3、 是微软提供用来编写Windows应用程序C+类库;封装了API(Windows接口函数),是Win API与C+结合。MFC大约有200多个类,封装了Windows大部分编程对象以及与它们相关操作。即它由几百个执行文献和源代码文献构成。 注意C+和VC+区别C+是一个程序设计语言,是一个大家都认可软件编制通用规范,即C+是一套语法规则名字,类似汉语,英语。 VC+是一个软件IDE(编译、编辑、调试 )集成开发环境 MFC是一个非外挂式软件包,类库, MFC类是微软为VC+专配。5第5页第5页四、什么是MFC编程MFC编程指就是使用VC+进行开发,并且是在使用VC+提供各种向导情况下MFC编程

4、。在VC+中能够创建3类典型Windows应用程序基于对话框应用程序单文档界面(SDI)应用程序多文档界面(MDI)应用程序文档/视图文档对象:用来保留数据。视图对象:用来显示和编辑数据。 6第6页第6页五、MFC应用程序开发流程应用程序编程基本环节:(1)依据应用程序特性在MFC AppWizardexe应用程序中选择适当应用程序框架。(2)利用资源编辑器编辑资源,如菜单等。(3)利用类向导(ClassWizard)或手工添加类、组员变量、组员函数申明。(4)编写详细组员函数代码。(5)编译、链接程序检查程序中是否存在语法错误。(6)调试应用程序。7第7页第7页六、单文档【ClassView

5、】面板CAboutDlg(关于对话框类)管理关于对话框。CFrameWnd( 框架窗口类)CWxling_27App(应用程序类)用来处理消息。CWxling_27Doc (文档类)MFC中数据是存储在类文档中。文档类负责管理和维护数据本身。CWxling_27View(视图类)结果显示是在视图类中。视图类负责处理用户鼠标和键盘操作。8第8页第8页七、登录对话框与单文档视图联接新建单文档工程:TEXT(注意此名由设计者自己任取);在ResourceView, 单击Insert Dialog,插入一对话框IDD_DIALOG1(默认ID号);右键选中新建对话框,利用类向导建立一个新类Create

6、 a new class,名称为:Cdlg_login ;在MainFrm.cpp文献前面,语句#include “MainFrm.h”后面添加新类头文献:#include dlg_login.h 在FileView中点击source files,双击MainFrm.cpp。找到:CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct),这是窗体框架创建函数。在该函数后面(在return 0 ;前面)加入语句(注意大小写):Cdlg_login dlg; /定义一个登录对话框对象dlgdlg.DoModal(); /让对话框对象以有模式形式显示出来此

7、时对话框与单文档联接完毕。下载“格式工厂3.011”将自己照片转换成BMP格式,通过插入Bitmap命令,将照片引入至资源中,并添加至对话框中。9第9页第9页七续、登录对话框退出按钮代码/拟定按钮void CDlg_login:OnOK() / TODO: Add extra validation herethis-UpdateData(true);if(this-m_name=wxl & this-m_paw=1234)CDialog:OnOK();else MessageBox(登录有误);ExitProcess(0); /退出/CDialog:OnOK();/取消按钮void CDlg_

8、login:OnCancel() / TODO: Add extra cleanup hereExitProcess(0); /退出10第10页第10页八、单文档中菜单项与对话框联接新建单文档工程:Ys1(注意此名由设计者自己任取);在ResourceView, 单击Insert Dialog,插入一对话框IDD_DIALOG1(默认ID号);右键选中新建对话框,利用类向导建立一个新类Create a new class,名称为:Cdlg_jc(自己命名) ,如右图1所表示;在/ Ys1View.cpp :文献中语句#include Ys1View.h后面添加新类头文献:#include dl

9、g_jc.h 编辑主菜单如图2所表示:在主菜下通过“建立类向导”命令,从“Class name”组合框中选择CYs1View,如图3,4所表示,并在函数OnJc()编写代码下列:void CYs1View:OnJc() / TODO: Add your command handler code here Cdlg_jc jc; /定义一个求阶层对话框对象jcjc.DoModal(); /让对话框对象以有模式形式显示出来此时单文档菜单项与对话框联接完毕。11第11页第11页1.求阶层按钮代码使用MFC进行程序设计时,如输出结果是单值,可用下列代码作为模板:void Cdlg_jc:OnOK()

10、/ TODO: Add extra validation hereUpdateData(TRUE); /更新控件值 double i,jsz=1.0;for(i=1;i=m_srs;i+)jsz*=i; /求阶乘 m_jsz.Format ( %f ,jsz); /将双精度型转换为字符,f 相应浮点数/其中m_jsz为输出编辑框组员变量名UpdateData(FALSE); /控件值更新编辑框显示/CDialog:OnOK();12第12页第12页/续上for(i=a;i=b;i+) for(j=2;jTextOut(x,y,s); /在指定位置输出文本 else pDC-TextOut(x,

11、y,s); /在指定位置输出文本x=x+30; 2.求素数按钮代码void Cdlg_zss:OnOK() / TODO: Add extra validation hereUpdateData(TRUE); /更新控件值 CDC *pDC=GetDC();/获取视图初始客户区DC/DC表示设备环境int a=m_szqz;int b=m_szzz;int i,j,n=0;int x=70,y=220;CString s;if(bMoveTo(100,100);pDC-LineTo(300,500);15第15页第15页4.单文档菜单项中画矩形代码菜单项“画矩形”按钮代码:void CWxli

12、ng_28View:OnHjx() / TODO: Add your command handler code hereCClientDC dc(this);CPen pen; /定义画笔/创建红色3号粗细实线画笔pen.CreatePen(PS_SOLID,3,RGB(255,0,0);CPen *oldpen=dc.SelectObject(&pen);CBrush brush; /定义画刷/创建绿色画刷brush.CreateHatchBrush(HS_CROSS,RGB(0,255,0);dc.SelectObject(&brush);dc.Rectangle(300,300,400,

13、500); /画矩形16第16页第16页5.单文档菜单项中画椭圆代码菜单项“画椭圆”按钮代码:void CWxling_28View:OnHty() / TODO: Add your command handler code hereCClientDC dc(this);CPen pen; /设置画笔pen.CreatePen(PS_SOLID,3,RGB(0,255,0);CPen *oldpen=dc.SelectObject(&pen);dc.Ellipse(300,100,600,300); /画椭圆/*(int x1,int y1,int x2,int y2)(x1,y1)和(x2,

14、y2)表示所画椭圆外切矩形左上角和右下角坐标*/17第17页第17页6.单文档菜单项中画sin曲线代码在/ Wxl_30View. cpp中加入头文献: #include math.h“菜单项“画sin曲线”按钮代码:void CWxl_30View:OnSin() / TODO: Add your command handler code hereCClientDC dc(this);CRect rect; /定义矩形对象GetClientRect(rect);int x0=rect.Width()/2;int y0=rect.Height()/2;dc.MoveTo(20,y0);dc.L

15、ineTo(rect.Width()-20,y0);dc.MoveTo(x0,20);dc.LineTo(x0,rect.Height()-20);double setp=3.14159/100;for(int i=-200;imessage = WM_KEYDOWN) /键盘消息 if(pMsg - wParam = VK_ESCAPE) /键盘上Esc键return TRUE; if(pMsg - wParam = VK_RETURN) /键盘上回车键return TRUE;return CDialog:PreTranslateMessage(pMsg);22第22页第22页8.常见问题处

16、理办法建好MFC之后(基于对话框),然后点击Insert-New Class弹出对话框之后,Class Type:MFC Class在Base Class:CRecordset类,点击Ok时候,会弹出要你添加数据库对话框你就能够添加了。 (9)如何为MFC 应用程序添加ODBC 功效? (1)在文献Stdafx.h 文献末尾添加下面一行: #include / MFC ODBC database classes (2)在文本模式下编辑RC 文献(利用File-Open As text 方式) 在下面程序行(共有两处) #include l.chsafxprint.rc / printing/p

17、rint preview resources 添加下一行: #include l.chsafxdb.rc / Database resources 23第23页第23页9.特殊效果(1)如何给MFC单文档添加背景?为CTestView类添加一个变量CBrush m_brushBackground; /定义画刷用于画背景在CTestView结构函数中加入下列代码CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP1); /加载位图m_brushBackground.CreatePatternBrush(&bmp); /创建位图画刷在OnDraw函数中画出来代码下列CRect

18、 rect;GetClientRect(rect); /取得客户区域pDC-FillRect(rect,&m_brushBackground); /用背景画刷填充区域为了避免背景闪烁,使显示更完美,添加WM_ERASEBKGND消息处理函数,并取消调用父类处理函数,代码下列BOOL CTestView:OnEraseBkgnd(CDC* pDC) return TRUE; 编译运营该程序!24第24页第24页9.特殊效果(2)在工程调用其它可执行文献(.EXE)在w1View.cpp :中加入头文献:#include windows.h 在编辑好菜单项中编写代码下列void CW1View:O

19、nWord() / TODO: Add your command handler code hereWinExec(CLOCKYS.exe,NULL); /调用可执行文献注意:将可执行文献拷贝至本工程所在文献夹下,不然要获取文献路径。若要打开其它类型文献,见本片下面备注。25第25页第25页9.特殊效果(3)在工程调用其它任意文献菜单项按钮代码void CW12View:OnYy() / TODO: Add your command handler code hereCString path; /返回文献所在路径,含该文献名GetModuleFileName(NULL, /要获取文献名模块句柄

20、(见备注),null表示当前模块 path.GetBufferSetLength(MAX_PATH+1), /存储取得文献名MAX_PATH /存储取得文献名参数长度); path.ReleaseBuffer(); /字符串缓冲区长度锁定解除 int pos = path.ReverseFind(); /从后向前查找 path = path.Left(pos)path = path.Left(pos); /取左,参数为字符串个数/MessageBox(path); /调试程序时用来显示查找到当前运营程序所在目录 ShellExecute(NULL,open,path+年C+课程设计任务书wxl

21、.doc,NULL,NULL, SW_SHOWNORMAL);26第26页第26页9.特殊效果(4)仅修改工程中某个对话框图标对相应对话框添加初始化函数OnInitDialog(),并添加下列代码:BOOL Cdlg_login:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization hereHICON m_hIcon;/IDR_ICON1为图标资源名 m_hIcon = AfxGetApp()-LoadIcon(IDI_ICON1);SetIcon(m_hIcon, TRUE); / Set big ico

22、nSetIcon(m_hIcon, FALSE); / Set small iconreturn TRUE; / return TRUE unless you set the focus to a control/ EXCEPTION: OCX Property Pages should return FALSE27第27页第27页9.特殊效果如何去掉单文档界面中主框架“无标题”?修改IDR_MAINFRAME字符串资源中第2个参数(共有7个参数),分别以n结束,即下列格式:nnnnnnn例,将主框架标题改为”我应用程序”28第28页第28页在程序中使用对话框 (4) 用鼠标将新添加菜单项拖到

23、“查看”和“帮助”菜单项 之间,结果如图所表示。 菜单项“对话框”拖放后位置(5) 选择“查看”“建立类向导”菜单命令或直接按Ctrl+W快捷键,则出现MFC ClassWizard对话框,该对话框会自动切换到Message Maps页面。(6) 从“Class name”组合框中选择CMainFrame,在Object Ids列表中选择ID_TEST_DLG,然后在Messages框中选择COMMAND消息。 29第29页第29页在程序中使用对话框 (7) 单击Add Function按钮或双击COMMAND消息,出现“Add Member Function”对话框以输入组员函数名称。系统默

24、认函数名为OnTestDlg,如图所表示。该函数是对菜单项ID_TEST_DLG映射,也就是说,当在应用程序运营时,用户选择“对话框”,则该函数OnTestDlg被调用,执行函数中代码。 30第30页第30页在程序中使用对话框 单击OK按钮,在ClassWizard“Member functions”列表中将列出新增长组员函数。选择此函数,单击Edit Code按钮(或直接在函数名双击鼠标),在此组员函数中添加下列代码:void CMainFrame:OnTestDlg() CFirstDlg dlg;/ 定义对话框类对象 dlg.DoModal();/ 显示对话框 代码中,DoModal是C

25、Dialog基类组员函数,它是用来显示和终止模式对话框。31第31页第31页在程序中使用对话框 在OnTestDlg函数实现文献MainFrm.cpp前面添加CFirstDlg类头文献包括,即:#include Ex_SDI.h#include MainFrm.h#include FirstDlg.h“(10) 编译并运营。在应用程序菜单上,选择“测试” “对话框”菜单项,将出现如图对话框,这个对话框就是刚才添加对话框。 32第32页第32页几种常见几何图形绘制。利用MFC AppWizard建立一个SDI应用程序,在OnDraw()函数中添加下列程序代码: void CMyGraphView

26、:OnDraw(CDC* pDC)CTexthtDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here for(int xPos=20;xPosSetPixel(xPos,30,RGB(0,0,0); / 绘制像素点 POINT polylpt5=10,100,50,60,120,80,80,150,30,130; pDC-Polyline(polylpt,5); / 绘制4条折线 POINT polybpt4=150,160,220,60,300,180, 330,20;

27、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

28、,180); / 绘制弦形 POINT polygpt5=450,200,530,220,560,300,480,320,430,280; pDC-Polygon(polygpt,5); / 绘制五边形 pDC-SelectObject(pBrhOld); / 恢复系统默认画刷33第33页第33页绘制效果34第34页第34页九、实例简介实例1静态控件使用实例2编辑框应用实例3单选钮应用程序实例4简易时钟应用程序实例5计算器应用程序实例6调用自定义对话框实例7数据库编程实例返回目录35第35页第35页实例1静态控件使用创建环节:建立基于对话框MFC应用程序框架;设置对话放置控件;在菜单或工具栏空

29、白处,单击右键,弹出控件工具栏,再选择所需控件;设置控件属性;调试程序36第36页第36页环节1:建立基于对话框应用程序框架(1)创建工程:TEST137第37页第37页环节2、3:放置控件;调试程序(1)删除既有控件(2)设置对话框标题利用“属性”设置(3)添加组框设置属性(4)添加静态文本框设置属性(5)添加图片单击“插入/资源”命令,通过菜单引入:(位图(BMP或DIB)、图标(Icon)、图元文献(wMF )图片控件属性对对话框中类型、图像进行设置控件属性控件ID号标题作用对话框默认静态控件使用用户视图组框默认示例将一组相关控件框起来图片默认点缀静态文本默认同窗们好!显示文本信息返回实

30、例38第38页第38页特殊效果对话框中设置静态文本框字体及颜色操作环节:1. 添加对话框类申明中字体和颜色变量 class CDHKDlg : public CDialog/ Constructionpublic:CFont m_myFont; / 字体对象 COLORREF m_myColor; / 颜色对象.2. 在对话框初始化函数OnInitDialog()中对字体和颜色进行初始化m_myFont.CreatePointFont(150, _T(“华文彩云”); /150是字体大小m_myColor = RGB(255, 0, 255);39第39页第39页续上:3. 为对话框类添加WM

31、_CTLCOLOR消息响应函数,并在其消息响应函数OnCtlColor()中添加代码/ 消息响应函数实现 HBRUSH CDHKDlg:OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor )HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor); / TODO: Change any attributes of the DC here (在此更改 DC 任何属性) if(pWnd-GetDlgCtrlID()=IDC_STATIC_1) pDC-SelectObject(&m_myFont); /

32、 设置字体 pDC-SetTextColor(m_myColor); / 设置颜色 / TODO: Return a different brush if the default is not desired(假如默认不是所需画笔,则返回另一个画笔 )return hbr; 40第40页第40页实例2编辑框应用创建环节:建立基于对话框MFC应用程序框架;设置对话放置控件;设置控件属性;为控件连接变量,即为控件命名;添加并且编写消息处理函数;调试程序。41第41页第41页环节1,2:建立框架、添加控件控件属性控件ID号标题变量类型连接变量范围 尤其属性对话框默认编辑框应用组框默认成绩计算静态文本

33、框默认数学静态文本框默认语文静态文本框默认英语静态文本框默认平均分 扩展样式静态文本框IDC_AVERAGECstringm_avg编辑框IDC_SXintm_sx0100编辑框IDC_YWintm_yw0100编辑框IDC_YYintm_yy0100按钮IDC_JS计算平均分按钮IDC_OK退出(1)创建工程:TEST2(2)添加控件,并设置控件相关属性42第42页第42页环节3:连接变量(1)单击“建立类向导”命令,启动类向导;(2)选择“组员变量”选取项卡,连接变量;(3)结果如右图所表示43第43页第43页BOOL CTEST2Dlg:OnInitDialog() CDialog:On

34、InitDialog(); / Add About. menu item to system menu.m_avg=0.0;UpdateData(FALSE);/省略环节4:进行消息映射(1)初始化对话框(是程序运营时开始状态设定)进入ClassWiZard(类向导),Message Maps,在Object IDs里选择要添加OnInitDialog()函数对话框类,在Messages里选择WM_INITDIALOG,单击Add Function(增长函数),此时对话框类就新增了一个函数是OnInitDialog()。(2)编辑初始化代码:44第44页第44页void CTEST2Dlg:O

35、nJs() / TODO: Add your control notification handler code hereUpdateData(TRUE); /更新控件值 double avg=double(m_sx+m_yw+m_yy)/3.0;m_avg.Format (%6.2f,avg);UpdateData(FALSE); /控件值更新编辑框显示环节5:编写代码_对“计算平均分”按钮(1)双击“计算平均分”按钮,为IDC_JS添加BN_CLICKED消息映射:(2)编写代码。45第45页第45页环节6:编写代码_对“退出”按钮(1)双击“退出”按钮,为IDC_OK添加BN_CLICK

36、ED消息映射:(2)编写代码。void CTEST2Dlg:OnOk() / TODO: Add your control notification handler code hereOnOK();46第46页第46页环节7:调试程序_运营注意:对话框中平均分显示部分是在设置属性时,选择了“扩展样式”选项卡中“客户边沿”选项效果。返回实例47第47页第47页实例3单选钮应用程序设计如右图所表示程序。基本环节:创建工程TESTp246,并进行界面设计;为编辑框连接到CString类型添加组员变量m_xm,其余控件不需连接;为控件编辑ID4. 对单选钮编写初始化函数代码5. 对对话框“拟定”按钮编

37、写代码48第48页第48页环节13:建立框架,连接变量,编辑ID注意对组框1中2个单选按钮,在设置第一个按钮(男)属性时,需选定“组”选项,表示此组默认第1个按钮;同理对组框2中3个单选按钮,在设置第一个按钮(专家)属性时,需选定“组”选项,表示此组默认第1个按钮;组框本身属性不要选中“组”选项。49第49页第49页环节4:单选钮初始化函数代码BOOL CTESTp246Dlg:OnInitDialog()CDialog:OnInitDialog();CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);CheckRadioButton(IDC_

38、RADIO3,IDC_RADIO5,IDC_RADIO3);/ Add About. menu item to system menu.表示为默认按钮50第50页第50页环节5:对话框“拟定”按钮代码void CTESTp246Dlg:OnButton1() / TODO: Add your control notification handler code hereUpdateData(TRUE);CString s;s=s+m_xm;if(IsDlgButtonChecked(IDC_RADIO1)s=s+男;elses=s+女;if(IsDlgButtonChecked(IDC_RADI

39、O3)s=s+专家;else if(IsDlgButtonChecked(IDC_RADIO4)s=s+副专家;elses=s+讲师;AfxMessageBox(s);返回实例51第51页第51页实例4简易时钟程序基于对话框基本环节:创建工程(基于基本对话框)CLOCKYS(时钟演示)添加新类CClockEx,实现时钟控件类。添加消息响应及函数,来建立时钟控件轮廓。时钟设计时钟元素创建时钟基类CClockElement添加时针类、分针类、秒针类编译执行。环节1:创建工程CLOCKYS返回实例52第52页第52页环节2:创建一个新类CClockEx从CStatic(静态控件)类派生出类CCloc

40、kEx来实现时钟控件类,这样,就能够继承MFC静态控件诸多已经具备功效和特点.53第53页第53页环节3:添加消息响应建立时钟控件轮廓时钟控件轮廓单击“查看建立类向导” 调出Class Wizard,在class name中选择刚建立新类CClockEx,进行下列工作: 重载虚函数PreSubClassWindow对时钟控件基本初始化工作将在该函数中进行。 添加WM_PAINT消息响应用于完毕时钟绘制工作。 添加WM_SIZE消息响应以便设计时钟控件能自动适应其大小改变。 添加WM_TIMER消息响应定期刷新时钟控件让它走动。此时,时钟控件轮廓已建好。效果如图所表示。54第54页第54页环节4

41、:时钟设计时钟元素时钟绘制具体实现。时钟大致由:时钟背景、时针、分针、秒针4个部分组成。这4个部分可看作4个不同对象,可以考虑建立类来分别实现。 。CClockBackground (背景)CClockHourHand(时针)CClockMinHand(分针)CClockSecHand(秒针)这4个类有它们共同点:都有自己绘图函数;都有自己绘图颜色;都应有颜色设置函数;都有绘图区域和区域设置函数等等。因此,可认为它们共性建立一个基类,命名为:CClockElement(时钟元素)。55第55页第55页环节4续:创建时钟基类CClockElement先建各个构成类基类:CClockElement

42、办法:右键单击ClassView工程选择New Class;在ClassType里面选择Genenric Class,类;CClockElement不需要从其它类派生,因此Base Class能够不填,效果如右图所表示。56第56页第56页环节4续:创建时钟基类CClockElement代码对类CClockElement源代码进行编写。添加头文献 #include 因后面绘图中需要用到sin和cos这两个数学计算公式。为后面计算使用,定义数学常量 PI(3.1415926535)。在基类中定义绘图区域变量时钟每个构成部分都有绘图区域区域,可定义颜色变量。为了是颜色不显得单调,这里为每个控件设置

43、两种颜色(假如想使程序愈加绚丽,能够设置更多颜色)。增长接口函数这些变量需增长接口函数来进行访问。每个构成部分都应当有Draw(绘图)函数也需在基类中定义,但是,该函数对于基类来说是无需函数实现,因此可定义为纯虚函数。57第57页第57页环节4续:创建时钟基类CClockElement代码/ ClockElement.h: interface for the CClockElement class. CClockElement实现头文献代码下列:#if !defined(AFX_CLOCKELEMENT_H_08A9DFB3_95C0_4D70_9BC0_96D3BACAB74A_INCLUD

44、ED_)#define AFX_CLOCKELEMENT_H_08A9DFB3_95C0_4D70_9BC0_96D3BACAB74A_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#include #define PI 3.1415926535class CClockElement public:void SetColor(COLORREF crMain, COLORREF crOther);/设置颜色void SetTime(const CTime &tmCur);/设置当前时间void SetRegion(LPRE

45、CT lprcRect);/设置绘图区域virtual void Draw(CDC *pDC) = 0;/绘图函数,此函数是一虚函数CClockElement();virtual CClockElement();protected:COLORREF m_crMain; /主要颜色COLORREF m_crOther; /辅助其它颜色CTimem_tmCur; /当前时刻CRectm_rcRegion;/绘图区域intm_nRadius;/时钟半径;58第58页第58页CClockElement实现源文献关键代码下列:/ ClockElement.cpp:CClockElement:CClock

46、Element() /时钟基类结构函数m_nRadius = 0; /时钟半径m_crMain = RGB(255, 255, 255); /主要颜色m_crOther = RGB(128, 128, 128);/辅助其它颜色CClockElement:CClockElement() /时钟基类析构函数/设置绘图区域函数void CClockElement:SetRegion(LPRECT lprcRect)m_rcRegion = lprcRect; /区域取值m_nRadius = m_rcRegion.Width() / 2; /半径取值if (m_rcRegion.Width() m_

47、rcRegion.Height()/半径宽度和顶点比较m_nRadius = m_rcRegion.Height() / 2;/设置当前时间函数void CClockElement:SetTime(const CTime &tmCur) m_tmCur = tmCur; /设置颜色函数void CClockElement:SetColor(COLORREF crMain, COLORREF crOther)m_crMain = crMain; /获取主颜色m_crOther = crOther; /获取其它颜色59第59页第59页环节5:创建时钟背景类CClockBackground时钟背景类

48、CClockBackground操作办法:在ClassView工程名上面点右键,选择New Class,在ClassType里面选择Genenric Class,选择类Base ClassCClockElement类因CClockBackground需从类CClockElement派生效果如图所表示。60第60页第60页环节5续:创建时钟背景类CClockBackgroundCClockBackground只需实现基类虚函数Draw即可,因此这里重载基类虚函数Draw,其头文献实当代码下列(不用编写,由系统生成):#include ClockElement.hclass CClockBackg

49、round : public CClockElement public:CClockBackground();virtual CClockBackground();61第61页第61页CClockBackground源文献代码下列:/ ClockBackground.cpp:/时钟背景函数CClockBackground:CClockBackground()/为时钟背景定义默认颜色设置m_crMain = RGB(0, 255, 0); /主颜色为绿色m_crOther = RGB(0, 128, 0); /其它颜色为深绿色CClockBackground:CClockBackground()

50、 62第62页第62页CClockBackground源文献代码下列(续1):/Draw 绘图函数void CClockBackground:Draw(CDC *pDC)/准备设备环境(也称设备上下文,简称DC),是图形设备主要接口CPen penMain(PS_SOLID, 1, m_crMain), /创建一支主颜色为绿色能画实线(SOLID)1号粗细画笔penOther(PS_SOLID, 1, m_crOther); /创建一支其它颜色为深绿色能画实线1号粗细画笔CBrush brMain(m_crMain), brOther(m_crOther); /创建主画刷和其它画刷/将其它画笔

51、选入内存DC,同时暂时挤出并保留原画笔 CPen *pOldPen = pDC-SelectObject(&penOther); /将主画刷选入内存DC,同时暂时挤出并保留原画刷CBrush *pOldBrush = pDC-SelectObject(&brMain);/绘制60个小圆点,表示分针和秒针刻度CPoint ptCenter = m_rcRegion.CenterPoint(); /创建画点对象并初始化int nRadius = m_nRadius - 8; /定义半径初值for(int i=0; iEllipse(rcDot); 63第63页第63页CClockBackgroun

52、d源文献代码下列(续2):/绘制12个小方框,表示12个正点pDC-SelectObject(&penMain); /恢复内存DC中原有主画笔pOldBrush = pDC-SelectObject(&brOther);for(i=0; iRectangle(rcDot);/还原设备环境pDC-SelectObject(pOldPen); /恢复内存DC中原有画笔pDC-SelectObject(pOldBrush); /恢复内存DC中原有画刷64第64页第64页环节6:创建时针类CClockHourHand实现实现时针类CClockHourHand该类新建过程与CClockBackgroun

53、d同样。选择类Base ClassCClockElement类因CClockHourHand需从类CClockElement派生CClockHourHand同样只需实现基类虚函数Draw即可其头文献实当代码下列:#include ClockElement.hclass CClockHourHand : public CClockElement public:CClockHourHand();virtual CClockHourHand();virtual void Draw(CDC *pDC);65第65页第65页CClockHourHand源文献代码下列:CClockHourHand:CCl

54、ockHourHand()/定义默认颜色m_crMain = RGB(0, 255, 100);m_crOther = RGB(128, 128, 0);CClockHourHand:CClockHourHand() void CClockHourHand:Draw(CDC *pDC)/初始化设备环境CPen penMain(PS_SOLID, 1, m_crMain), penOther(PS_SOLID, 1, m_crOther);CBrush brMain(m_crMain), brOther(m_crOther);CPen *pOldPen = pDC-SelectObject(&p

55、enOther);CBrush *pOldBrush = pDC-SelectObject(&brMain);/拟定当前指针弧度int nTime = (m_tmCur.GetHour() % 12) * 3600;nTime += m_tmCur.GetMinute() * 60;nTime += m_tmCur.GetSecond();double fRadian = 2 * PI * nTime / 3600 / 12; 66第66页第66页CClockHourHand源文献代码下列(续):/拟定绘制菱形指针所需四个角坐标CPoint ptDiamond4;for(int i=0; iP

56、olygon(ptDiamond, 4);/恢复设备环境pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);67第67页第67页环节7:创建分针类CClockMinHand实现实现分针类CClockMinHand该类新建过程与CClockHourHand同样,类实现也基本相同,其头文献实当代码下列:CClockMinHand类因CClockMinHand需从类CClockElement派生CClockMinHand同样只需实现基类虚函数Draw即可#include ClockElement.hclass CClockMinHand : p

57、ublic CClockElement public:CClockMinHand();virtual CClockMinHand();virtual void Draw(CDC *pDC);68第68页第68页CClockMinHand源文献代码下列:CClockMinHand:CClockMinHand()/定义默认颜色m_crMain = RGB(0, 255, 100);m_crOther = RGB(128, 128, 0);CClockMinHand:CClockMinHand() void CClockMinHand:Draw(CDC *pDC)/初始化设备环境CPen penMa

58、in(PS_SOLID, 1, m_crMain), penOther(PS_SOLID, 1, m_crOther);CBrush brMain(m_crMain), brOther(m_crOther);CPen *pOldPen = pDC-SelectObject(&penOther);CBrush *pOldBrush = pDC-SelectObject(&brMain);/拟定分针所在位置弧度int nTime = m_tmCur.GetMinute() * 60;nTime += m_tmCur.GetSecond();double fRadian = 2 * PI * nTi

59、me / 3600;69第69页第69页CClockMinHand源文献代码下列(续):/拟定绘制菱形指针所需四个角坐标CPoint ptDiamond4;for(int i=0; iPolygon(ptDiamond, 4);/恢复设备环境pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);70第70页第70页环节8:创建秒针类CClockSecHand实现实现秒针类CClockSecHand这类与CClockHourHand同样建立,类实现也基本相同其头文献实当代码下列:#include ClockElement.hclass CCl

60、ockSecHand : public CClockElement public:CClockSecHand();virtual CClockSecHand();virtual void Draw(CDC *pDC);71第71页第71页CClockSecHand源文献代码下列:CClockSecHand:CClockSecHand()/设定秒针默认颜色m_crMain = RGB(0, 200, 200);m_crOther = RGB(0, 200, 200);CClockSecHand:CClockSecHand() void CClockSecHand:Draw(CDC *pDC)in

温馨提示

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

评论

0/150

提交评论