《MFC基本应用程序的建立.doc》由会员分享,可在线阅读,更多相关《MFC基本应用程序的建立.doc(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第四章 MFC基本应用程序的建立 C+面向对象程序设计语言是在C语言的基础上发展起来的,它与传统的程序设计方式不同,而是一种新的程序设计范型。它对降低软件的复杂性,改善其重要性和维护性、提高软件的生产效率,有着十分重要的意义。因此面向对象程序设计被普遍认为是程序设计方法的一场实质性的革命 Visual C+是Microsoft公司推出的目前使用极为广泛的基于Windows平台的C+可视化开发环境,它使C+语言在Windows平台上得到了有效的可视化的应用。前面C+编程实例都是在控制台方式下运行的(Dos环境下),这样可以在不需要太多涉及Visual C+的细节而专心于C+程序设计的本身。但是,
2、当C+及程序设计基本掌握后,我们就不能仅停留在控制台方式下运行,因为学习C+的目的在于应用,从本章开始,将着重讨论如何用Visual C+的强大功能开发Windows应用程序。我们将看到,展现在你面前的是彩色亮丽的图形图像及千变万化的可移动的文字、影像界面。像市场流行的家庭娱乐软件,银行存储、招商及收银软件,企事业管理、教育及各大小网站的网页设计等。本章一、二节是Windows编程和MFC编程,不是我们重点掌握的,大家可以自己看看,也是有帮助的。我们从第三节(161页):使用MFC AppWizard(应用程序向导)开始讲。实际上,在Visual C+6.0中,我们不需要输入Windows程序
3、代码,就能创建所需要的应用程序,这就是我们着重掌握的MFC AppWizard(应用程序向导),它能为用户快速、高效、自动地生成一些常用的标准程序结构和编程风格,它们被称为应用程序框架类型(MFC AppWizard提供的各应用程序框架类型161页)其中:MFC AppWizard(exe)是我们常用的(一般MFC的Windows应用程序)ATL COM MFC AppWizard 创建ATL(Active Template Library)应用模块工程Cluster Resource TypeWizard创建Cluster Resource(用于Windows NT服务器)Custom MF
4、C AppWizard 创建自己的应用程序向导Database Project 创建数据库应用程序DevStudio Add-in Wizard 创建ActiveX组件或VBScrip宏Extended Store Proc Wizard 创建基于SQL服务器下的外部存储过程ISAPI Extension Wizard 创建Internet Server程序MakeFile 创建独立于Visual C+开发环境的应用程序MFC ActiveX ControlWizard 创建ActiveX Control应用程序MFC AppWizard(dll) MFC的动态连接库MFC AppWizard
5、(exe) 一般MFC的Windows应用程序Utility Project 创建简单、实用的应用程序Win32 Application 其它Win32的Windows应用程序Win32 Console Application Win32的控制台应用程序Win32 Dynamic-Link Library Win32的动态连接库Win32 Static Library Win32的静态连接库一、建一个一般MFC的Windows应用程序,屏幕上出现一个空窗口。 (注意:以后我们所建的应用程序一般都是此应用程序类型)1、在E盘建一个文件夹,名为:vcpp(存放你建的文件)2、双击桌面上的Micro
6、soft Visual C+系统: -File - New -Projects -MFC AppWizard(exe) 见 161 页表(解释) -输入路径名vcpp(事先建好的文件夹) -输入文件名:显示窗口 -OK(MFC AppWizard(exe)应用程序类型为:一般MFC的Windows应用程序)3、选SDI-一直缺省 最后便建立了一个名为:”显示窗口”的单文档应用程序-运行! 便出现一个空窗口。注意:见162-166页的制作过程(缺省各界面的情况)。我们没作任何保存,它自动存在你的文件夹vcpp里,要删除它,找到你的vcpp文件夹里的这个文件就可以删除,以后你的VC+程序文件都要建
7、在这里,千万不要乱建,乱存。下面是Visual C+开发环境界面:1、标题栏2、选单栏3、工具栏4、项目工作区窗口5、输出窗口6、输出窗口标签7、状态栏8、文档窗口见书第一页:二、建一个一般MFC的Windows应用程序,屏幕上出现2行字。1、按上面步骤建一个单文档应用程序名为:显示2行字2、在View.cpp中找到OnDraw(CDC *pDC)函数,写:CString str1=“ 学好Visual C+走遍天下”;CString str2=“ 改革开放的28年颂歌!南山学院好!”;pDC-TextOut(0,0,str1);pDC-TextOut(0,20,str2); 运行后窗口显示2
8、行字,如果显示带颜色的图形、文字等,以后会学到。l OnDraw(CDC *pDC)是视图类中的显示函数l CDC是设备环境类(在Visual C+5轻松进阶书56页中,有好多它的对象方法),*pDC是CDC的指针对象l CString是处理字符的类。l TextOut(x,y,str)是CDC类的显示函数,参数x,y是字符串在窗口中的显示位置。三、理解程序框架 打开项目工作区里的ClassView或FileView可以看到MFC为我们自动创建了以下几个主要的类:1、 文件名App.h (cpp)应用程序类CMyApp的基类是CWinApp,而CWinApp的基类又是CWinThread,CW
9、inThread类是用来完成对线程(见后面的名词解释)的控制,包括对线程的创建、运行、终止和挂起等。它实际上是Windows首先运行的内容,当这个程序开始时,它将会把主窗口放在屏幕上。C或C+是从main()主函数开始执行,而VC+是从WinMain()函数开始执行,且WinMain()函数就是隐含在此应用程序中。下面是显示2行字应用程序的头文件和执行文件:(其他见书170页)/ 显示2行字.h : main header file for the 显示2行字 application#if !defined(AFX_2_H_6CF87E54_5FC3_419D_B373_44264BFF449
10、C_INCLUDED_)#define AFX_2_H_6CF87E54_5FC3_419D_B373_44264BFF449C_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#ifndef _AFXWIN_H_#error include stdafx.h before including this file for PCH#endif#include resource.h / main symbols/ CMy2App:/ See 显示2行字.cpp for the implementation of this cl
11、ass/class CMy2App : public CWinApp 我们用户的应用程序类CMy2App是从MFC基类 CWinApp派生来的public:CMy2App(); 应用程序本身的声明/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CMy2App)/ 是ClassWizard定义的专门用做虚函数重载的标记public: 表示该程序块中的虚函数的重载是由ClassWizardvirtual BOOL InitInstance(); 自动管理的,用户一般不需要去更改/AFX_VIRTUA
12、L / Implementation/AFX_MSG(CMy2App) / 是ClassWizard定义的专门用做消息映射声明的afx_msg void OnAppAbout();/ NOTE - the ClassWizard will add and remove member functions here./ DO NOT EDIT what you see in these blocks of generated code !/AFX_MSG /标记DECLARE_MESSAGE_MAP();/AFX_INSERT_LOCATION/ Microsoft Visual C+ will
13、insert additional declarations immediately before the previous line.#endif / !defined(AFX_2_H_6CF87E54_5FC3_419D_B373_44264BFF449C_INCLUDED_)/其中的一些注释是由MFC AppWizard为用户自动生成的,如果不需要这些/注释,可在应用程序向导的第五步对话框中,将“Would you like to generate/source file comments?”项选为“No,thank you“。/ 显示2行字.cpp : Defines the clas
14、s behaviors for the application./#include stdafx.h /预编译处理的头文件#include 显示2行字.h /应用程序类的头文件#include MainFrm.h /主框架类的头文件#include 显示2行字Doc.h /文档类的头文件#include 显示2行字View.h /视图类的头文件#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CMy2AppBEGIN_MESSAGE_MAP(CMy2App, CWin
15、App)/消息映射开始/AFX_MSG_MAP(CMy2App) /消息映射宏存放区ON_COMMAND(ID_APP_ABOUT, OnAppAbout)/映射”帮助”选单项中的”关于显示2行/字”命令消息,当用户选择了该命令时,将执行函数OnAppAbout/ NOTE - the ClassWizard will add and remove mapping macros here./ DO NOT EDIT what you see in these blocks of generated code!/AFX_MSG_MAP / Standard file based document
16、 commandsON_COMMAND(ID_FILE_NEW, CWinApp:OnFileNew)/映射”文件”选单项中的”新建”/当用户选择了”新建”时,将相应执行CWinApp:OnFileNewON_COMMAND(ID_FILE_OPEN, CWinApp:OnFileOpen)/映射”文件”选单项中的”打开”/当用户选择了”打开”时,将相应执行CWinApp:OnFileOpen/ Standard print setup commandON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp:OnFilePrintSetup)END_MESSAGE_MAP
17、() /消息映射宏存放区结束/ CMy2App constructionCMy2App:CMy2App() /构造函数,变量赋初值一般都在这里/ TODO: add construction code here,/ Place all significant initialization in InitInstance/ The one and only CMy2App objectCMy2App theApp;/定义的一个应用类对象,表示一个实例/ CMy2App initializationBOOL CMy2App:InitInstance()AfxEnableControlContain
18、er();/若用户在MFC AppWizard的第三步中,选中了/“ActiveX Controls”则表示所创建的应用程序支持ActiveX控件/ Standard initialization/ If you are not using these features and wish to reduce the size/ of your final executable, you should remove from the following/ the specific initialization routines you do not need./若用户在MFC AppWizard
19、的第四步中,选中了”3D controls”,则表示所创建的应用程序支持/Windows95版本前的3D控件风格。(对下面2条)#ifdef _AFXDLLEnable3dControls();/ Call this when using MFC in a shared DLL使用动态的3D控件#elseEnable3dControlsStatic();/ Call this when linking to MFC statically使用静态的3D控件#endif/ Change the registry key under which our settings are stored./ T
20、ODO: You should modify this string to be something appropriate/ such as the name of your company or organization.SetRegistryKey(_T(Local AppWizard-Generated Applications);/在Windows系统注册表/中登记应用程序的主键值,以便将一些与应用程序相关的参数存放在该主键值下LoadStdProfileSettings(); / Load standard INI file options (including MRU)/从注册表
21、中/调入应用程序的一些标准参数,其中包括最近文件列表的文件名/ Register the applications document templates. Document templates/ serve as the connection between documents, frame windows and views./ 以下:若用户在MFC AppWizard的第一步中,选择了“Single document”类型,则进行下/列的单文档模板的创建及其初始化操作。CSingleDocTemplate* pDocTemplate;/定义一个单文档模板指针变量pDocTemplate =
22、 new CSingleDocTemplate/登记并创建单文档应用程序模板(IDR_MAINFRAME,/选单,快捷键等的资源标识号RUNTIME_CLASS(CMy2Doc),/文档类RUNTIME_CLASS(CMainFrame), / main SDI frame window主框架窗口类RUNTIME_CLASS(CMy2View);/视图类AddDocTemplate(pDocTemplate);/向应用程序添加文档模板/ Parse command line for standard shell commands, DDE, file open/分列命令行标准命令如DDE,文件
23、打开等。CCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);/ Dispatch commands specified on the command line/传送命令行指定的命令,并执行相应的操作if (!ProcessShellCommand(cmdInfo)return FALSE;/ The one and only window has been initialized, so show and update it./对主框架窗口进行初始化以便显示和更新m_pMainWnd-ShowWindow(SW_SHOW);m_pMainWnd
24、-UpdateWindow();return TRUE;/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog/基类CDialog派生出的CAboutDlg类 /该函数与前面几个类不同的是,该类增加AFX_DATA机制, /称为数据映射机制,这个机制是用来实现DDX(数据交换) / /DDV(数据校验),它能使应用程序与用户交互功能的实现 /变得更为容易和直接。public:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX
25、;/枚举类型IDD_ABOUTBOX的映射宏/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support数据交换/校验/AFX_VIRTUAL /虚函数/ Implementationprotected:/AFX_MSG(CAboutDlg)/ No message handlers/AFX_MSGDECLARE_MESSAGE_MAP();
26、CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/数据交换函数/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/是ClassWizard定义的专门用做消息映射的标记,/ No m
27、essage handlers /表示该程序块中的消息映射函数是由/AFX_MSG_MAP /ClassWizard来自动管理的,用户一般不需要更改END_MESSAGE_MAP()/ App command to run the dialogvoid CMy2App:OnAppAbout()/执行缺省对话框函数CAboutDlg aboutDlg; /定义的CAboutDlg对象aboutDlg.DoModal(); /调用相应的库函数,显示CAboutDlg对话框/ CMy2App message handlers2、 CMainFrm.h (cpp)主框架类(详解略可见175页)CMai
28、nFrm的基类是CFrameWnd,该类是显示主窗口,是我们找到菜单栏、窗口的标题栏以及工具栏的地方,主窗口对象负责窗口中出现的、围绕操作领域的一切,如:图画、文本和其它图形,这个区域称为窗口中的客户区。它用于管理应用程序窗口显示如:标题栏、菜单栏、工具栏、状态栏、控制菜单、控制按钮等,它是所有MDI(多文档)和SDI(单文档)子窗口的包容器。3、 文件名View.h (cpp)视图类(详解略可见172页) CMyView的基类是CView,处理客户区,是我们在程序中设置数据格式及显示数据的位置,如我们在创建一个字处理程序时正在编辑的文本,事实上,视图对象是出现在客户区顶部的窗口本身,用于让用
29、户通过窗口来访问文档、视图类。4、 CMyDoc.h (cpp)文档类(详解略可见170页) CMyDoc.h (cpp)的基类是CDocument,为程序存储数据,将所有数据存在文档中,而在视图对象中处理并显示。它包含了应用程序在运行期间所用到的数据文档。5、 工作区里出现的其它有关文件(见画线程序)a) Resource.h是标准的头文件,包含所有资源符号的定义。b) Stdafx.h用于建立预编译头文件(文件名.pch)和一个预定义的类型文件stdafx.obj,由于MFC体系结构非常大,如果每次都编译的话很费事,因此,把常用的MFC头文件都放在stdafx.h中,如afxwin.h、a
30、fxext.h、afxdisp.h等,然后让stdafx.cpp包含stdafx.h文件。这样由于编译器可以识别哪些文件已经编译过,所以stdafx.cpp就只编译一次。因为它存放的是头文件编译后的信息,故称做预编译头文件。如果以后我们在编程时不想让有些MFC头文件每次都被编译,也可以将它加入到stdafx.h中,采用预编译头文件,可以加速编译过程。c) 文件名.clw为ClassWizard数据库文件,存放由ClassWizard使用的信息,Wizard还使用这个文件来存储信息,以便创建和编辑消息映射、对话框数据映射、以及创建成员函数的原型。d) 文件名.rc是包含资源描述信息的资源文件,资
31、源文件列有应用程序用到的所有资源,包括存储在”res”子文件夹中的位图、图标和光标,这个文件可以在VC+6.0中直接编辑。e) 文件名.rc2包含不是由Visual C+6.0编辑的资源,可以将所有不能由资源编辑器编辑的资源放置到这个文件中。f) 文件名Doc.ico是包含MDI子窗口图标的图标文件,这个图标包含在资源文件的 文件名.rc中。g) 文件名.ioc是包含应用程序图标的图标文件,应用程序图标包含在资源文件的 文件名.rc中。h) Toolbar.bmp用于创建工具栏按钮的位图文件,初始工具栏和状态栏,是在主边框窗口类中构造。6、在填写代码时,经常遇到的一些数据类型BOOL bool
32、 布尔值BSTR unsigned short 32位字符指针BYTE unsigned char 8位无符号整数COLORREF unsigned long 用做颜色的32位值DWORD unsigned long 32位无符号整数,段地址和相关的偏移地址LONG long 32位带符号整数LPARAM long 作为参数传递给窗口过程或回调函数的32位值LPCSTR const char* 指向字符串常量的32位指针。LPSTR char* 指向字符串的32位指针LPVOID void 指向未定义类型的32位指针LRESULT long 来自窗口过程或回调函数的32位返回值UINT uns
33、igned long 32位无符号整数WORD unsigned short 16位无符号整数WPARM ynsigned int 当做参数传递给窗口过程或回调函数的32位值(书156页)附:一个简单的Windows应用程序#include /WINAPI是Windows应用程序设计接口,见下面说明。int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) MessageBox(NULL,”学好Visual C+”,”走遍天下”,0);/应用程序接口函数,用来弹出一
34、个对话框,显示短消息/第一个参数指定父窗口句柄/第二个参数显示消息内容/第三个参数显示对话框窗口的标题/指定在对话框中显示的按钮 return 0; 1、FileNewProjectsWin32 Application2、Project Name写入项目名“简单程序“在Location下的编辑框中直接键入文件夹名称,或单击Browse按钮()选择一个已有的文件夹3、单击OKAn empty projectFinishOK4、再次选择FileNew单击FileC+Source File在右边的File框中键入 简单程序.cpp单击OK敲入上面的代码5、运行程序,点“!“说明:1、每一个用CC+编
35、写的Windows应用程序都需要Windows.h头文件,它还包含了其他的一些Windows头文件,这些头文件定义了Windows的所有数据类型、函数调用、数据结构和符号常量。2、主函数参数int WINAPI WinMain( HINSTANCE hInstance, /当前实例句柄HINSTANCE hPrevInstance, /前一实例句柄 LPSTR lpCmdLine, /指向命令行参数的指针int nCmdShow) /窗口的显示状态下面介绍句柄:7、Windows常用的句柄类型句柄(handle):是一个标识Windows资源(如选单、图标、窗口等)和设备等对象的变量,或者是一
36、个对操作系统资源的间接引用。HBITMAP 保存位图信息的内存域的句柄HBRUSH 画刷句柄HCTL 子窗口控件的句柄HCURSOR 鼠标光标的句柄HDC 设备环境描述表的句柄HDLG 对话框的句柄HFONT 字体的句柄HICON 图标句柄HINSTANCE 应用程序的实例句柄HMEM 内存块的句柄HMENU 选单(菜单)句柄HMODUL 模式的句柄,常用来从可执行文件中获取资源数据HPALETTE 颜色调色板句柄HPEN 在设备上画图时画笔的句柄HRGN 在窗口上剪贴一块区域的句柄HTASK 独立于已执行的任务的句柄HWND 窗口句柄HANDLE 通用句柄,如:HINSTANCE hInst
37、ance 可以改写为: HANDLE hInstance应用程序的实例句柄句柄是Windows用来标识应用程序建立或使用对象的唯一整数,Windows使用各种各样的句柄标识的对象有:1、模块hmodul 2、任务htask 3、实例hinstance 4、文件hfile 5、内存块block of memory 6、菜单hmenu 7、控件hcontrol 8、字体hont9、资源resource:包括图标hicon、光标hcursor、字符串hstring等10、GDI对象包括位图hbitmap、画刷hbrush、元文件hmetafile、调色板hpalette、画笔hpen、区域hregi
38、on以及设备环境描述表device context等。 Windows程序中并不是用物理地址来标识一个内存块、文件、任务或动态链接模块,相反,WindowsAPI给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来操作它们。因此,句柄是一个标识符,用来标识各种对象。 WINAPI是Windows应用程序设计接口(Application Programming Interface)的缩写。API是一个程序内(或一组相关程序内)的一组函数调用,为开发者创建其他程序提供了很大方便。在使用这些函数时不必知道函数内部的细节,只需知道函数原形及返回值。利用Windows所提供的这些API,程序
39、员可以比较方便地开发基于 Windows操作系统的应用程序,适用的Windows操作系统包括Windows XP,Windows 2000,Windows NT等。l 进程是装入内存中正在执行的应用程序,包括私有的虚拟地址空间、代码、数据及其它操作系统资源,如:文件管道、同步对象等,它包括多个线程。l 线程是操作系统分配CPU时间的基本实体,可以执行应用程序代码的任何部分,同一进程的所有线程共享同样的虚拟地址空间、全局变量和操作系统资源。8、 几个常见的类a) CView(是CCmdTarget的子类)用于让用户通过窗口来访问文档(显示文档数据的应用程序专用视图的基类)。其子类:(1)CScr
40、ollView:具有滚动功能的视图的基类 (2)CFormView:其布局在对话资源中定义的滚动视图。 (3)CEditView:具有文本编辑、查找、替换和滚动功能的视图b) CWnd(是CCmdTarget的子类)通用窗口类,用来提供Windows中所有通用特性,对话框和控件。c) CFrameWnd(是CWnd的子类),SDI应用程序主框架窗口的基类d) CDialog对话框类,建立模式无模式对话框模型,是子层次结构的根类i. CFileDialog:提供打开或保存一个文件的标准对话框ii. CColorDialog:提供选择一种颜色的标准对话框iii. CFontDialog: 提供选择
41、一种字体的标准对话框iv. CPrinDialog:提供打印一个文件的标准对话框v. CFindReplaceDialog:提供删除查找并替换的标准对话框e) CMDIFrameWnd多文档应用程序主框架窗口显示管理。f) CMDICHildWnd多文档应用程序子窗口显示和管理。g) CDocument应用程序专用文档的基类。h) CMenu菜单类还有:根类:(1)CObject 类,它是MFC的抽象类,是MFC中多数类和用户自定义类的根类:包括对象的建立和删除、串行化支持、对象诊断输出、运行时信息以及集合类的兼容等。(2)应用程序体系结构类:1)命令相关类:CCmdTarget(是 CObject的子类)当一对象接收到消息命令时,应调用哪一个函数对该消息进行处理。它的子类有:窗口类CWnd、应用程序类CWinApp、文档模板类CDocTemplate、文档类CDocument、视图类CView及框架窗口类CFrameWnd等。2)窗口应用程序类:CWinApp类:每个程序有