1、MFC编程入门主要内容主要内容MFC简介简介MFC基础知识基础知识MFC编程编程从从DOSDOS到到WindowsWindows的飞跃的飞跃WindowsWindows消息映射机制消息映射机制Windows是一个多进程的图形窗口操作系统基于事件的消息(Message)驱动系统。事件消息处理消息名称参数:WPARAM、LPARAM窗口Windows编程机制(编程机制(API)关于API和SDK Windows API(Application Programming Interface):Windows操作系统与应用程序之间的标准接口,它提供了上千个标准函数、宏和数据结构的定义。传统SDK(Sta
2、ndard Development Kit)编程:程序员通过调用API函数,自己动手、按部就班地实现程序各部分的功能。SDK应用程序的结构比较清晰,但程序员必须编写所有的功能代码。MFC(Microsoft Foundation Classes)微软基础类库C+与Windows API的结合彻底地用C+封装了Windows SDK的结构和功能提供了一个应用程序框架:各种窗口、工具栏、菜单的生成和管理等。Visual Studio 2010Visual Studio包含了VB、VC+、C#等编译环境。VC+不仅是一个编译器更是一个集成开发环境,包括编辑器、调试器和编译器等解决方案管理多个工程每个
3、应用程序作为一个工程MFCMFC主要数据类型主要数据类型数据类型意义BOOLBoolean值(布尔值,不是TRUE,就是FALSE)BSTR32-bit字符指针BYTE8-bit整数,不带正负号WORD16-bit整数,未带正负号DWORD32-bit整数,未带正负号LONG32-bit整数,带正负号UINTWin32中是一个32-bit未带正负号的整数COLORREF32-bit数值,代表一个颜色MFCMFC主要数据类型主要数据类型数据类型意义LPSTR32-bit指针,指向一个字符串LPCSTR32-bit指针,指向一个常数字符串LPTSTR32-bit指针,指向一个字符串,此字符串可移植
4、到Unicode和DBCS(双字节字集)LPCTSTR32-bit指针,指向一个常数字符串,此字符串可移植到Unicode和DBCS(双字节字集)LPVOID32-bit指针,指向一个未指定类型的数据POSITION一个数值,来表collection对象(例如数组和链表)中的元素位置LPCRECT32-bit指针,指向一个不变的RECT结构MFCMFC主要数据类型主要数据类型数据类型意义WNDPROC32-bit指针,指向一个窗口函数LPRESULT32-bit数值,作为窗口函数或callback函数的返回值LPARAM32-bit数值,作为窗口函数或callback函数的一个参数WPARAM
5、Win16中是16bit,Win32中是32bit,作为窗口函数或callback函数的一个参数MFCMFC体系结构体系结构MFC主要组成部分:类、宏和全局函数。类是MFC中最主要的内容。MFC类是以层次结构方式组织起来的。几乎每一个派生层次都与一具体的Windows实例相对应,如文档类、窗口类和视图类等。MFC宏主要功能:消息映射、运行时对象类型服务、诊断服务、异常处理。MFC约定:全局函数以“Afx”为前缀,全局变量以“afx”为前缀。MFCMFC类类的主要层次结构的主要层次结构CObjectCCmdTargetCWinTreadCWinAppCDocumentCWndCFrameWndC
6、DialogCViewCObjectCObject类:类:MFCMFC的抽象基类的抽象基类不能派生不能派生对象对象提供了许多公共操作和基本提供了许多公共操作和基本服务:服务:对象的动态建立与删除、序列化(即串行化)的对象的动态建立与删除、序列化(即串行化)的支持、对象诊断输出、运行时信息管理以及集合支持、对象诊断输出、运行时信息管理以及集合类的兼容等类的兼容等CCmdTargetCCmdTarget类:消息映射类类:消息映射类所有具有消息映射属性的基所有具有消息映射属性的基类类消息映射规定了当对象接到命令消息时,应调消息映射规定了当对象接到命令消息时,应调用哪一个函数对该消息进行处理。用哪一个
7、函数对该消息进行处理。CWinAppCWinApp:窗口应用程序类:窗口应用程序类每一个MFC应用程序只能包含一个从WinApp派生的应用程序对象当VC的其它全局对象被构造时,这个对象也同时被构造,当Windows调用WinMain()函数时,产生的对象已经有效了。从CWinApp实例化的应用程序对象是一个全局变量,在程序运行中该对象可以与其它对象相互协调。CWinAppCWinApp类的组成类的组成(1)访问CWinApp对象以及全局函数。AfxGetApp:获得一指向CWinApp对象的指针AfxGetResourceHabdle:获得一应用程序资源的句柄。AfxGetAppName:获得
8、指向一个包含应用程序名的字符串的指针。(2)CWinApp的公共数据成员m_pszAppName:指定应用程序的名称。m_nCmdShow:指定窗口的显示方式。m_pMainWnd:包含一个指针,它指向一个应用程序的主窗口。(3)CWinApp的公共成员函数LoadCursor:调取光标资源。:调取光标资源。LoadStandardCursor:调取:调取Windows预定义光标,在预定义光标,在windows.h中指定中指定IDC常量。常量。LoadIcon:调取一个图标资源。:调取一个图标资源。LoadStandardIcon:调取:调取Windows预定义的图标,在预定义的图标,在win
9、dows.h中指定中指定IDI常量。常量。OpenDocumentFile:框架调用此函数打开一个指定的文:框架调用此函数打开一个指定的文档。档。CWinAppCWinApp类的组成类的组成(4)CWinApp的可重载的函数InitApplication:重载以执行任何应用程序层次上的初始化。:重载以执行任何应用程序层次上的初始化。InitInstance:重载以执行:重载以执行Windows对象实例的初始化,诸对象实例的初始化,诸如建立用户窗口对象等。如建立用户窗口对象等。Run:运行缺省的消息循环,重载该函数以自定义消息循:运行缺省的消息循环,重载该函数以自定义消息循环。环。OnIdle:
10、重载以执行任何应用程序指定的空闲时间处理。:重载以执行任何应用程序指定的空闲时间处理。PreTranslateMessage:在窗口消息被:在窗口消息被TranslateMessage()和和DispatchMessage()处理之前过滤它们处理之前过滤它们。CWinAppCWinApp类的组成类的组成对话框是一个特殊窗口,该类是从CWnd类中派生出来的。InitApplication:重载以执行任何应用程序层次上的初始化:重载以执行任何应用程序层次上的初始化。InitInstance:重载以执行:重载以执行Windows对象实例的初始化,诸对象实例的初始化,诸如建立用户窗口对象等如建立用户窗
11、口对象等。Run:运行缺省的消息循环,重载该函数以自定义消息循环:运行缺省的消息循环,重载该函数以自定义消息循环。OnIdle:重载以执行任何应用程序指定的空闲时间处理:重载以执行任何应用程序指定的空闲时间处理。PreTranslateMessage:在窗口消息被:在窗口消息被TranslateMessage()和和DispatchMessage()处理之前过滤它们处理之前过滤它们。CDialogCDialog:对话框类:对话框类MFCMFC编程主要流程编程主要流程创建对话框模板和修改对话框属性为对话框添加静态控件创建对话框类和添加控件变量为控件添加消息处理函数创建对话框模板和修改对话框属性创
12、建对话框模板和修改对话框属性创建对话框模板和修改对话框属性创建对话框模板和修改对话框属性创建对话框模板和修改对话框属性创建对话框模板和修改对话框属性窗口应用程序类CHelloMFCApp对话框类CHelloMFCDlg创建对话框模板和修改对话框属性创建对话框模板和修改对话框属性创建对话框模板和修改对话框属性创建对话框模板和修改对话框属性解决方案资源管理器类视图资源视图属性工具箱初始化创建的工程包含的文件初始化创建的工程包含的文件HelloMFC.h:应用程序的主头文件。主要包含由CWinAppEx类派生的CHelloWorldApp类的声明,以及CHelloWorldApp类的全局对象theA
13、pp的声明。HelloMFCDlg.h:对话框的主头文件。主要包含由CWinAppEx类派生的CHelloMFCDlg类的声明。HelloWorld.rc:包含默认菜单定义、字符串表和加速键表,指定了默认的About对话框和应用程序默认图标文件等。Resource.h:含有各种资源的ID定义。stdafx是预编译头文件,在其中包含的头文件之外第一次编译时编译,之后若不修改,不会再编译这些头文件,加快了编译的速度。targetver定义了程序运行需要的最低Windows版本,如果你要在旧版本的Windows(如非NT架构的Win98)上运行,除了代码部分还需要修改这个头文件。控件类包含若干个可视
14、控件,使用这些类可建立静态文控件类包含若干个可视控件,使用这些类可建立静态文本、命令按钮、位图按钮、列表框、组合框、滚动条和本、命令按钮、位图按钮、列表框、组合框、滚动条和编辑框等,这些可视控件为编辑框等,这些可视控件为Windows应用程序提供了各应用程序提供了各种输入和显示界面。种输入和显示界面。(1)CStatic (2)Cbutton (3)CEdit(4)CScrollBar(5)CSliderCtrl(6)CListBox (7)CComboBoxl(8)CBitmapButton (9)CAnimateCtrl(10)CTreeCtrl (11)CListCtrl控件类控件类为对
15、话框为对话框添加静态控件添加静态控件在工具箱中,拖入主窗口界面中即可进入属性栏可修改其基本参数为对话框中的控件添加变量为对话框中的控件添加变量control型变量可以获得控件的实例,通过这个变量,你可以操纵控件。而value只是用来传递数据,不能对控件进行其它的操作。对话框类的数据交换和检验对话框类的数据交换和检验void CHelloMFCDlg:DoDataExchange(CDataExchange*pDX)CDialogEx:DoDataExchange(pDX);DDX_Text(pDX,IDC_EDIT_INPUT,number);DDV_MinMaxInt(pDX,number,
16、1,1000);DoDataExchange()并不是被自动调用的,而是需要我们在程序中调用CDialogEx:UpdateData()函数,由UpdateData()函数再去自动调用DoDataExchange()的。BOOL UpdateData(BOOL bSaveAndValidate=TRUE);TRUE表示从控件传给变量,FALSE表示从变量传给控件。返回值表示操作是否成功,成功则返回TRUE,否则返回FALSE。为控件添加消息处理为控件添加消息处理函数函数多多种方法种方法:1.使用使用Class Wizard添加消息处理添加消息处理函数函数2.通过通过“Add Event Han
17、dler.”添加消息处理添加消息处理函数函数3.在按钮的属性视图中添加消息处理函数在按钮的属性视图中添加消息处理函数4.双击按钮添加消息处理函数双击按钮添加消息处理函数列表框控件列表框控件ListBoxListBox列表框给出了一个选项清单,允许用户从中进行单项或多项选择。因为我们只用于输出结果,故要选择添加control类型变量。列表框控件列表框控件ListBoxListBoxCString s;s.Format(_T(你输入的数是:%4d),number);/Format是格式化输入。_T是一个宏,作用是让你的程序支持Unicode编码。result.AddString(s);/int A
18、ddString(LPCTSTR lpszItem);此函数用来向列表框中添加字符串。如果列表框指定了LBS_SORT风格,字符串就被以排序顺序插入到列表框中,如果没有指定LBS_SORT风格,字符串就被添加到列表框的结尾。参数:lpszItem指定了要添加的字符串。返回值:返回字符串在列表框中添加的位置。如果发生错误则返回LB_ERR,内存不够则返回LB_ERRSPACE。随机数的产生随机数的产生#include#includesrand(int)time(0);/使用系统定时/计数器的值作为随机种子065535,每个种子对应一组根据算法预先生成的随机数。randomNum=rand()%N+1;/根据提供给srand()的种子值返回一个随机数(在0到32767之间)小小作业作业更友好提示的界面:按输入顺序显示动态显示区间输入错误处理按下回车键实现输入