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

下载本文档

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

文档简介

1、1/64,C+课程设计,内容及要求,2,主要内容,课程设计基本要求 Windows 编程基础 什么是C+的MFC 什么是MFC编程 MFC应用程序的开发流程 单文档【ClassView】面板 登录对话框与单文档视图联接 单文档中菜单项与对话框联接 实例介绍,3,一、课程设计基本要求,自学MFC(2学时) 知识扩充 C+:了解并掌握MFC程序结构、消息映射机制、MFC类库中的常用类(对话框、各种常用控件)。 软件开发的基本知识 结合设计任务清楚软件开发的基本流程、各个阶段的目标和主要工作。 上机调试程序(30学时) 其他(14学时) 程序调试的基本方法和论文撰写要求(2学时) 掌握调试程序的方法

2、与技巧。 清楚论文组织结构、格式编排等相关知识 学生资料查阅与自主学习(2学时) 代码编写(10学时),4,二、Windows 编程基础,Windows 编程 就是基于Windows 的应用程序。 2种重要的Windows应用程序 基于对话框的应用程序 基于文档/视图结构的应用程序 主要特点 具有标准的图形用户界面 具有与硬件无关的特性 采用“消息传递,事件驱动”的运行机制,即根据Windows发送的消息来处理用户的输入 编写Windows应用程序的主要方法(2种) 使用Windows提供的应用程序接口(API)函数 使用Microsoft提供的微软基础类(MFC),5,三、什么是C+的MFC

3、,MFC(Microsoft Foundation Class Library,基础类库) 是微软提供的用来编写Windows应用程序的C+类库; 封装了API(Windows的接口函数),是Win API与C+的结合。 MFC大约有200多个类,封装了Windows的大部分编程对象以及与它们有关的操作。即它由几百个执行文件和源代码文件组成。 注意C+和VC+的区别 C+是一种程序设计语言,是一种大家都承认的软件编制的通用规范,即C+是一套语法规则的名字,类似汉语,英语。 VC+是一个软件IDE(编译、编辑、调试 )集成开发环境 MFC是一个非外挂式的软件包,类库, MFC类是微软为VC+专配

4、的。,6,四、什么是MFC编程,MFC编程 指的就是使用VC+进行开发,并且是在使用VC+提供的各种向导的情况下的MFC编程。 在VC+中可以创建3类典型的Windows应用程序 基于对话框的应用程序 单文档界面(SDI)应用程序 多文档界面(MDI)应用程序,文档/视图 文档对象: 用来保存数据。 视图对象: 用来显示和编辑数据。,7,五、MFC应用程序的开发流程,应用程序编程的基本步骤: (1)根据应用程序的特性在MFC AppWizardexe应用程序中选择合适的应用程序框架。 (2)利用资源编辑器编辑资源,如菜单等。 (3)利用类向导(ClassWizard)或手工添加类、成员变量、成

5、员函数声明。 (4)编写具体的成员函数代码。 (5)编译、链接程序 检查程序中是否存在语法错误。 (6)调试应用程序。,8,六、单文档【ClassView】面板,CAboutDlg(关于对话框类) 管理关于对话框。 CFrameWnd( 框架窗口类) CWxling_27App(应用程序类) 用来处理消息。 CWxling_27Doc (文档类) MFC中的数据是存储在类文档中。 文档类负责管理和维护数据本身。 CWxling_27View(视图类) 结果的显示是在视图类中。 视图类负责处理用户鼠标和键盘的操作。,9,七、登录对话框与单文档视图联接,新建单文档工程:TEXT(注意此名由设计者自

6、己任取); 在ResourceView, 单击Insert Dialog,插入一对话框IDD_DIALOG1(默认ID号); 右键选中新建的对话框,利用类向导建立一个新类Create a new class,名称为:Cdlg_login ; 在MainFrm.cpp文件的前面,语句#include “MainFrm.h”的后面添加新类的头文件: #include dlg_login.h 在FileView中点击source files,双击MainFrm.cpp。找到: CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct), 这是窗体框架创建函数

7、。在该函数的后面(在return 0 ;的前面)加入语句(注意大小写): Cdlg_login dlg; /定义一个登录对话框对象dlg dlg.DoModal(); /让对话框对象以有模式形式显示出来 此时对话框与单文档联接完成。 下载“格式工厂3.011”将自己的照片转换成BMP格式,通过插入Bitmap命令,将照片引入至资源中,并添加至对话框中。,10,七续、登录对话框退出按钮代码,/确定按钮 void CDlg_login:OnOK() / TODO: Add extra validation here this-UpdateData(true); if(this-m_name=wxl

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

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

10、void Cdlg_jc:OnOK() / TODO: Add extra validation here UpdateData(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(); ,13,/续上 for(i=a;iTextOut(x,y,s); /在指定位置输出文本 else pDC-Tex

11、tOut(x,y,s); /在指定位置输出文本 x=x+30; ,2.求素数按钮的代码,void Cdlg_zss:OnOK() / TODO: Add extra validation here UpdateData(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(b=100) /控制只求100内的素 ,使用MFC进行程序设计时,如输出结果是多值,可用以下代码作为模板:,14,注:CDC类

12、有4个派生类,CClientDC类 只能在窗口的客户区(不包括边框、标题栏、菜单栏以及状态栏的空白区域)进行绘图。 CMetaFileDC 封装了在一个Windows图元文件中绘图的方法。 CPaintDC 只在处理WM_PAINT消息中使用,用户一旦获得相关的CDC指针,就可以将它当做任何设备环境(包括屏幕、打印机)的指针来使用。 CWindowDC 允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角。,在微软基类库MFC中,CDC类是定义设备上下文(DC,设备环境)对象的基类,所有绘图函数都在CDC基类中定义。,15,3.单文档菜单项中画直线代码,菜单项“画直线”按钮代码: v

13、oid CYs1View:OnHzx() / TODO: Add your command handler code here /使用CClientDC类来画图,创建的是视图窗口的dc对象,作图只能在视图的客服区内作图 Invalidate(true); /擦除窗口原有内容重新绘制 UpdateWindow(); /使窗口立即重绘 CClientDC dc(this); /创建一个名为dc的视图窗口的dc对象,this指向当前的对话框 CPen pen; /设置画笔 /创建一支5号粗细画实线的绿色画笔, pen.CreatePen(PS_SOLID,5,RGB(0,255,0); /选用新画笔

14、 CPen *oldpen=dc.SelectObject( /线段的终点 /RGB(红,绿,蓝),或用CDC类绘图 void CYs1View:OnHzx() /Invalidate(true);/刷新屏幕 CDC *pDC=GetDC(); pDC-MoveTo(100,100); pDC-LineTo(300,500); ,16,4.单文档菜单项中画矩形代码,菜单项“画矩形”按钮代码: void CWxling_28View:OnHjx() / TODO: Add your command handler code here CClientDC dc(this); CPen pen; /

15、定义画笔 /创建红色3号粗细实线画笔 pen.CreatePen(PS_SOLID,3,RGB(255,0,0); CPen *oldpen=dc.SelectObject( /画矩形 ,17,5.单文档菜单项中画椭圆代码,菜单项“画椭圆”按钮代码: void CWxling_28View:OnHty() / TODO: Add your command handler code here CClientDC dc(this); CPen pen; /设置画笔 pen.CreatePen(PS_SOLID,3,RGB(0,255,0); CPen *oldpen=dc.SelectObject

16、( /画椭圆 /*(int x1,int y1,int x2,int y2) (x1,y1)和(x2,y2)表示所画椭圆外切矩形的左上角和右下角坐标*/,18,6.单文档菜单项中画sin曲线代码,在/ Wxl_30View. cpp中加入头文件: #include math.h“ 菜单项“画sin曲线”按钮代码: void CWxl_30View:OnSin() / TODO: Add your command handler code here CClientDC dc(this); CRect rect; /定义矩形对象 GetClientRect(rect); int x0=rect.W

17、idth()/2; int y0=rect.Height()/2; dc.MoveTo(20,y0); dc.LineTo(rect.Width()-20,y0); dc.MoveTo(x0,20); dc.LineTo(x0,rect.Height()-20); double setp=3.14159/100; for(int i=-200;i200;i+) dc.SetPixel(x0+(i/300.0)*rect.Width()/2.0, y0-sin(setp*i)*rect.Height()/4.0,RGB(255,0,0); ,19,7.单文档菜单项中画澳运图标代码,void CA

18、12View:OnHy() / TODO: Add your command handler code here CClientDC dc(this); CPen pen1,pen2,pen3,pen4,pen5; /设置画笔 pen1.CreatePen(PS_SOLID,5,RGB(0,0,255); /兰色 pen2.CreatePen(PS_SOLID,5,RGB(0,0,0); /黑色 pen3.CreatePen(PS_SOLID,5,RGB(255,0,0); /红色 pen4.CreatePen(PS_SOLID,5,RGB(255,255,0); /黄色 pen5.Creat

19、ePen(PS_SOLID,5,RGB(0,255,0); /绿色 /创建一支透明画刷,这样先前画的图不会被后面画的挡住 CBrush brush1; /设置画刷,在对话框不要此句 /类名可以调用静态成员函数,而不可以调用非静态成员函数。但是对象都可以调用。 CBrush*brush1=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH); /CBrush *pOldbrush=dc.SelectObject(brush1); /选择透明画刷 ,在对话框不要此句 CBrush *pOldbrush=dc.SelectObject( /画红色圆

20、,20,8.常见问题解决方法,(1)如何删除一个新建的类? 先从workspace中的fileview中删除对应的.h和.cpp文件。 再关闭项目,从实际的文件夹中删除对应的.h和.cpp文件。 再删除.clw文件。 打开项目,全部重建(rebuild all)。 (2)某个类突然在工作区间里面突然看不见了? 只是类隐藏了,打开FILEVIEW,找到隐藏类的头文件,随便敲一下键盘的空格键,类就会在CLASSVIEW中显示了 (3) 为什么MFC 中自动显示成员列表功能时有时无? 删除该项目扩展名为.ncb 文件,重新打开该项目。 (4)如何在应用程序中打开一个超级链接? 使用ShellExec

21、ute API 函数。 例:打开中南大学网站。 ShellExecute(NULL,open, NULL, NULL, SW_SHOWNORMAL);,ShellExecute函数原型:HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd);,21,8.常见问题解决方法,(5)怎样改变VC+编辑器默认的颜色? 工具/选择/格式,选中注释的颜色即可改变。 (6)复制了一段代码到当前工作空间里,可是

22、代码排列很乱,如何调整? 按下鼠标左键拖动鼠标将代码选择上,同时按下键盘的ALT+F8 键 (7)设置单文档中标题栏和窗口大小 对主框架添加函数PreCreateWindow(),代码如下: BOOL CMainFrame:PreCreateWindow(CREATESTRUCT ,22,8.常见问题解决方法,(8)如何处理按回车或ESC键对话框关闭? 主要是由于回车键响应OnOK()函数、ESC键响应OnCancel()函数而引起的,解决方法是在Cdlg_js类中添加PreTranslateMessage函数(将按键消息转换成字符消息),代码如下,使用消息传递时过滤掉这两个键盘消息。 BOO

23、L Cdlg_js:PreTranslateMessage(MSG *pMsg) / TODO: Add your specialized code here and/or call the base class if(pMsg-message = WM_KEYDOWN) /键盘消息 if(pMsg - wParam = VK_ESCAPE) /键盘上的Esc键 return TRUE; if(pMsg - wParam = VK_RETURN) /键盘上的回车键 return TRUE; return CDialog:PreTranslateMessage(pMsg); ,23,8.常见问题

24、解决方法,建好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 / pr

25、inting/print preview resources 添加下一行: #include l.chsafxdb.rc / Database resources,24,9.特殊效果,(1)如何给MFC单文档添加背景? 为CTestView类添加一个变量 CBrush m_brushBackground; /定义画刷用于画背景 在CTestView的构造函数中加入如下代码 CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); /加载位图 m_brushBackground.CreatePatternBrush( 编译运行该程序!,25,9.特殊效果,(2)在工程调

26、用其他可执行的文件(.EXE) 在w1View.cpp :中加入头文件: #include windows.h 在编辑好的菜单项中编写代码如下 void CW1View:OnWord() / TODO: Add your command handler code here WinExec(CLOCKYS.exe,NULL); /调用可执行文件 注意:将可执行文件拷贝至本工程所在的文件夹下,否则要获取文件的路径。若要打开其他类型的文件,见本片的下面的备注。,26,9.特殊效果,(3)在工程调用其他任意文件菜单项按钮代码 void CW12View:OnYy() / TODO: Add your

27、command handler code here CString path; /返回文件所在的路径,含该文件名 GetModuleFileName( NULL, /要获取文件名的模块句柄(见备注),null表示当前模块 path.GetBufferSetLength(MAX_PATH+1), /存放取得的文件名 MAX_PATH /存放取得的文件名参数的长度 ); path.ReleaseBuffer(); /字符串的缓冲区长度锁定解除 int pos = path.ReverseFind(); /从后向前查找 path = path.Left(pos) path = path.Left(p

28、os); /取左,参数为字符串的个数 /MessageBox(path); /调试程序时用来显示查找到的当前运行程序所在目录 ShellExecute(NULL,open,path+2013年C+课程设计任务书wxl.doc, NULL,NULL, SW_SHOWNORMAL); ,27,9.特殊效果,(4)仅修改工程中某个对话框的图标 对对应的对话框添加初始化函数OnInitDialog(),并添加以下代码: BOOL Cdlg_login:OnInitDialog() CDialog:OnInitDialog(); / TODO: Add extra initialization here

29、 HICON m_hIcon; /IDR_ICON1为图标资源名 m_hIcon = AfxGetApp()-LoadIcon(IDI_ICON1); SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); / Set small icon return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE,28,9.特殊效果,如何去掉单文档界面中主框架的“无

30、标题”? 修改IDR_MAINFRAME字符串资源中第2个参数(共有7个参数),分别以n结束,即如下格式: nnnnnnn 例,将主框架标题改为”我的应用程序”,29,在程序中使用对话框,(4) 用鼠标将新添加的菜单项拖到“查看”和“帮助”菜单项 之间,结果如图所示。,菜单项“对话框”拖放后的位置 (5) 选择“查看”“建立类向导”菜单命令或直接按Ctrl+W快 捷键,则出现MFC ClassWizard对话框,该对话框会自动 切换到Message Maps页面。 (6) 从“Class name”组合框中选择CMainFrame,在Object Ids 列表中选择ID_TEST_DLG,然后

31、在Messages框中选择CO MMAND消息。,30,在程序中使用对话框,(7) 单击Add Function按钮或双击COMMAND消息,出 现“Add Member Function”对话框以输入成员函数的名称。系统默认的函数名为OnTestDlg,如图所示。该函数是对菜单项ID_TEST_DLG的映射,也就是说,当在应用程序运行时,用户选择“对话框”,则该函数OnTestDlg被调用,执行函数中的代码。,31,在程序中使用对话框,单击OK按钮,在ClassWizard的“Member functions”列 表中将列出新增加的成员函数。选择此函数,单击Edit Co de按钮(或直接在

32、函数名双击鼠标),在此成员函数中添加下 列代码: void CMainFrame:OnTestDlg() CFirstDlg dlg;/ 定义对话框类对象 dlg.DoModal();/ 显示对话框 代码中,DoModal是CDialog基类成员函数,它是用来显 示和终止模式对话框。,32,在程序中使用对话框,在OnTestDlg函数的实现文件MainFrm.cpp的前面添加 CFirstDlg类的头文件包含,即:,#include Ex_SDI.h #include MainFrm.h #include FirstDlg.h“,(10) 编译并运行。在应用程序菜单上,选择“测试” “对 话框

33、”菜单项,将出现如图的对话框,这个对话框就是刚 才添加的对话框。,33,几种常见的几何图形绘制。,利用MFC AppWizard建立一个SDI应用程序,在OnDraw()函数中添加如下程序代码: void CMyGraphView: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 polylpt

34、5=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; pDC-PolyBezier(polybpt,4); / 绘制贝塞尔曲线 CBrush *pBrhOld; pBrhOld=(CBrush*)pDC-SelectStockObject( LTGRAY_BRUSH); / 使用浅灰色堆画刷 pDC-RoundRect(400,30,550,100,20,20); / 绘制圆角矩形 pDC-Arc(20,200,2

35、00,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); / 绘制弦形 POINT polygpt5=450,200,530,220,560,300,480,320,430,280; pDC-Polygon(polygpt,5); / 绘制五边形 pDC-SelectObject(pBrhOld); / 恢复系统默认的画刷 ,34,绘制效果,35/64,九、实例介绍,实例1静态控件的使用 实例2编辑框应用

36、 实例3单选钮应用程序 实例4简易时钟应用程序 实例5计算器应用程序 实例6调用自定义对话框 实例7数据库编程实例,返回目录,36,实例1静态控件的使用,创建步骤: 建立基于对话框的MFC应用程序框架; 设置对话 放置控件; 在菜单或工具栏的空白处,单击右键,弹出控件工具栏,再选择所需控件; 设置控件属性; 调试程序,37,步骤1:建立基于对话框应用程序框架,(1)创建工程:TEST1,38,步骤2、3:放置控件;调试程序,(1)删除现有控件 (2)设置对话框标题 利用“属性”设置 (3)添加组框 设置属性 (4)添加静态文本框 设置属性 (5)添加图片 单击“插入/资源”命令,通过菜单引入:

37、 (位图(BMP或DIB)、图标(Icon)、图元文件(wMF ) 图片控件属性对对话框中的类型、图像进行设置,返回实例,39,特殊效果对话框中设置静态文本框字体及颜色,操作步骤: 1. 添加对话框类声明中字体和颜色变量 class CDHK2013Dlg : public CDialog / Construction public: CFont m_myFont; / 字体对象 COLORREF m_myColor; / 颜色对象 . 2. 在对话框初始化函数OnInitDialog()中对字体和颜色进行初始化 m_myFont.CreatePointFont(150, _T(“华文彩云”)

38、; /150是字体大小 m_myColor = RGB(255, 0, 255);,40,续上:,3. 为对话框类添加WM_CTLCOLOR消息响应函数,并在其消息响应函数OnCtlColor()中添加代码 / 消息响应函数实现 HBRUSH CDHK2013Dlg:OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor ) HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor); / TODO: Change any attributes of the DC here (在此更改 DC 的任何属性)

39、 if(pWnd-GetDlgCtrlID()=IDC_STATIC_1) pDC-SelectObject( ,41,实例2编辑框应用,创建步骤: 建立基于对话框的MFC应用程序框架; 设置对话 放置控件; 设置控件属性; 为控件连接变量,即为控件命名; 添加并且编写消息处理函数; 调试程序。,42,步骤1,2:建立框架、添加控件,(1)创建工程:TEST2 (2)添加控件,并设置控件相关属性,43,步骤3:连接变量,(1)单击“建立类向导”命令,启动类向导; (2)选择“成员变量”选取项卡,连接变量; (3)结果如右图所示,44,BOOL CTEST2Dlg:OnInitDialog()

40、CDialog:OnInitDialog(); / 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)编辑初始化代码:,45,vo

41、id CTEST2Dlg:OnJs() / TODO: Add your control notification handler code here UpdateData(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)编写代码。,46,步骤6:编写代码_对“退出”按钮,(1)双击“退出”按钮,为

42、IDC_OK添加BN_CLICKED消息映射: (2)编写代码。,void CTEST2Dlg:OnOk() / TODO: Add your control notification handler code here OnOK(); ,47,步骤7:调试程序_运行,注意: 对话框中平均分显示部分是在设置属性时,选择了“扩展样式”选项卡中的“客户边缘”选项的效果。,返回实例,48,实例3单选钮应用程序,设计如右图所示的程序。 基本步骤: 创建工程TESTp246,并进行界面设计; 为编辑框连接到CString类型的添加成员变量m_xm,其余控件不需连接; 为控件编辑ID 4. 对单选钮编写初

43、始化函数代码 5. 对对话框的“确定”按钮编写代码,49,步骤13:建立框架,连接变量,编辑ID,注意 对组框1中2个单选按钮,在设置第一个按钮(男)的属性时,需选定“组”选项,表示此组默认第1个按钮; 同理对组框2中3个单选按钮,在设置第一个按钮(教授)的属性时,需选定“组”选项,表示此组默认第1个按钮; 组框本身的属性不要选中“组”选项。,50,步骤4:单选钮初始化函数代码,BOOL CTESTp246Dlg:OnInitDialog() CDialog:OnInitDialog(); CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);

44、CheckRadioButton(IDC_RADIO3,IDC_RADIO5,IDC_RADIO3); / Add About. menu item to system menu. ,表示为默认按钮,51,步骤5:对话框的“确定”按钮代码,void CTESTp246Dlg:OnButton1() / TODO: Add your control notification handler code here UpdateData(TRUE); CString s; s=s+m_xm; if(IsDlgButtonChecked(IDC_RADIO1) s=s+男; else s=s+女; if

45、(IsDlgButtonChecked(IDC_RADIO3) s=s+教授; else if(IsDlgButtonChecked(IDC_RADIO4) s=s+副教授; else s=s+讲师; AfxMessageBox(s); ,返回实例,52,实例4简易时钟程序基于对话框,基本步骤: 创建工程(基于基本对话框的)CLOCKYS(时钟演示) 添加新类CClockEx,实现时钟控件类。 添加消息响应及函数,来建立时钟控件的轮廓。 时钟设计时钟元素 创建时钟基类CClockElement 添加时针类、分针类、秒针类 编译执行。 步骤1:创建工程CLOCKYS,返回实例,53,步骤2:创建

46、一个新类CClockEx,从CStatic(静态控件)类派生出类CClockEx 来实现时钟控件类,这样,就可以继承MFC静态控件的很多已经具备的功能和特点.,54,步骤3:添加消息响应建立时钟控件的轮廓,时钟控件的轮廓 单击“查看建立类向导” 调出Class Wizard,在class name中选择刚建立的新类CClockEx,进行如下工作:,重载虚函数PreSubClassWindow 对时钟控件的基本初始化工作将在该函数中进行。 添加WM_PAINT消息响应 用于完成时钟的绘制工作。 添加WM_SIZE消息响应 以便设计的时钟控件能自动适应其大小的变化。 添加WM_TIMER的消息响应

47、 定时刷新时钟控件让它走动。 此时,时钟控件的轮廓已建好。效果如图所示。,55,步骤4:时钟设计时钟元素,时钟绘制的具体实现。 时钟大致由:时钟背景、时针、分针、秒针4个部分构成。这4个部分可看作4个不同的对象,可以考虑建立类来分别实现。 。 CClockBackground (背景) CClockHourHand(时针) CClockMinHand(分针) CClockSecHand(秒针) 这4个类有它们的共同点: 都有自己的绘图函数; 都有自己的绘图颜色; 都应有颜色设置函数; 都有绘图区域和区域设置函数等等。 因此,可以为它们的共性建立一个基类,命名为: CClockElement(时

48、钟元素)。,56,步骤4续:创建时钟基类CClockElement,先建各个组成类的基类: CClockElement 方法: 右键单击ClassView的工程选择New Class; 在ClassType里面选择Genenric Class,类; CClockElement不需要从其它类派生,所以Base Class可以不填,效果如右图所示。,57,步骤4续:创建时钟基类CClockElement代码,对类CClockElement的源代码进行编写。 添加头文件 #include 因后面的绘图中需要用到sin和cos这两个数学计算公式。 为后面计算使用,定义数学常量 PI(3.1415926

49、535)。 在基类中定义绘图区域变量 时钟的每个组成部分都有绘图区域区域,可定义颜色变量。 为了是颜色不显得单调,这里为每个控件设置两种颜色(如果想使程序更加绚丽,可以设置更多颜色)。 增加接口函数 这些变量需增加接口函数来进行访问。 每个组成部分都应该有的Draw(绘图)函数 也需在基类中定义,但是,该函数对于基类来说是无需函数实现的,因此可定义为纯虚函数。,58,步骤4续:创建时钟基类CClockElement代码,/ ClockElement.h: interface for the CClockElement class. CClockElement的实现的头文件代码如下: #if !

50、defined(AFX_CLOCKELEMENT_H_08A9DFB3_95C0_4D70_9BC0_96D3BACAB74A_INCLUDED_) #define AFX_CLOCKELEMENT_H_08A9DFB3_95C0_4D70_9BC0_96D3BACAB74A_INCLUDED_ #if _MSC_VER 1000 #pragma once #endif / _MSC_VER 1000 #include #define PI 3.1415926535 class CClockElement public: void SetColor(COLORREF crMain, COLOR

51、REF crOther);/设置颜色 void SetTime(const CTime ,59,CClockElement的实现的源文件关键代码如下:,/ ClockElement.cpp: CClockElement:CClockElement() /时钟基类构造函数 m_nRadius = 0; /时钟半径 m_crMain = RGB(255, 255, 255); /主要颜色 m_crOther = RGB(128, 128, 128);/辅助的其他颜色 CClockElement:CClockElement() /时钟基类析构函数 /设置绘图区域函数 void CClockEleme

52、nt:SetRegion(LPRECT lprcRect) m_rcRegion = lprcRect; /区域取值 m_nRadius = m_rcRegion.Width() / 2; /半径取值 if (m_rcRegion.Width() m_rcRegion.Height()/半径的宽度和顶点比较 m_nRadius = m_rcRegion.Height() / 2; /设置当前时间函数 void CClockElement:SetTime(const CTime /获取其他颜色 ,60,步骤5:创建时钟背景类CClockBackground,时钟背景类CClockBackgrou

53、nd 操作方法: 在ClassView的工程名上面点右键,选择New Class, 在ClassType里面选择Genenric Class, 选择类Base Class CClockElement类 因CClockBackground需从类CClockElement派生 效果如图所示。,61,步骤5续:创建时钟背景类CClockBackground,CClockBackground只需实现基类的虚函数Draw即可,因此这里重载基类的虚函数Draw,其头文件实现代码如下(不用编写,由系统生成): #include ClockElement.h class CClockBackground :

54、public CClockElement public: CClockBackground(); virtual CClockBackground(); ;,62,CClockBackground源文件代码如下:,/ ClockBackground.cpp: /时钟背景函数 CClockBackground:CClockBackground() /为时钟背景定义默认的颜色设置 m_crMain = RGB(0, 255, 0); /主颜色为绿色 m_crOther = RGB(0, 128, 0); /其他颜色为深绿色 CClockBackground:CClockBackground() ,

55、63,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); /创建主画刷和其他画刷 /将其他

56、画笔选入内存DC,同时暂时挤出并保存原画笔 CPen *pOldPen = pDC-SelectObject( ,64,CClockBackground源文件代码如下(续2):,/绘制12个小方框,表示12个正点 pDC-SelectObject( /恢复内存DC中原有的画刷,65,步骤6:创建时针类CClockHourHand实现,实现时针类CClockHourHand 该类新建的过程与CClockBackground一样。 选择类Base Class CClockElement类 因CClockHourHand需从类CClockElement派生 CClockHourHand同样只需实现基

57、类的虚函数Draw即可 其头文件实现代码如下: #include ClockElement.h class CClockHourHand : public CClockElement public: CClockHourHand(); virtual CClockHourHand(); virtual void Draw(CDC *pDC); ;,66,CClockHourHand源文件代码如下:,CClockHourHand:CClockHourHand() /定义默认颜色 m_crMain = RGB(0, 255, 100); m_crOther = RGB(128, 128, 0);

58、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(,67,CClockHourHand源文件代码如下(续):,/确定绘制菱形指针所需的四个角的坐标 CPoint ptDiamond4; for(int i=0; iPolygon(ptDiamond, 4); /恢复设备环境 pDC-SelectObject(pOldPen); pDC-SelectObject(pOldBrush); ,68,步骤7:创建分针类CClockMinHand实现,实现分针类CClockMinHand 该类新建的过程与CClockHourHand一样,类的实现也基本相似,其头文件实现代码如下: CClockMinHand类 因CClockMinHand需从类CClockElement派生 CClockMinHand同样只需实现基类的虚函数Dra

温馨提示

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

评论

0/150

提交评论