MFC编程基础教程_第1页
MFC编程基础教程_第2页
MFC编程基础教程_第3页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、第1章基于对话框的Windows应用程序1. 简介Windows编程的两种方法,即WindowsAPI编程和MFC编程。2. 基于对话框的应用程序的创建过程:建立基于对话框的MFC应用程序框架;放置控件;设置控件属性;为控件连接变量,即为控件命名;添加并且编写消息处理函数。3. 常用基本控件:静态文本框:主要用来显示文本信息,不能接受用户输入命令按钮:是最常见的、应用最广泛的一种控件。在程序执行期间,当单击某个命令按钮后就会执行相应的消息处理函数。编辑框:是一个文本编辑区域,用户可以在该区域输入、编辑和显示正文内容。框架:将一组相关的控件框起来,达到标识一组控件的作用。单选按钮:用户在一组单选

2、按钮中最多只能选择一项。当某一项被选定后,其他选项自动变成未选状态。复选框:列出了可供选择的项,用户可根据需要选择其中的一项或多项,各选项之间的状态互不相关。列表框:通过显示多个选项,供用户选择,达到与用户对话的目的。组合框:组合了编辑框和列表框的特性而形成的一种控件。在列表框中列出可供用户选择的项,当用户选定某项后,该项内容自动装入编辑框中。滚动条:通常附在对话框上用来协助观察数据或确定位置,也可以用来作为数据输入的工具。Windows编程基础Windows应用程序的主要特点是:具有标准的图形用户界面。具有与硬件无关的特性。采用“消息传递,事件驱动”的运行机制。用VisualC+编写Wind

3、ows应用程序主要有两种方法:一是使用Windows提供的应用程序接口(ApplicationProgrammingInterface,API)函数;二是使用Microsoft提供的微软基础类(MicrosoftFoundationClass,MFC)。1.1.1WindowsAPI编程从本质上来说,API是Windows系统支持的函数定义、参数定义和消息格式的集合,共有上千个标准的API函数可供应用程序调用。调用WindowsAPI函数的方法与调用C语言库函数的方法基本相同。下面通过一个简单的实例来说明WindowsAPI编程是如何调用API函数的。#include""i

4、ntAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)MessageBox(NULL,"这是一个简单的Windows应用程序!","API函数调用示例",MB_OK);return0;这是一个简单的Windows应用程序。Windows应用程序的主函数是WinMain(),不是main()函数。函数体中调用了WindowsAPI函数MessageBox(),弹出如图所示的对话框。在直接使用API函数进行Windows编程时,程序员不仅需

5、要熟记一大堆常用的API函数,而且还要对Windows操作系统有深入的了解,编写大量的代码。用这种方式即使是开发一个很简单的应用程序也需要大量的工作,直接用API函数进行编程是需要极大的耐心和丰富的编程经验的。1.1.2MFC编程MFC是VisualC+的核心。虽然在Windows应用程序中可以直接调用API函数,但是一般不经常直接调用,而是从MFC类创建对象并调用属于这些对象的成员函数。MFC是Microsoft公司提供的用来编写Windows应用程序的C+类库,MFC大约有200多个类,可以分成两种:一是Cobject类的派生类,它们以层次结构的形式组织起来,几乎每个子层次结构都与一个具体

6、的Windows实体对应;二是非Cobject派生类,这些都是独立的类,如表示点的Cpoint类,表示矩形的Crect类。在VisualC+中,可以创建以下3类典型的Windows应用程序,它们都是通过MFCAppWizard(exe)(以下简称AppWizard)向导创建的:(1)基于对话框的应用程序:这类程序适合于文档较少而交互操作较多的应用场合,如Windows自带的计算器程序。(2)单文档界面(SDI)应用程序:这类程序一次只能打开一个文档,如Windows自带的Notepad程序。(3)多文档界面(MDI)应用程序:这类程序可以同时打开多个文档并进行处理,处理的过程中很容易地进行切换

7、,如MicrosoftWord。基于对话框的Windows应用程序对话框是一种特殊类型的窗口,绝大多数Windows程序都通过对话框与用户进行交互。在VisualC+中,对话框既可以单独组成一个简单的应用程序,又可以成为文档/视图结构程序的资源。1.2.1简单应用程序实例创建对话框程序的步骤:(1)建立基于对话框的MFC应用程序框架;(2)放置控件;(3)设置控件属性;(4)为控件连接变量,即为控件命名;5)添加并且编写消息处理函数。例】编写一个如图所示的应用程序。若单击“复制”按钮,则把上面的编辑框中的内容复制结束”按钮,则退出程序的运行。到下面的编辑框中;若单击程序的创建过程:(1)建立基

8、于对话框的选择“文件|新建”在“工程”选项卡中,选定“D基本对话”,即创建基于对话框的应用程序,选择“完成”。(2)放置控件删除原有的控件。放置所需的控件:两个编辑框和两个命令按钮。方法是:先单击控件工具栏上的控件图标选择所需的控件,然后在对话框设计界面上按住鼠标左键拖拉出所需要的大小后释放。(3)设置控件属性选定控件,在其快捷菜单中选择“属性”命令,在弹出如图所示的对话框中进行设置。上面编辑框的属性设置为:选定“选定“选定“下面编辑框属性的设置与上面编辑框基本一样,只是可以不选定“从图中可以看到编辑框的ID为IDC_EDIT1,这是该控件的标识。某些函数需要通过ID对控件进行操作。(4)连接

9、变量为控件连接变量就是为控件起一个名称。每一个控件都是一个对象,是通过对象来实现的。为IDC_EDIT1连接变量m_e1的步骤为:在IDC_EDIT1编辑框的快捷菜单中选“建立类向导”,弹出“在“MemberVariables”中,选定“IDC_EDIT1”,再选择“在“AddMemberVariable”对话框中输入以下的数据:MemberVariablename(内存变量名):m_e1;Category(类别):Control;Variabletype(类型):Cedit用同样的方法再为IDC_EDIT2连接一个变量m_e2。(5)添加并且编写消息处理函数。本例要求单击“复制”按钮后上面编

10、辑框中的内容复制到下面的编辑框中。行时,在“复制”按钮上发生单击事件后,Windows向对话框发出了一个CTESTDlg类应有一个处理该消息的函数。添加和编写这个消息处理函数的过程是:双击"复制”按钮,弹出的"AddMemberFunction”对话框,输入函数名(缺省函数名为OnButton1),选择“确定”按钮后,添加了一个空函数。另一个方法是在“MFCClassWiard”对话框“MessageMaps”选项卡中,选定IDC_BUTTON1和BN_CLICKED消息,然后选择“AddFunction”按钮即可。添加的空函数如下:voidCTESTDlg:OnButto

11、n1()MFC应用程序框架。命令;选定“MFCAppWizard(exe)”,输入工程名称,选择“确定”。Multiline”复选框,编辑框中可以输入多行文本。Verticalscroll”和“AutoVscroll”,编辑框将有垂直滚动条。Wantreturn”。1.2.21.3.11.3.21.3.3属性设置编辑框的属性主要在Styles选项卡中设置。重要属性有:Wantreturn”。任何一个控件都有一个ID,调用MFC类库中的函数都MFCClassWiard”对话框。AddVariable”命令。也就是说,在程序运BN_CLICKED消息,1)Multiline:定义该编辑框为多行文本

12、框。2)Number:限定输入的字符只能是数字字符。3)Border:为控件创建边界。4)Read-only:编辑框成为只读的,禁止用户编辑。2. 成员函数编辑框常用的成员函数见表。此外编辑框还可以使用CWnd类的成员函数。CWnd类的重要成员函数有:(1) 获取编辑中的内容形式1:voidGetWindowText(CString&rString)const;说明:将编辑框中的内容复制到CString类对象rString中。示例:将编辑框m_e中的内容复制到CString类对象ch中。CStringch;(ch);形式2:intGetWindowText(LPTSTRlpszStri

13、ngBuf,intnMaxCount)const;说明:将编辑框中的内容复制到lpszStringBuf中,最多复制nMaxCount个字符。lpszStringBuf是字符数组或字符指针。示例:将编辑框m_e中的内容复制到字符数组ch中。charch80;(ch,80);(2) 设置编辑框中的内容3. 形式:voidSetWindowText(LPCTSTRlpszString);说明:将lpszString中的内容替换编辑框中原有内容,lpszString是字符数组或字符指针。示例:设置编辑框中的内容为“abcdefg”charch20="abcdefg"(ch);连接

14、变量编辑框在连接变量时,除了要指定变量名之外,还要确定变量类别。变量类别有两个可选择:一是Control,意味着该变量作控件使用,对应的变量类型只能是Cedit,可以使用该控件类的成员函数;二是Value,意味着该变量当作C/C+中普通的变量使用,对应的变量类型有CString、int、double等,可以使用这些数据类型的函数,但是不能使用控件的成员函数。若一个编辑框连接了一个Value类别的变量,则该变量就表示这个编辑框,编辑框中显示的内容就是变量的值。但是,改变了编辑框的内容并不会自动更新对应的变量的值,同样,改变了变量的值也不会自动刷新编辑框的内容。若要保持一致,需要使用UpdateD

15、ata()函数更新,如图所示。若编辑框的内容改变了,则应使用语句UpdateData(TRUE);更新对应的变量的值;若变量的值改变了,则应使用语句UpdateData(FALSE);刷新编辑框的内容。4. 消息处理函数在编辑框能处理的消息中是最重要的是EN_CHANGE,这是编辑框中的文本被修改后发出的消【例】输入一元二次方程ax2+bx+c=0的系数a、b、c,计算并输出两个根x1、x2,如图所示。求方程的根对话框上有5个静态文本框、5个编辑框和2个命令按钮。编辑框按表连接变量,其余控件不需要连接变量。为了要计算b2-4ac的平方根,需要使用sqrt()函数,因此在文件的开始添加了文件包含

16、命令:#include""1.4.11.4.2设计要求同一组中的按钮必须一个接一个地放进对话框中,中间不能插入其他控件,并且一个组的第一个按扭要选中“Group'属性,表示一组控件的开始。2. 重要属性(1)ID:每个命令按钮都有一个缺省ID,如IDC_RADIO1,可以重新设置。(2)标题:该属性值就是单选按钮右边显示的文本标题。(3)Group:一组中第一个按钮选中该属性,表示它是一组的开始。3. 消息单选按钮能处理的消息是BN_CLICKED。4. 重要函数(1)设定单选按钮选中状态初始时,可使用WindowsAPI函数CheckRadioButton()设定

17、一组单选按钮中选中的按钮。形式:voidCheckRadioButton(intnIDFirstButton,intnIDLastButton,intnIDCheckButton);说明: nIDFirstButton是一组中第一个单选按钮的ID; nIDLastButton是一组中最后一个单选按钮的ID; nIDCheckButton为初始时设置为选中的那个单选按钮的ID。(2)判定单选按钮是否被选定形式:UINTIsDlgButtonChecked(intnIDButton)const;说明:如果ID为nIDButton的按钮被选定,则该函数的返回值为true,否则为false。【例】设计

18、一个如图所示的程序。当单击“确定'后,用AfxMessageBox函数显示一个如图所示的消息框。(1)界面设计首先创建一个对话框程序框架,然后放置各控件,进行属性设置,将编辑框连接到Cstring类型的m_e变量,其余控件不需要连接变量。将“男'和“教授'对应的单选钮的Group属性勾上。(2)初始化单选按钮的初始化工作在对话框的初始化函数实现。BOOLCTESTDlg:OnInitDialog()CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);CheckRadioButton(IDC_RADIO3,IDC_RADI

19、O5,IDC_RADIO3);3)消息处理函数voidCTESTDlg:OnButton1()1.4.3重要属性(1)ID:每个复选框都有一个缺省ID,如IDC_CHECK1,可以重新设置。(2)标题:该属性值决定了复选框右边显示的文本标题。2. 连接变量复选框通常被连接到Value类别BOOL类型的变量。3. 消息复选框能处理BN_CLICKED消息。4. 【例5】设计一个如图所示的程序。当单击“确定”后,在右边的编辑框中显示有关信息。复选框应用示例界面设计首先创建一个对话框程序框架,然后放置各控件,进行属性设计,各编辑框和复选框按表连接变量,其余控件不需要连接变量。消息处理函数voidCT

20、ESTDlg:OnButton1()1.5.1属性设置列表框的属性在如图所示的属性窗口中设置。重要的属性有:(1)Selection该属性决定用户的选择方式,缺省值为Single。属性值有:Single单项选择Multiple多项选择,但是忽略Ctrl和Alt键。Extended允许使用Ctrl和Alt进行多项选择None禁止选择(2)Sort当该属性被选定后,列表框中的选项按字母顺序排列。2. 常用成员函数(1)添加项目格式:intAddString(LPCTSTRlpszItem);例如:语句m_l.AddString("陈蓉");把“陈蓉”添加到了列表框m_l中。(2

21、)删除项目格式:intDeleteString(UINTnIndex);说明:nIndex表示被删除项目在列表框中的位置,对于第一个选项,nIndex应为0。例如:语句m_l.DeleteString(4);删除列表框中的第5个项目。(3)获取当前被选定的项目的序号格式:intGetCurSel()const;例如:语句intI=();将使I获得m_l列表框中当前选定的项目的序号。(4)获取列表框中指定的项目格式1:intGetText(intnIndex,LPTSTRlpszBuffer)const;格式2:voidGetText(intnIndex,CString&rString)

22、const;说明:将列表框中第nIndex个选项的文本送到lpszBuffer或rString中。例如:假定有说明语句chars120;CStrings2;,则语句m_l.GetText(4,s1);和m_l.GetText(4,rString);把第5项内容分别送到s1和s2中。【例1.6】编写一个能对列表框进行项目添加、修改和删除操作的应用程序,如图所示。“添加”按钮的功能是将文本框中的内容添加到列表框,“删除”按钮的功能是删除列表框中选定的选项。如果要修改列表框,则首先选定选项,然后单击“修改”按钮,所选的选项显示在文本框中,当在文本框中修改完之后再单击“修改确定”按钮更新列表框。列表框

23、应用示例(1)界面设计首先创建一个对话框应用程序框架,然后放置按钮。列表框和命令按钮按表连接变量,其余控件不需要连接变量。(2)初始化列表框的选项在对话框的初始化函数中用AddString函数添加。BOOLCTESTDlg:OnInitDialog()1.5.2属性设置(1)类(Type)该属性用于指定组合框的类型,共有三个选择:Simple、Dropdown和Droplist,默认值为Dropdown。(2)键入列表框项(Enterlistboxitems)在列表框的属性窗口“Data”选项卡中有一个键入列表框项,这是在设计阶段输入选项的地方,如图所示。每当输入一项后按Ctrl+Enter键

24、才能输入下一项。(注意在设计ComboBox时,点下向下箭头,然后将控件下边向下拉,之后才输入数据,这样才能显示出ComboBox的下拉的项。或者,在新建该控件时往下拖放足够大的区域)组合框属性窗口Data选项卡2.常用成员函数编辑框和列表框的成员函数几乎都可以用于组合框,但是列表框的成员函数GetText()在组合框中的是GetLBText()。形式1:intGetLBText(intnlndex,LPTSTRIpszText)const;形式2:voidGetLBText(intnlndex,CString&rString)const;说明:使用GetLBText函数可以将组合框中

25、的第nlndex个项目的文本送入IpszText或rString中。3. 组合框发出的消息(1) CBN_SELECTCHANGE:组合框的列表框中的选项改变时发送。(2) CBN_EDITCHANGE:组合框的编辑框中文本改变时发出。【例】设计一个如图所示的对话框。如果单击"确定”按钮,则用MessageBox显示如图所示的信息框。(1) 首先创建一个对话框程序框架,然后放置各控件,进行属性设置,组合框的选项在设计阶段直接输入,按表连接变量,其余控件不需要连接变量。消息处理函数voidCTESTDIg:OnButton1()亡卑课誓闻用示例冈pm1nftot*世團L2.24.12-

26、m.%d");文档/视图结构的思想是将数据的管理与显示分离,其中文档用于管理应用程序的数据,而视图是用户界面,用于显示、打印文档中的数据,并管理与用户的交互。SDI具有文档/视图结构的应用程序框架,该框架包括应用程序类、窗口框架类、文档类和视图类,编程的任务是在文档类和视图类中添加适当的代码。其中文档类中一个重要的成员函数是OnNewDocument(),用户在此添加代码完成对数据的初始化;而视图类中最重要的成员函数是OnDraw(),通过在该函数中添加代码实现窗口内容的输出。2. 通过介绍几种SDI结构的典型应用程序来了解其结构及设计方法,典型应用包括:利用画笔、画刷等工具及位图处

27、理的方法实现文字和图形的输出。利用定时器控件制作动画程序。对鼠标和键盘进行编程的基本方法。文件、字体、颜色等几种通用对话框的使用方法及自定义对话框的设计、调用方法。菜单的设计方法。文档/视图结构SDI应用程序由AppWizard创建好后,即使没有编写一行代码,仍然可以运行,并且具有一个标准Windows应用程序所需要的组成成份,程序员的工作就是往这个框架添加必要的代码。以下通过一个简单实例说明文档/视图结构应用程序的创建过程。自强不【例】创建一个如图所示的应用程序,在窗口中显示一个矩形框,框中显示“同舟共济息”。假定本例的工程名为TEST,程序创建过程如下:(1) 利用AppWizard创建一

28、个SDI应用程序框架。文档类是存放数据的主要地方,本例在其中说明一个存放矩形框数据的CRect类对象r和一个存放字符串的CString对象s,方法为:在工作区的“ClassView”中,双击CTESTDoc类,在该类代码中添加如下代码:public:CRectr;CStrings;说明:CRect是MFC定义的一个类,有4个数据成员:left、top、right和bottom。(left,top)和(right,bottom)分别表示一个矩形左上角坐标和右下角坐标。(2) 在文档类的成员函数OnNewDocument()中完成数据成员的初始化。方法为:在工作区的ClassView中展开CTES

29、TDoc类,找到其成员函数OnNewDocument(),在其中添加代码:BOOLCTESTDoc:。nNewDocument()if(!Cdocument:OnNewDocument()returnFALSE;OC)|*.DOC|TextFiles(*.TXT)|*.txt|AIIFiles|*.*|"其它参数一般使用缺省值-DoModal()函数固DoModal()函数的功能是打开打话框。其使用形式为:对象.DoModal()GetPathName()用于获取用户选择的包括路径在内的文件名。其函数原形为:CStringGetPathName()const;GetFileName(

30、)用于获取用户选择的文件名,不包括路径。其函数原形为:CStringGetPathName()const;GetFileExt()返回文件扩展名GetFileTitle()返回文件主名(不含扩展名)【例】编写一个如图所示的图形浏览程序。若用户单击左键,则弹出打开对话框,用户选择一个图片文件后就在客户区显示该图片。(1) 在文档类中添加一个公有数据成员m_filename,用于存放用户选择的包括路径在内的文件名。public:CStringfilename;(2) 在文档类的OnNewDocument()函数中对数据成员filename进行初始化。filename=""(3)

31、 通过“建立类向导”为视图类添加WM_LBUTTONDOWN消息处理函数,并编写代码。voidCTESTView:OnLButtonDown(UINTnFlags,CPointpoint)MP)|*.BMP);if()=IDOK)pDoc->filename=();Invalidate();CView:OnLButtonDown(nFlags,point);(4) 在OnDraw()函数中,显示位图。voidCTESTView:OnDraw(CDC*pDC)CTESTDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);mp文件应使用LoadImage()。

32、其函数原型为:HANDLELoadlmage(HINSTANCEhinst,LPCTSTRlpszName,UINTuType,intcxDesired,intcyDesired,UINTfuLoad);其中:hinst可以用NULL,lpszName是图象在磁盘上的文件名,uType表示图象的类型,fuLoad的值为LR_LOADFROMFILE表示从文件中导入位图。颜色对话框属于CColorDialog类。其一般使用形式为:CColorDialogdlg;GetColor();知GetColor();*S1f,pDoc->total/5);pDC->TextOut(1O,1O,

33、str);("总分:%.1f',pDoc->total);pDC->TextOut(1O,3O,str);voidCTESTView:OnLButtonDown(UINTnFlags,CPointpoint)/TODO:Addyourmessagehandlercodehereand/orcalldefaultCTESTDoc*pDoc=GetDocument();CInputdlg;if()=IDOK)pDoc->total=+;Invalidate。;CView:OnLButtonDown(nFlags,point);菜单设计菜单属于CMenu类。Windows应用程序的菜单由两部分组成:一是主菜单,一般位于顶层;二是弹出菜单,它是单击主菜单中的菜单项时弹出的子菜单。设计菜单的主要操作有:(1)显示菜单在工作区中选定“ResourceView”,展开Menu,双击其中的IDR_MAINFRAME,可以看到由AppWizard生成的标准菜单。(2)删除菜单项先选定菜单项,然后按Del键。(3)添加菜单项双击空白菜单框,弹出"MenuItemProperties”,输入菜单项的标题(名称)

温馨提示

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

评论

0/150

提交评论