《C++程序设计》课件第13章_第1页
《C++程序设计》课件第13章_第2页
《C++程序设计》课件第13章_第3页
《C++程序设计》课件第13章_第4页
《C++程序设计》课件第13章_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

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

文档简介

第13章MFC编程13.1Windows编程及MFC简介13.2基于对话框的应用程序设计13.3单文档(SDI)和多文档(MDI)应用程序

本章小结习题

本章以VisualC++6.0为开发环境,简要介绍利用WindowsAPI(ApplicationProgrammingInterface)和MFC(MicrosoftFoundationClasses)编写Windows应用程序的基本方法。微软基础类库MFC是微软为开发人员提供的一个面向对象的Windows编程接口,它提供了一个标准化的结构和丰富的MFC库,用MFC开发的程序具有标准的Windows界面,对用户而言直观易用。13.1Windows编程及MFC简介

Windows编程就是基于Microsoft公司的Windows操作系统的编程,利用它可以开发运行在Windows操作系统下的应用程序。Widows编程和常见的控制台程序不同,它是基于窗口的。利用VisualC++6.0为开发环境开发Windows应用程序可以有两种途径。一种是直接调用Windows操作系统提供的API(应用程序接口)函数,这种方法称为WindowsAPI编程(也简称为Windows编程)。另一种是利用MFC(微软基础类库),这种方法称为MFC编程。利用C语言开发Windows应用程序时通常选择第一种方法。利用C++开发Windows应用程序时两种方法都可以选择。

MFC是微软提供的一个基础类库,它封装了大部分的WindowsAPI,对于使用C++语言开发Windows应用程序的开发者来说,用MFC比直接用WindowsAPI容易一些。另外,MFC中还提供了很好的应用程序框架,其中最突出的就是它的“文档-视”结构。13.1.1Windows

API编程基础

Windows是一个应用于微型计算机上的基于窗口的图形化用户界面的操作系统。它主要由窗口和菜单构成。

1.Windows编程中的基本概念

1)窗口窗口是Windows程序的基本组成部分,它是用户与应用程序进行交互的场所。图13.1是一个典型的Windows窗口示意图。图13.1

Windows窗口示意图

2)句柄句柄是Windows编程中一个很重要的概念,它是由系统分配的用来唯一标识Windows程序中不同对象的一个4字节的整数值。常用的句柄类型有以下几种:

HWND 窗口句柄

HINSTANS 实例句柄

HMENU 菜单句柄

HCURSOR 光标句柄

HICON 图标句柄

HDC 设备句柄

HPEN 画笔句柄

HBRUSH 画刷句柄句柄是一个比较抽象的概念,可简单理解为要操作一个Windows对象,就要获得它的句柄,这如同我们要操作一个勺子,就要去拿勺子的柄的道理一样。

3)事件和消息

Windows程序是基于事件或消息驱动的,其基本思想是,用特定的事件确定应用程序的控制流程。程序要花费其大部分时间来等待这些事件,并提供代码响应其中部分事件。例如,当用户单击鼠标按键时,一个事件就发生了,一条描述该事件的消息将被加入到消息队列,然后在适当的时候被发送到鼠标光标下的当前窗口,该窗口响应事件的代码将接收到该事件,然后执行。当程序完成了对事件的响应之后,它就返回等待状态。在Windows中消息用一个结构体MSG来表示,它的定义如下:

typedefstructtagMSG

{

HWND hwnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

}MSG,*PMSG;该结构体中各元素的含义如下:

hwnd:接收该消息的窗口句柄。

message:消息值,它的类型为UNIT。

wParam:消息的字参数,类型为WPARAM。

lParam:消息的长字参数。字参数和长字参数对不同的消息有不同的含义。

time:消息发送的时间。

pt:消息发送时光标在屏幕上的坐标。在MSG结构体中的元素的类型都是一些比较陌生的用大写字母表示的类型。这些类型其实是用C++的typedef关键字定义的一些别名。我们可以通过查找MSDN来确定其含义,也可以在VC++6.0中输入这些类型,在其上单击右键,选择GotoDifinitionof…就可以看见它的原始定义了。通过以上方法可以确定:UINT就是unsignedint;WPARAM也是unsignedint;LPARAM就是long;DWORD就是unsignedlong;POINT是一个结构体,定义如下:

typedefstructtagPOINT

{

LONGx;

LONGy;

}POINT,*PPOINT,NEAR*NPPOINT,FAR*LPPOINT;

Windows程序中的常用消息有:

WM_LBUTTONDOWN:按下鼠标左键;

WM_LBUTTONUP:放开鼠标左键;

WM_RBUTTONDOWN:按下鼠标右键;

WM_RBUTTONUP:放开鼠标右键;

WM_LBUTTONDBLCLK:双击鼠标左键;

WM_RBUTTONDBLCLK:双击鼠标右键;

WM_KEYDOWN:按下键盘上的一个非系统键;

WM_CLOSE:关闭一个窗口;

WM_QUIT:退出程序。

4) WinMain函数

WinMain函数是WindowsAPI编程的入口函数,就像控制台程序的入口函数Main一样。它的主要作用是显示主窗口,完成消息循环。

5)消息循环

Windows程序中每发生一个事件时,系统都把产生的消息放到应用程序的消息队列中。WinMain函数的消息循环语句从消息队列中逐个取出消息,并将其传送给窗口函数进行相应处理。消息循环一般采用如下形式:

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

API函数GetMessage从消息队列中取出消息,TranslateMessage和DispatchMessage翻译消息并将它传送给窗口函数进行相应处理。

6)窗口函数窗口函数是一个回调函数。回调函数是用户按照系统规定的形式提供给系统调用的函数。它主要对消息循环发送来的消息进行分类处理。其原型如下:

LRESULTCALLBACKWindowProc(

HWNDhwnd,

UINTuMsg,

WPARAMwParam,

LPARAMlParam

);

7)窗口类

Windows编程中的窗口类不是指某个特定的C++类,而是一个描述Windows窗口属性的数据结构,其定义如下:

typedefstruct_WNDCLASS

{ UINTstyle; WNDPROClpfnWndProc; intcbClsExtra; intcbWndExtra; HANDLEhInstance; HICONhIcon;

HCURSORhCursor;

HBRUSHhbrBackground; LPCTSTRlpszMenuName; LPCTSTRlpszClassName;

}WNDCLASS;

WNDCLASS主要成员的含义如下:

lpfnWndProc:窗口函数的指针。

hInstance:窗口类所属的应用程序的实例句柄。

hIcon和hCursor:窗口类的图标和光标。

2.Windows编程实例下面通过一个实例具体讲解如何编写简单的Windows应用程序。本程序在WinMain函数中创建一个主窗口,用鼠标左键单击主窗口时弹出一个消息框。在VC++6.0中执行菜单命令File→New,弹出如图13.2所示的对话框,输入工程名HelloWorld,选择Win32Application,弹出如图13.3所示的对话框,选择一个空工程,点击Finish完成。再选择菜单命令File→New,弹出如图13.2所示的对话框,在Files选项卡中选择C++SourceFile,取文件名为HelloWorld。点击OK按钮,完成HelloWorld.cpp文件的建立,然后输入如程序13.1所示的代码。图13.2新建工程对话框(1)图13.3新建工程对话框(2)

【程序13.1】#include<windows.h>

//窗口函数原型声明

LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);

//WinMain函数

intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow)

{

HWNDhwnd; //主窗口句柄

MSGmsg; //消息变量

WNDCLASSwndclass; //窗口类

wndclass.style=CS_HREDRAW|CS_VREDRAW;

wndclass.lpfnWndProc=WndProc;

wndclass.cbClsExtra=0;

wndclass.cbWndExtra=0;

wndclass.hInstance=hInstance;

wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);

wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);

wndclass.hbrBackground=(HBRUSH)GetStockObject

(WHITE_BRUSH);

wndclass.lpszMenuName=NULL;

wndclass.lpszClassName="HelloWorld!";

//注册窗口类

if(!RegisterClass(&wndclass))

{

MessageBox(NULL,"Cannotregisterthewindowclass!","HelloWorld!", MB_ICONERROR);

return0;

}

//创建主窗口

hwnd=CreateWindow("HelloWorld!","HelloWorld!",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,CW_USEDEFAULT,

CW_USEDEFAULT,CW_USEDEFAULT,

NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,iCmdShow);

UpdateWindow(hwnd);

//消息循环

while(GetMessage(&msg,NULL,0,0))

{ TranslateMessage(&msg); DispatchMessage(&msg);

}

return1;

}

//窗口函数

LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)

{

switch(message)

{ //处理鼠标左键按下消息

caseWM_LBUTTONDOWN: //退出消息框

MessageBox(NULL,"HelloWorld!","HelloWorld!",MB_OK);

break;

//处理程序退出消息

caseWM_DESTROY: PostQuitMessage(0); return0;

}

returnDefWindowProc(hwnd,message,wParam,lParam);

}这个小程序包括了前面所讲到的WindowsAPI编程的大部分元素,提供了一个完整的体系结构,其他的程序都可以按这个结构去改写。13.1.2MFC编程简介从程序13.1中可以看到,直接使用WindowsAPI函数来开发Windows应用程序的代码量很大。MFC是面向对象程序设计与应用框架的完美结合,它将传统的API进行了分类封装,并且为用户创建了程序的一般框架。在使用MFC开发Windows应用程序时还可以直接调用WindowsAPI函数,因此MFC框架既方便了用户也保证了灵活性。VC++6.0开发平台还为MFC提供了很好的向导,按照向导点击鼠标就能形成用户自己的程序构架,在此框架的基础上增加自己的代码就非常方便了。

1.MFC基本类介绍

MFC提供了100多个类对不同的功能进行了封装,下面介绍MFC应用程序开发中常用的类。

1) CObject类

CObject是大多数MFC类的根类或基类,它有很多有用的特性,例如对运行时类信息的支持,对动态创建的支持,对串行化的支持,对象诊断输出,等等。MFC从CObject派生出许多类,具备其中的一个或多个特性。用户也可以从CObject类派生出自己的类,利用CObject类的这些特性。

2) CWinApp类

CWinApp为应用程序类,它用于Windows操作系统应用程序的初始化、运行和终止。利用MFC开发Windwos应用程序时必须建立一个继承自CWinApp的类,并构造一个全局的该派生类的对象。

3) CDocument类

CDocument是应用程序文档类的基类,它用于对应用程序的文档进行操作,例如文档的创建、加载和保存。

4) CView类

CView类是应用程序视类的基类,一个视类与一个文档类相关联,视类封装了程序的视图功能。视图是在用户和文档之间建立的一个可视化的界面。

5) CFrameWnd类

CFrameWnd为应用程序框架窗口类的基类,它是CWnd类的子类。框架窗口一般包含菜单项、工具栏、状态栏和视图窗口。

6) CWnd类

CWnd为MFC类库的窗口类提供了基本的功能。窗口是Windows应用程序的最基本的组成部分。CWnd提供了非常多的成员函数来封装对窗口的各种操作。

7) CDialog类

CDialog是对话框类的基类,它封装了对对话框的各种操作,它继承自CWnd,因为对话框本身就是一类特殊的窗口。MFC中还包括许多继承自CDialog的通用对话框类,包括CFileDialog、CColorDialog、CFontDialog、CPintDialog等。从这些通用对话框的名称就可以了解其用途。2.通过应用程序向导创建MFC应用程序

VC++6.0提供了向导(AppWizard)来生成MFC应用程序的框架。下面介绍如何利用向导建立一个类似于程序13.1所完成的功能。点击菜单命令File→New,弹出如图13.2所示的新建工程对话框。选择MFCAppWizard[exe],输入工程名HelloWorldMFC,点击OK按钮,弹出如图13.4所示的AppWizard对话框,选择Singledocument(单文档模式),点击Next按钮将进入MFCAppWizard-Step2对话框,AppWizard提供了设置功能。选择Finish按钮,使其余选项都保持默认,完成工程的创建。图13.4新建工程对话框(3)执行以上操作后,应用程序向导AppWizard建立了一个程序框架,点击工具栏执行按钮,将看到如图13.5所示的程序框架。在这个程序框架中,常用的标题栏、菜单栏、工具栏和状态栏都已经建立好,基本上已经是一个完整的程序了。接下来用户可以在此框架的基础上实现自己的功能。下面实现在窗口中单击鼠标后弹出消息框的功能。回到VC编译环境后单击左边Workspace窗口下方的ClassView选项卡,如图13.6所示。可见AppWizard建立了CHelloWorldMFCApp、CHelloWorldMFCDoc、ChelloWorld-MFCView、CMainFrame类,它们分别是前面介绍过的CWinApp、CDocument、CView、CFrameWnd类的子类,它们共同构成了应用程序框架,如图13.6所示。图13.5程序框架图13.6

ClassView选项卡在CHelloWorldMFCView类上单击鼠标右键,选择AddWindowsMessageHandler,打开如图13.7所示的对话框,为类CHelloWorldMFCView添加消息处理,再双击左边的WM_LBUTTONDOW,为应用程序添加鼠标左键按下消息处理。单击EditExisting按钮,可在ClassView中发现类CHelloWorldMFCView已多了一个成员函数OnLButtonDown,这就是鼠标左键按下的消息处理回调函数,为它添加如下代码:

voidCHelloWorldMFCView::OnLButtonDown(UINTnFlags,CPointpoint)

{ //TODO:Addyourmessagehandlercodehereand/orcalldefault MessageBox("HelloWorldMFC!!"); CView::OnLButtonDown(nFlags,point);

}编译运行程序后在程序窗口上单击就会弹出一个消息框,如图13.8所示。前面简要介绍了两种编写Windows应用程序的方法——基于WindowsAPI和基于MFC的应用程序设计。本章后面的内容主要介绍基于MFC的Windows应用程序的基本设计方法。图13.7消息处理对话框图13.8弹出消息框13.2基于对话框的应用程序设计对话框是Windwos的重要资源,它通常设计为带有若干控件的一类窗口。对话框在程序中的主要作用是和用户交互,接收用户的输入信息或向用户展示程序的输出信息。利用MFC提供的程序框架,可以设计一类基于对话框的应用程序,这类程序的主窗口就是一个对话框和若干控件。13.2.1利用MFC的AppWizard创建基于对话框的应用程序可以利用VC++6.0为工程向导建立基于对话框的应用程序,步骤如下:

(1)打开VC++6.0,选择菜单命令File→New,弹出如图13.9所示的新建工程对话框。图13.9新建工程对话框(1)

(2)选择MFCAppWizard[exe],填入工程名DialogApp,单击OK按钮,进入如图13.10所示的MFCAppWizard-Step1对话框。

3)选择Dialogbased单选按钮,点击Finish按钮完成工程的创建。系统即为我们建立了一个默认的对话框模板,如图13.11所示。模板上有一个确定按钮、一个取消按钮和一个静态控件(其上显示文字“TODO:在这里设置对话控制。”)。在这个对话框模板上可以添加自己需要的控件来构成基于对话框应用程序的界面。这个对话框称为主对话框,与其对应的类在Workspace窗口的ClassView中可以看到,即CDialogAppDlg,这个类是对话框类CDialog的一个子类。

(4)编译运行程序就可以看到MFC框架为我们建立的默认对话框应用程序。图13.10新建工程对话框(2)图13.11默认对话框模板13.2.2Windows控件简介图13.12标准控件控件是一些特殊的窗口,通常作为对话框的子窗口出现,用户通过对控件的操作完成和应用程序的交互。Windows提供的标准控件有按钮控件、编辑框控件、列表框控件、组合框、滚动条控件、进度条控件和静态控件等。它们在程序中如图13.12所示。在MFC的类中,与以上标准控件相对应的有CButton、CEdit、CList、CCombBox、CScrollBar、CProgressCtrl和CStatic等。由于控件也是窗口,因此以上类都是继承自MFC窗口类CWnd的子类,所有CWnd类提供的方法对控件都有效。例如窗口的显示/隐藏、禁用/使用等。图13.12标准控件一个程序中的控件以其ID唯一标识自己,控件的ID号通常为一预定义的系统分配的整数值。它们在Resource.h头文件中以宏的形式定义。下面以按钮控件和编辑框控件为例简单介绍一下MFC中控件的使用,其他控件的使用和它们类似,具体情况可查找MSDN。

1.按钮控件按钮控件包括普通按钮、单选按钮、复选按钮、组框按钮等。其中组框主要是为了对控件进行分组说明。除组框外其他按钮都处理鼠标消息,当接收到鼠标消息时向其父窗口(装载按钮的对话框窗口)发送一个命令消息(WM_COMMAND消消息),对话框的窗口过程函数根据消息的字参数确定出发送消息按钮的ID,然后调用相应的消息处理函数。而其分窗口一般都提供一个消息处理函数来执行一定的操作。例如在对话框中点击确定按钮时,系统将向对话框发送一个WM_COMMAND消息,并调用消息处理函数关闭对话框。在MFC中与按钮对应的类为CButton,CButton类的主要方法如表13.1所示。表13.1CButton类的主要方法

2.编辑框控件编辑框控件一般用来向应用程序输入消息或向用户显示程序的输出结果,它分为单行的和多行的。当用户操作编辑框时,编辑框向其父窗口发送WM_COMMAND消息,该消息的字参数wParam的低字节为发送消息的控件ID号,高字节为标识用户对编辑框操作的消息通知码。在MFC中对这些消息通知码都进行了消息映射,将其映射到一个回调函数中,用户只需要在消息通知码的回调函数中编写自己的代码,程序会在用户对编辑框进行某种操作时自动调用这个消息映射回调函数。这种消息映射机制是MFC中常见的一种处理消息的方法。在MFC中与编辑框对应的类为CEdit,CEdit的主要方法如表13.2所示。表13.2

CEdit类的主要方法13.2.3基于对话框的应用程序实例解析本节将实现如图13.13所示的简单计算器程序,用户点击“计算”按钮时,程序会根据左边的选择将按钮上面前两个编辑框中的数字进行运算并显示在最后一个编辑框中。

1.程序界面设计继续使用13.2.1节中创建的工程来完成程序的设计。选择WorkSpace窗口的ResourceView选项卡,展开Dialog文件夹前面的小十字。双击其下的IDD_DIALOGAPP_DIALOG,进入主对话框模板编辑状态。这时在VC窗口的右边就能看到如图13.14所示的控件窗口(如果没有可在工具栏空白处单击右键,在快捷菜单中选择control)。按照图13.14所示的界面从控件窗口中拖出相应的控件并摆放到相应的位置。图13.13实例程序效果图图13.14控件窗口

2.控件属性的设置

VC++6.0环境提供了可视化设置控件属性的功能。选中某个控件后单击右键菜单中的Properties或者选中控件后直接按回车键都会弹出如图13.15所示的控件属性设置对话框。通过该对话框可以设置控件的ID、标题(Caption)、风格等属性。其中控件ID是每个控件都必须设置的内容,它唯一标识了整个程序中用到的控件,可以输入任意合法的标识符,VC会将其定义为一个宏,并为其分配一个唯一的整数值。可对各个控件设置其属性,如表13.3所示。

图13.15控件属性设置对话框表13.3控件属性表

3.成员变量的绑定编辑好了控件以后,为了在程序中更方便地操作控件,可以在对话框类中为控件绑定一个成员变量。MFC提供了DDX(动态)技术,不但可以为控件绑定与其对应的类类型的变量,还可以绑定与控件操作的数据相关的类型的变量。例如,可以为编辑框绑定CEdit类型的变量,也可以绑定int、float等类型的数据。如果为其绑定了float类型的变量,改变了该变量的值就会在编辑框中显示出来;同时,如果运行程序时通过输入改变了控件的内容,与其绑定的变量的值也会改变。执行菜单命令View→ClassWizard或按快捷键Ctrl+W,打开如图13.16所示的ClassWizard对话框。选择MemberVariables选项卡,在Classname中选择主对话框类CDialogAppDlg类,在下面的控件ID中选择IDE_MULTI1,点击AddVariable为表示被乘数的编辑框绑定变量,弹出如图13.17所示的添加成员变量对话框,变量名输入m_multi1,绑定类型为Value,变量类型为float。此方法为其他控件绑定的变量如表13.4所示。在图13.16中只能看到ID为IDR_ADD的单选按钮,原因是在设置控件属性时为IDR_ADD设置了Group属性。为单选按钮设置Group属性后它将和其后与其ID相连的单选按钮分为一组,只为第一个按钮绑定变量即可操作整组单选按钮。以上绑定的所有变量都是做为主对话框类CDialogAppDlg的成员变量,可以在WorkSpace的ClassView窗口中找到类CDialogAppDlg,查看ClassWizard添加的成员变量。图13.16ClassWizard对话框

图13.17添加成员变量对话框表13.4控件绑定变量

4.添加消息处理并完成程序功能下面为程序添加代码部分。本实例程序是在点击“计算”按钮后执行操作的,所以应该将实现代码放在“计算”按钮的处理代码中。前面讲过点击一个按钮后,按钮将向其父窗口发送一个WM_COMMAND消息。在MFC中通过消息映射机制将消息的处理映射到一个函数上,称其为消息处理函数。下面就为按钮“计算”添加消息处理函数和代码。打开ClassWizard对话框,选择MessageMaps选项卡,确保类名为CDialogAppDlg,在左边选择IDB_COMPUT,右边选择BN_CLICKED,点击按钮AddFuction后点击EditCode按钮。这时MFC向导将自动为主对话框类CDialogAppDlg添加一个成员函数,函数原型为CDialogAppDlg::OnComput(),这个函数就是“计算”按钮的消息处理函数,在该函数中添加如下代码:

voidCDialogAppDlg::OnComput()

{

//TODO:Addyourcontrolnotificationhandlercodehere

UpdateData(true);

switch(m_radioType)

{ case0:

//当选中“加法”按钮时

m_type="+";

m_result=m_multi1+m_multi2;

break;

case1: //当选中“减法”按钮时

m_type="-";

m_result=m_multi1-m_multi2;

break; case2:

//当选中“乘法”按钮时

m_type="×";

m_result=m_multi1*m_multi2;

break; case3:

//当选中“除法”按钮时

m_type="÷";

if(m_multi2==0)

{ MessageBox("除数不能为零!!"); break; } else

{ m_result=m_multi1/m_multi2; break; } } UpdateData(false);

}以上代码中函数UpdateData()是父类CWnd类的成员函数,它有一个bool类型的参数,参数取true表示用与控件绑定的变量的值来更新控件的内容,参数取false表示用控件的内容来更新与控件绑定的变量的值。switch(m_radioType)语句中,m_radioType为与单选按钮组绑定的成员变量,选择了第一个按钮时它的值为0,后面依次加1。m_type="+"语句是根据选择的计算类型将表示运算符的静态变量的内容改为相应的运算符。m_result=m_multi1+m_multi2语句是将第一个编辑框和第二个编辑框中的数加起来放到第三个编辑框中,由于MFC采用了DDX函数机制,因此改变了m_result的值就等于改变了与其绑定的控件上要显示的内容。

5.编译运行程序程序的编译运行结果如图13.18所示。图13.18程序运行结果13.3单文档(SDI)和多文档(MDI)应用程序常见的Windows应用程序大多都是以文档或视图来组织程序结构的,文档或视图结构将数据和数据的显示分离开。文档专门用于组织程序中用到的数据以及数据结构并将其存档到硬盘等永久性介质中。视图则用来将文档中的数据显示给用户,并将用户操作修改后的数据传送给文档来处理。根据程序能够同时打开的文档的数目,可以把基于文档视图结构的应用程序分为单文档(SDI)的和多文档(MDI)的。单文档的应用程序同时只能打开一个文档。例如Windows提供的画图和记事本程序都是单文档结构的。多文档应用程序可以同时打开多个文档进行编辑,这些文档还可以具有不同的文档模板。例如Office系列的程序都是多文档的应用程序。13.3.1文档/视图结构概述利用VC++6.0生成的程序框架可以是基于对话框的也可以是基于单文档或基于多文档的,这可以在新建工程时的工程向导AppWizard中选择(如图13.4所示)。AppWizard生成的单文档或多文档应用程序框架主要由两个窗口和三个类组成。两个窗口是框架窗口和视图窗口。两个窗口之间的关系如图13.19所示。框架窗口主要用来放置系统菜单、工具栏、状态栏等。视图窗口则是覆盖在框架窗口之上的一个窗口,主要用来向用户显示信息或接收用户的输入信息。三个类分别是框架窗口类、视图窗口类和文档类。框架窗口类的名称一般固定为CMainFrame,它是类CFrameWnd的子类。视图类的名字为C***View(***代表工程名),它为CView的子类。文档类的名字为C***Doc,它为CDocument类的子类。图13.19框架窗口与视图窗口的关系13.3.2文档/视图结构中的一些重要概念

1.文档视图之间的互操作文档和视图之间存在一相互操作的接口,如下所示:

CView::GetDocument()函数:检索其文档的指针。

CDocument::UpdateAllViews()函数:更新与某文档相连的视图。

CDocument::OnNewDocument()函数:初始化文档成员。

CFrameWnd::GetActiveDocument()函数:从任何CFrameWnd的派生类中,访问目前活动的文档。

2.文档类的处理

MFC的文档视图结构中对文档的处理一般采用以下几步:

(1)从CDocument类派生出自己的文档类。

(2)在文档类中添加描述程序数据结构的数据成员。

(3)在用户的文档中覆盖基类的串行化虚函数Serialize,该函数可以将数据存储到永久介质上或从永久介质上读取数据。

3.文档的串行化文档的串行化是指将文档类中数据成员的值保存在磁盘文件中,或者将存储在文件中的数据读取到相应的成员变量中的过程。文档的串行化一般通过在自己的文档类中覆盖基类CDocument的成员函数Serialize来实现,该函数的形式如下所示:

voidCMyDoc::Serialize(CArchive&ar)

{ if(ar.IsStoring()) { //TODO:addstoringcodehere } else { //TODO:addloadingcodehere }

}该函数中用到的类CArchive封装了对文件的操作。ar.IsStoring()函数用来判断是从文档中读取数据还是向文档中写入数据。

4.视图类的处理视图类的处理步骤如下:

(1)从视图类CView中派生出自己的视图类。

(2)重载视图类的OnDraw函数,该函数根据文档类将Windows消息和用户界面对象(如菜单项)与视图类中的消息处理函数进行连接。

(3)实现消息处理函数,以解释用户的输入。

(4)根据需要,在派生的视图类中重载CView的其他成员函数。13.3.3菜单的编辑和使用基于文档视图结构的单文档或多文档应用程序中经常要用到菜单资源。AppWizard已经在单文档和多文档程序中建立了一个主菜单资源。首先新建一个单文档应用程序,展开资源视图。然后双击Menu子项下的ID为IDR_MAINFRAME的菜单资源,就会进入菜单资源的编辑状态,如图13.20所示,可以发现AppWizard已经在该菜单资源中添加了“文件”、“编辑”等一些常用的子菜单。图13.20菜单资源在菜单资源中通过鼠标点击就能很容易地为菜单资源增加子菜单和菜单项。这里为主菜单增加一个子菜单,名字为“显示”,为该子菜单增加一个菜单项“消息”,设置它的ID为IDM_MSG,如图13.21所示。有了菜单项后就可以为该菜单项增加处理函数了。打开ClassWizard对话框,按图13.22设置后点击AddFunction按钮,就会在CMainFrame类中为菜单项增加一个消息处理函数OnMsg()。图13.21增加菜单项图13.22为菜单项添加消息处理函数在OnMsg()函数中完成如下代码:

voidCMainFrame::OnMsg()

{ //TODO:Addyourcommand

温馨提示

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

评论

0/150

提交评论