Visual C++第03章 MFC基本应用程序的建立

更新时间:2023-09-13 23:12:01 阅读量: 教学研究 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第3章 MFC基本应用程序的建立

C++面向对象程序设计语言是在C语言的基础上发展起来的,它与传统的

程序设计方式不同,而是一种新的程序设计范型。它对降低软件的复杂性,改善其重要性和维护性、提高软件的生产效率,有着十分重要的意义。因此面向对象程序设计被普遍认为是程序设计方法的一场实质性的革命

Visual C++是Microsoft公司推出的目前使用极为广泛的基于Windows平台的C++可视化开发环境,它使C++语言在Windows平台上得到了有效的可视化的应用。

C++编程都是在控制台方式下运行的,这样可以在不需要太多涉及Visual C++的细节而专心于C++程序设计的本身。但是,当C++及程序设计基本掌握后,我们就不能仅停留在控制台方式下运行,因为学习C++的目的在于应用,从本章开始,将着重讨论如何用Visual C++的强大功能开发Windows应用程序。我们将看到,展现在你面前的是彩色亮丽的图形图像及千变万化的可移动的文字、影像界面。像市场流行的游戏软件、企事业管理、图形图像处理、银行、电信、教育及各大小网站的软件编程和网页设计等。

本章一、二节是Windows编程和MFC编程,不是我们重点掌握的,大家可以自己看看,也是有帮助的。我们从第三节(150页):使用MFC AppWizard(应用程序向导)开始讲。前面一、二节中需要大家掌握的是:

1、Windows应用程序上机编程操作步骤(C++上机编程操作步骤,教材140页) 2、理解Windows编程特点中的:消息驱动机制概念、图形设备接口概念、基于资源的程序设计概念、动态连接库概念、进程和线程的概念、阅读147页MFC应用程序并理解其代码(146—149页)(做为讨论题留给大家)

实际上,在Visual C++6.0中,我们不需要加入更多的Windows程序代码,就能创建所需要的应用程序,这就是我们要着重掌握的MFC AppWizard(应用程序向导),它能为用户快速、高效、自动地生成一些常用的标准程序结构和编程风格,它们被称为应用程序框架类型(MFC AppWizard提供的各应用程序框架类型150页说明)其中:MFC AppWizard(exe)是我们常用的(一般MFC的Windows应用程序), 它包含用户最常用、最基本的3种应用程序类型:单文档、多文档和基于对话框的应用程序。所谓单文档应用程序:它的功能比较简单,复杂程度适中,虽然每次只能打开和处理一个文档,但已能满足一般工程上的需要。基于对话框的程序:对比单文档更简单,也是最紧凑的。它没有菜单、工具栏及状态栏,也不能处理文档,但它的好处是速度快,代码少,程序员所花费的开发和调试的时间短。 多文档应用程序:能允许同时打开和处理多个文档。与单文档应用程序相比,增加了许多功能,需要大量额外的编程工作。例如它不仅需要跟踪所有打开文档的路径,而且还需要管理各文档窗口的显示和更新等。总之,无论你选择何种类型的应用程序框架,一定要根据用户自己的具体需要而定。

一、建一个单文档的MFC Windows应用程序,屏幕上出现一个空窗口。

(注意:以后我们所建的应用程序一般都是此应用程序类型) 1、在E盘建一个文件夹,名为:vcpp(存放你建的文件) 2、双击桌面上的Microsoft Visual C++系统:

-->File --> New -->Projects -->MFC AppWizard(exe) 见150页表3.3-->输入路径名vcpp(事先建好的文件夹) -->输入文件名为:“显示窗口“ -->OK 3、选SDI(单文档)-->一直缺省 最后便建立了一个名为:”显示窗口”的单文

档应用程序-->运行! 便出现一个空窗口。

注意:见151---153页的制作过程(缺省各界面的情况)。我们没作任何保存,它自动存在你的文件夹vcpp里,要删除它,找到你的vcpp文件夹里的这个文件就可以删除,以后你的VC++程序文件都要建在这里,千万不要乱建,乱存。

建好的单文档应用程序里面包括4个类(文件): 主框架程序(类)(MainFrm.cpp)、应用程序(类)(程序名.cpp)、视图程序(类)(程序名Wiew.cpp)、文档程序(类)(程序名Doc.cpp)。(见下页有解释)

图3.1 MFC AppWizard的“新建”对话框 MFC AppWizard创建的应用程序框架类型(参见上面图3.1):

ATL COM MFC AppWizard 创建ATL(Active Template Library)应用模块工程 Cluster Resource TypeWizard创建Cluster Resource(用于Windows NT服务器) Custom MFC 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(exe) 一般MFC的Windows应用程序 Utility Project 创建简单、实用的应用程序

Win32 Application 其它Win32的Windows应用程序 Win32 Console Application Win32的控制台应用程序 Win32 Dynamic-Link Library Win32的动态连接库 Win32 Static Library Win32的静态连接库 显示窗口程序的运行结果(见书153页图3.12):

二、建一个一般MFC的Windows应用程序,屏幕上出现2行字。 1、双击桌面上的Microsoft Visual C++系统:

-->File --> New -->Projects -->MFC AppWizard(exe) -->输入路径名vcpp(事先建好的文件夹) --->输入文件名为:显示2行字 -->OK?选SDI-->一直缺省? Finish。

2、在View.cpp(视图类)中找到OnDraw(CDC *pDC)函数,写:

CString str1=“ 学好Visual C++走遍天下”;

CString str2=“ 改革开放的28年颂歌!南山学院好!”; pDC->TextOut(0,0,str1); pDC->TextOut(0,20,str2);

(添写代码情况,见下图3.2)

运行后窗口显示如上添加的2行字,如果显示带颜色的图形、文字等,以后会逐步学到。

? OnDraw(CDC *pDC)函数是视图类中的显示函数

? CDC是设备环境类(在Visual C++5轻松进阶书56页中,有好多它的对象方法),对象方法也叫函数,*pDC是CDC的指针对象 ? CString是处理字符的类。

? TextOut(x,y,str)是CDC类的显示函数(函数也叫对象方法),参数x,y是字符串在窗口中的显示位置(x y坐标),str是已定义和赋好值的字符串。

图3.2 Visual C++开发环境界面

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 : main header file for the 显示2行字 application

#if !defined(AFX_2_H__6CF87E54_5FC3_419D_B373_44264BFF449C__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 \ // main symbols ///////////////////////////////////////////////////////////////////////////// // CMy2App:

// See 显示2行字.cpp for the implementation of this class

//

class CMy2App : public CWinApp 我们用户的应用程序类CMy2App是从MFC基类 { CWinApp派生来的 public: CMy2App(); 应用程序本身的声明

// Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMy2App)// 是ClassWizard定义的专门用做虚函数重载的标记

public: // 表示该程序块中的虚函数的重载是由ClassWizard virtual BOOL InitInstance(); // 自动管理的,用户一般不需要去更改

//}}AFX_VIRTUAL // Implementation //{{AFX_MSG(CMy2App) // 是ClassWizard定义的专门用做消息映射声明的 afx_msg void OnAppAbout(); //该函数就是消息映射函数,映射”帮助”选单项中的”关于

//显示2行字”命令消息,当用户选择了该命令时,将执行该

//函数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 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 class behaviors for the application. //

#include \ //预编译处理的头文件 #include \显示2行字.h\ //应用程序类的头文件 #include \ //主框架类的头文件 #include \显示2行字Doc.h\ //文档类的头文件 #include \显示2行字View.h\ //视图类的头文件 #ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE

static char THIS_FILE[] = __FILE__; #endif

/////////////////////////////////////////////////////////////////////////////

// CMy2App

BEGIN_MESSAGE_MAP(CMy2App, CWinApp)//消息映射入口(开始) //{{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 commands //映射命令区

ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)//映射”文件”选单项中的”新建” //当用户选择了”新建”时,将相应执行CWinApp::OnFileNew

ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)//映射”文件”选单项中的”打开”

//当用户选择了”打开”时,将相应执行CWinApp::OnFileOpen

// Standard print setup command

ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) //该宏是具体实//现所需要的消息映射。它有两个参数:第一个ID_FILE_PRINT,这是一个ID。第二个参数//CView::OnFilePrint,这是为ID添加的消息处理函数名称。这样,通过ON_COMMAND宏 //就将菜单与相应的消息处理函数进行了连接,也就完成了该ID的消息映射。 END_MESSAGE_MAP() //消息映射宏存放区结束 /////////////////////////////////////////////////////////////////////////////

// CMy2App construction

CMy2App::CMy2App() //构造函数,变量赋初值一般都在这里 {

// TODO: add construction code here,

// Place all significant initialization in InitInstance

}

///////////////////////////////////////////////////////////////////////////// // The one and only CMy2App object

CMy2App theApp;//定义的一个应用类对象,表示一个实例 ///////////////////////////////////////////////////////////////////////////// // CMy2App initialization

BOOL CMy2App::InitInstance() { AfxEnableControlContainer();//若用户在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的第四步中,选中了”3D controls”,则表示所创建的应用程序支持//Windows95版本前的3D控件风格。(对下面2条)

#ifdef _AFXDLL Enable3dControls();// Call this when using MFC in a shared DLL使用动态的3D控件 #else Enable3dControlsStatic();// Call this when linking to MFC statically使用静态的3D控件 #endif // Change the registry key under which our settings are stored. // TODO: You should modify this string to be something appropriate // such as the name of your company or organization. SetRegistryKey(_T(\//在Windows系统注册表//中登记应用程序的主键值,以便将一些与应用程序相关的参数存放在该主键值下 LoadStdProfileSettings(); // Load standard INI file options (including MRU)//从注册表中 //调入应用程序的一些标准参数,其中包括最近文件列表的文件名

// Register the application's document templates. Document templates

// serve as the connection between documents, frame windows and views.

// 以下:若用户在MFC AppWizard的第一步中,选择了“Single document(单文档)”类型,//则进行下列的单文档模板的创建及其初始化操作。 CSingleDocTemplate* pDocTemplate;//定义一个单文档模板指针变量

pDocTemplate = 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,文件打开等。

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. //对主框架窗口进行初始化以便显示和更新 }

///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About

class CAboutDlg : public CDialog//基类CDialog(对话框类)派生出的CAboutDlg类 { //该函数与前面几个类不同的是,该类增加AFX_DATA机制, //称为数据映射机制,这个机制是用来实现DDX(数据交换) // DDV(数据校验),它能使应用程序与用户交互功能的实现 //变得更为容易和直接。 public: CAboutDlg(); // Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };//枚举类型IDD_ABOUTBOX的映射宏 //}}AFX_DATA

// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg)

m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE;

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support数据交换/校验

//}}AFX_VIRTUAL //虚函数 // Implementation protected:

//{{AFX_MSG(CAboutDlg) // No message handlers //}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { }

void CAboutDlg::DoDataExchange(CDataExchange* pDX) {

CDialog::DoDataExchange(pDX);//数据交换函数 //{{AFX_DATA_MAP(CAboutDlg) //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)//是ClassWizard定义的专门用做消息映射的标记,

// No message handlers //表示该程序块中的消息映射函数是由 //}}AFX_MSG_MAP //ClassWizard来自动管理的,用户一般不需要更改 END_MESSAGE_MAP()

// App command to run the dialog

void CMy2App::OnAppAbout()//执行缺省对话框函数 {

CAboutDlg aboutDlg; //定义的CAboutDlg对象

aboutDlg.DoModal(); //调用相应的库函数,显示CAboutDlg对话框

}

///////////////////////////////////////////////////////////////////////////// // CMy2App message handlers

2、 CMainFrm.h (cpp)主框架类

CMainFrm的基类是CFrameWnd,该类是显示主窗口,是我们找到菜单栏、窗口的标题栏以及工具栏的地方,主窗口对象负责窗口中出现的、围绕操作领域的一切,如:图画、文本和其它图形,这个区域称为窗口中的客户区。它用于管理应用程序窗口显示如:标题栏、菜单栏、工具栏、状态栏、控制菜单、控制按钮等,它是所有MDI(多文档)和SDI(单文档)子窗口的包容器。 3、 文件名View.h (cpp)视图类

CMyView的基类是CView,处理客户区,是我们在程序中设置数据格式及显示数据的位置,如我们在创建一个字处理程序时正在编辑的文本,事实上,视图对象是出现在客户区顶部的窗口本身,用于让用户通过窗口来访问文档、视图类。

4、 CMyDoc.h (cpp)文档类

CMyDoc.h (cpp)的基类是CDocument,为程序存储数据,将所有数据存在文档中,而在视图对象中处理并显示。它包含了应用程序在运行期间所用到的数据文档。

5、 工作区里出现的其它有关文件(见画线程序)

a) Resource.h是标准的头文件,包含所有资源符号的定义。

b) Stdafx.h用于建立预编译头文件(文件名.pch)和一个预定义的类型文件

stdafx.obj,由于MFC体系结构非常大,如果每次都编译的话很费事,因此,把常用的MFC头文件都放在stdafx.h中,如afxwin.h、afxext.h、afxdisp.h等,然后让stdafx.cpp包含stdafx.h文件。这样由于编译器可以识别哪些文件已经编译过,所以stdafx.cpp就只编译一次。因为它存放的是头文件编译后的信息,故称做预编译头文件。如果以后我们在编程时不想让有些MFC头文件每次都被编译,也可以将它加入到stdafx.h中,采用预编译头文件,可以加速编译过程。 c) 文件名.clw为ClassWizard数据库文件,存放由ClassWizard使用的信息,

Wizard还使用这个文件来存储信息,以便创建和编辑消息映射、对话框数据映射、以及创建成员函数的原型。

d) 文件名.rc是包含资源描述信息的资源文件,资源文件列有应用程序用到

的所有资源,包括存储在”\\res”子文件夹中的位图、图标和光标,这个文件可以在VC++6.0中直接编辑。

e) 文件名.rc2包含不是由Visual C++6.0编辑的资源,可以将所有不能由资

源编辑器编辑的资源放置到这个文件中。

f) 文件名Doc.ico是包含MDI子窗口图标的图标文件,这个图标包含在资

源文件的 文件名.rc中。

g) 文件名.ioc是包含应用程序图标的图标文件,应用程序图标包含在资源

文件的 文件名.rc中。

h) Toolbar.bmp用于创建工具栏按钮的位图文件,初始工具栏和状态栏,是

在主边框窗口类中构造。

6、在填写代码时,经常遇到的一些数据类型(见书145页) BOOL bool 布尔值

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 unsigned long 32位无符号整数 WORD unsigned short 16位无符号整数

WPARM ynsigned int 当做参数传递给窗口过程或回调函数的32位值 附:一个简单的Windows应用程序

(1)File?New?Projects?Win32 Application

(2)Project Name写入项目名“简单程序”?在Location下的编辑框中直接键

入文件夹名称,或单击Browse按钮(…)选择一个已有的文件夹 (3)单击OK?An empty project?Finish?OK

(4)再次选择File?New?单击File?C++Source File?在右边的File框中键入 简单程序.cpp?单击OK?敲入下面的代码。(编译运行程序,点“!“) #include

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) {

MessageBox(NULL,”学好Visual C++”,”走遍天下”,0); //应用程序接口函数,用来弹出一个对话框,显示短消息

//第一个参数指定父窗口句柄 //第二个参数显示消息内容

//第三个参数显示对话框窗口的标题 //指定在对话框中显示的按钮

return 0; }

说明:(1)每一个用C\\C++编写的Windows应用程序都需要windows.h头文件,它还包含了其他的一些Windows头文件,这些头文件定义了Windows的所有数据类型、函数调用、数据结构和符号常量。 (2)主函数参数

int WINAPI WinMain( HINSTANCE hInstance, //当前应用程序的实例句柄 //句柄 对象

HINSTANCE hPrevInstance, //前一应用程序的实例句柄 //句柄 对象

LPSTR lpCmdLine, //指向命令行参数的指针 //数据类型

int nCmdShow) //窗口的显示状态

//数据类型

(3)WINAPI是Windows应用程序设计接口(Application Programming Interface)的缩写。API是一个程序内(或一组相关程序内)的一组函数调用,为开发者创建其他程序提供了很大方便。在使用这些函数时不必知道函数内部的细节,只需知道函数原形及返回值。利用Windows所提供的这些API,程序员可以比较方便地开发基于 Windows操作系统的应用程序,适用的Windows操作系统包括Windows XP,Windows 2000,Windows NT等。 7、Windows常用的句柄类型(146页) 句柄(handle):是一个标识Windows资源(如选单、图标、窗口等)和设备

等对象的变量,或者是一个对操作系统资源的间接引用。

HBITMAP 保存位图信息的内存域的句柄 HBRUSH 画刷句柄

HCTL 子窗口控件的句柄 HCURSOR 鼠标光标的句柄

HDC 设备环境描述表的句柄 HDLG 对话框的句柄 HFONT 字体的句柄 HICON 图标句柄

HINSTANCE 应用程序的实例句柄 HMEM 内存块的句柄 HMENU 菜单句柄

HMODUL 模式的句柄,常用来从可执行文件中获取资源数据 HPALETTE 颜色调色板句柄

HPEN 在设备上画图时画笔的句柄 HRGN 在窗口上剪贴一块区域的句柄 HTASK 独立于已执行的任务的句柄 HWND 窗口句柄

HANDLE 通用句柄,如:HINSTANCE hInstance 可以改写为:

HANDLE hInstance应用程序的实例句柄 句柄是Windows用来标识应用程序建立或使用对象的唯一整数,Windows 使用各种各样的句柄标识的对象有:

(1)模块hmodul (2)任务htask (3)应用程序实例句柄hinstance (4)文件hfile (5)内存块block of memory(6)菜单hmenu (7)控件hcontrol

本文来源:https://www.bwwdw.com/article/wedh.html

Top