MFC基本应用程序的建立.docx
《MFC基本应用程序的建立.docx》由会员分享,可在线阅读,更多相关《MFC基本应用程序的建立.docx(41页珍藏版)》请在冰豆网上搜索。
MFC基本应用程序的建立
MFC基本应用程序的建立
C++面向对象程序设计语言是在C语言的基础上发展起来的,它与传统的程序设计方式不同,而是一种新的程序设计范型。
它对降低软件的复杂性,改善其重要性和维护性、提高软件的生产效率,有着十分重要的意义。
因此面向对象程序设计被普遍认为是程序设计方法的一场实质性的革命
VisualC++是Microsoft公司推出的目前使用极为广泛的基于Windows平台的C++可视化开发环境,它使C++语言在Windows平台上得到了有效的可视化的应用。
C++编程都是在控制台方式下运行的,这样可以在不需要太多涉及VisualC++的细节而专心于C++程序设计的本身。
但是,当C++及程序设计基本掌握后,我们就不能仅停留在控制台方式下运行,因为学习C++的目的在于应用,从本章开始,将着重讨论如何用VisualC++的强大功能开发Windows应用程序。
我们将看到,展现在你面前的是彩色亮丽的图形图像及千变万化的可移动的文字、影像界面。
像市场流行的游戏软件、企事业管理、图形图像处理、银行、电信、教育及各大小网站的软件编程和网页设计等。
本章一、二节是Windows编程和MFC编程,不是我们重点掌握的,大家可以自己看看,也是有帮助的。
我们从第三节(150页):
使用MFCAppWizard(应用程序向导)开始讲。
前面一、二节中需要大家掌握的是:
1、Windows应用程序上机编程操作步骤(C++上机编程操作步骤,教材140页)
2、理解Windows编程特点中的:
消息驱动机制概念、图形设备接口概念、基于资源的程序设计概念、动态连接库概念、进程和线程的概念、阅读147页MFC应用程序并理解其代码(146—149页)(做为讨论题留给大家)
实际上,在VisualC++6.0中,我们不需要加入更多的Windows程序代码,就能创建所需要的应用程序,这就是我们要着重掌握的MFCAppWizard(应用程序向导),它能为用户快速、高效、自动地生成一些常用的标准程序结构和编程风格,它们被称为应用程序框架类型(MFCAppWizard提供的各应用程序框架类型150页说明)其中:
MFCAppWizard(exe)是我们常用的(一般MFC的Windows应用程序),
它包含用户最常用、最基本的3种应用程序类型:
单文档、多文档和基于对话框的应用程序。
所谓单文档应用程序:
它的功能比较简单,复杂程度适中,虽然每次只能打开和处理一个文档,但已能满足一般工程上的需要。
基于对话框的程序:
对比单文档更简单,也是最紧凑的。
它没有菜单、工具栏及状态栏,也不能处理文档,但它的好处是速度快,代码少,程序员所花费的开发和调试的时间短。
多文档应用程序:
能允许同时打开和处理多个文档。
与单文档应用程序相比,增加了许多功能,需要大量额外的编程工作。
例如它不仅需要跟踪所有打开文档的路径,而且还需要管理各文档窗口的显示和更新等。
总之,无论你选择何种类型的应用程序框架,一定要根据用户自己的具体需要而定。
一、建一个单文档的MFCWindows应用程序,屏幕上出现一个空窗口。
(注意:
以后我们所建的应用程序一般都是此应用程序类型)
1、在E盘建一个文件夹,名为:
vcpp(存放你建的文件)
2、双击桌面上的MicrosoftVisualC++系统:
-->File-->New-->Projects-->MFCAppWizard(exe)见150页表3.3-->输入路径名vcpp(事先建好的文件夹)-->输入文件名为:
“显示窗口“-->OK
3、选SDI(单文档)-->一直缺省最后便建立了一个名为:
”显示窗口”的单文档应用程序-->运行!
便出现一个空窗口。
注意:
见151---153页的制作过程(缺省各界面的情况)。
我们没作任何保存,它自动存在你的文件夹vcpp里,要删除它,找到你的vcpp文件夹里的这个文件就可以删除,以后你的VC++程序文件都要建在这里,千万不要乱建,乱存。
建好的单文档应用程序里面包括4个类(文件):
主框架程序(类)(MainFrm.cpp)、应用程序(类)(程序名.cpp)、视图程序(类)(程序名Wiew.cpp)、文档程序(类)(程序名Doc.cpp)。
(见下页有解释)
图3.1MFCAppWizard的“新建”对话框
MFCAppWizard创建的应用程序框架类型(参见上面图3.1):
ATLCOMMFCAppWizard创建ATL(ActiveTemplateLibrary)应用模块工程
ClusterResourceTypeWizard创建ClusterResource(用于WindowsNT服务器)
CustomMFCAppWizard创建自己的应用程序向导
DatabaseProject创建数据库应用程序
DevStudioAdd-inWizard创建ActiveX组件或VBScrip宏
ExtendedStoreProcWizard创建基于SQL服务器下的外部存储过程
ISAPIExtensionWizard创建InternetServer程序
MakeFile创建独立于VisualC++开发环境的应用程序
MFCActiveXControlWizard创建ActiveXControl应用程序
MFCAppWizard(dll)MFC的动态连接库
MFCAppWizard(exe)一般MFC的Windows应用程序
UtilityProject创建简单、实用的应用程序
Win32Application其它Win32的Windows应用程序
Win32ConsoleApplicationWin32的控制台应用程序
Win32Dynamic-LinkLibraryWin32的动态连接库
Win32StaticLibraryWin32的静态连接库
显示窗口程序的运行结果(见书153页图3.12):
二、建一个一般MFC的Windows应用程序,屏幕上出现2行字。
1、双击桌面上的MicrosoftVisualC++系统:
-->File-->New-->Projects-->MFCAppWizard(exe)-->输入路径名vcpp(事先建好的文件夹)--->输入文件名为:
显示2行字-->OK选SDI-->一直缺省
Finish。
2、在View.cpp(视图类)中找到OnDraw(CDC*pDC)函数,写:
CStringstr1=“学好VisualC++走遍天下”;
CStringstr2=“改革开放的28年颂歌!
南山学院好!
”;
pDC->TextOut(0,0,str1);
pDC->TextOut(0,20,str2);
(添写代码情况,见下图3.2)
运行后窗口显示如上添加的2行字,如果显示带颜色的图形、文字等,以后会逐步学到。
●OnDraw(CDC*pDC)函数是视图类中的显示函数
●CDC是设备环境类(在VisualC++5轻松进阶书56页中,有好多它的对象方法),对象方法也叫函数,*pDC是CDC的指针对象
●CString是处理字符的类。
●TextOut(x,y,str)是CDC类的显示函数(函数也叫对象方法),参数x,y是字符串在窗口中的显示位置(xy坐标),str是已定义和赋好值的字符串。
图3.2VisualC++开发环境界面
1、标题栏2、菜单栏3、工具栏4、项目工作区窗口
5、输出窗口6、输出窗口标签7、状态栏8、文档窗口
三、理解程序框架
本部分是留给大家的课后学习、讨论题,一定通过上机,真正理解MFC程序的4个主要的类:
应用程序类、文档类、视图类、主框架类。
(这里只介绍应用程序类)
打开项目工作区里的ClassView或FileView可以看到MFC为我们自动创建了以下几个主要的类:
1、文件名App.h(cpp)应用程序类
CMyApp的基类是CWinApp,而CWinApp的基类又是CWinThread,CWinThread类是用来完成对线程(见后面的名词解释)的控制,包括对线程的创建、运行、终止和挂起等。
它实际上是Windows首先运行的内容,当这个程序开始时,它将会把主窗口放在屏幕上。
C或C++是从main()主函数开始执行,而VC++是从WinMain()函数开始执行,且WinMain()函数就是隐含在此应用程序中。
下面是显示2行字应用程序的头文件和执行文件
//显示2行字.h:
mainheaderfileforthe显示2行字application
#if!
defined(AFX_2_H__6CF87E54_5FC3_419D_B373_44264BFF449C__INCLUDED_)
#defineAFX_2_H__6CF87E54_5FC3_419D_B373_44264BFF449C__INCLUDED_
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
#ifndef__AFXWIN_H__
#errorinclude'stdafx.h'beforeincludingthisfileforPCH
#endif
#include"resource.h"//mainsymbols
/////////////////////////////////////////////////////////////////////////////
//CMy2App:
//See显示2行字.cppfortheimplementationofthisclass
//
classCMy2App:
publicCWinApp我们用户的应用程序类CMy2App是从MFC基类
{CWinApp派生来的
public:
CMy2App();应用程序本身的声明
//Overrides
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CMy2App)//是ClassWizard定义的专门用做虚函数重载的标记
public:
//表示该程序块中的虚函数的重载是由ClassWizard
virtualBOOLInitInstance();//自动管理的,用户一般不需要去更改
//}}AFX_VIRTUAL
//Implementation
//{{AFX_MSG(CMy2App)//是ClassWizard定义的专门用做消息映射声明的
afx_msgvoidOnAppAbout();//该函数就是消息映射函数,映射”帮助”选单项中的”关于
//显示2行字”命令消息,当用户选择了该命令时,将执行该//函数OnAppAbout
//NOTE-theClassWizardwilladdandremovememberfunctionshere.
//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!
//}}AFX_MSG//标记
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.
#endif//!
defined(AFX_2_H__6CF87E54_5FC3_419D_B373_44264BFF449C__INCLUDED_)
//其中的一些注释是由MFCAppWizard为用户自动生成的,如果不需要这些//注释,可在应用程序向导的第五步对话框中,将“Wouldyouliketogenerate
//sourcefilecomments?
”项选为“No,thankyou“。
//显示2行字.cpp:
Definestheclassbehaviorsfortheapplication.
//
#include"stdafx.h"//预编译处理的头文件
#include"显示2行字.h"//应用程序类的头文件
#include"MainFrm.h"//主框架类的头文件
#include"显示2行字Doc.h"//文档类的头文件
#include"显示2行字View.h"//视图类的头文件
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CMy2App
BEGIN_MESSAGE_MAP(CMy2App,CWinApp)//消息映射入口(开始)
//{{AFX_MSG_MAP(CMy2App)//消息映射宏存放区
ON_COMMAND(ID_APP_ABOUT,OnAppAbout)//映射”帮助”选单项中的”关于显示2行
//字”命令消息,当用户选择了该命令时,将执行函数OnAppAbout
//NOTE-theClassWizardwilladdandremovemappingmacroshere.
//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!
//}}AFX_MSG_MAP
//Standardfilebaseddocumentcommands//映射命令区
ON_COMMAND(ID_FILE_NEW,CWinApp:
:
OnFileNew)//映射”文件”选单项中的”新建”
//当用户选择了”新建”时,将相应执行CWinApp:
:
OnFileNew
ON_COMMAND(ID_FILE_OPEN,CWinApp:
:
OnFileOpen)//映射”文件”选单项中的”打开”
//当用户选择了”打开”时,将相应执行CWinApp:
:
OnFileOpen
//Standardprintsetupcommand
ON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp:
:
OnFilePrintSetup)//该宏是具体实//现所需要的消息映射。
它有两个参数:
第一个ID_FILE_PRINT,这是一个ID。
第二个参数//CView:
:
OnFilePrint,这是为ID添加的消息处理函数名称。
这样,通过ON_COMMAND宏
//就将菜单与相应的消息处理函数进行了连接,也就完成了该ID的消息映射。
END_MESSAGE_MAP()//消息映射宏存放区结束
/////////////////////////////////////////////////////////////////////////////
//CMy2Appconstruction
CMy2App:
:
CMy2App()//构造函数,变量赋初值一般都在这里
{
//TODO:
addconstructioncodehere,
//PlaceallsignificantinitializationinInitInstance
}
/////////////////////////////////////////////////////////////////////////////
//TheoneandonlyCMy2Appobject
CMy2ApptheApp;//定义的一个应用类对象,表示一个实例
/////////////////////////////////////////////////////////////////////////////
//CMy2Appinitialization
BOOLCMy2App:
:
InitInstance()
{
AfxEnableControlContainer();//若用户在MFCAppWizard的第三步中,选中了
//“ActiveXControls”则表示所创建的应用程序支持ActiveX控件
//Standardinitialization
//Ifyouarenotusingthesefeaturesandwishtoreducethesize
//ofyourfinalexecutable,youshouldremovefromthefollowing
//thespecificinitializationroutinesyoudonotneed.
//若用户在MFCAppWizard的第四步中,选中了”3Dcontrols”,则表示所创建的应用程序支持//Windows95版本前的3D控件风格。
(对下面2条)
#ifdef_AFXDLL
Enable3dControls();//CallthiswhenusingMFCinasharedDLL使用动态的3D控件
#else
Enable3dControlsStatic();//CallthiswhenlinkingtoMFCstatically使用静态的3D控件
#endif
//Changetheregistrykeyunderwhichoursettingsarestored.
//TODO:
Youshouldmodifythisstringtobesomethingappropriate
//suchasthenameofyourcompanyororganization.
SetRegistryKey(_T("LocalAppWizard-GeneratedApplications"));//在Windows系统注册表//中登记应用程序的主键值,以便将一些与应用程序相关的参数存放在该主键值下
LoadStdProfileSettings();//LoadstandardINIfileoptions(includingMRU)//从注册表中
//调入应用程序的一些标准参数,其中包括最近文件列表的文件名
//Registertheapplication'sdocumenttemplates.Documenttemplates
//serveastheconnectionbetweendocuments,framewindowsandviews.
//以下:
若用户在MFCAppWizard的第一步中,选择了“Singledocument(单文档)”类型,//则进行下列的单文档模板的创建及其初始化操作。
CSingleDocTemplate*pDocTemplate;//定义一个单文档模板指针变量
pDocTemplate=newCSingleDocTemplate//登记并创建单文档应用程序模板
(IDR_MAINFRAME,//菜单,快捷键等的资源标识号
RUNTIME_CLASS(CMy2Doc),//文档类
RUNTIME_CLASS(CMainFrame),//mainSDIframewindow主框架窗口类
RUNTIME_CLASS(CMy2View));//视图类
AddDocTemplate(pDocTemplate);//向应用程序添加文档模板
//Parsecommandlineforstandardshellcommands,DDE,fileopen
//分列命令行标准命令如DDE,文件打开等。
CCommandLineInfocmdInfo;
ParseCommandLine(cmdInfo);
//Dispatchcommandsspecifiedonthecommandline
//传送命令行指定的命令,并执行相应的操作
if(!
ProcessShellCommand(cmdInfo))
returnFALSE;
//Theoneandonlywindowhasbeeninitialized,soshowandupdateit.
//对主框架窗口进行初始化以便显示和更新
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
returnTRUE;
}
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog//基类CDialog(对话框类)派生出的CAboutDlg类
{//该函数与前面几个类不同的是,该类增加AFX_DATA机制,
//称为数据映射机制,这个机制是用来实现DDX(数据交换)
//DDV(数据校验),它能使应用程序与用户交互功能的实现
//变得更为容易和直接。
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};//枚举类型IDD_ABOUTBOX的映射宏
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport数据交换/校验
//}}AFX_VIRTUAL//虚函数
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAbo