数字图像处理第3章.pps

上传人:牧羊曲112 文档编号:6294539 上传时间:2023-10-14 格式:PPS 页数:84 大小:2.13MB
返回 下载 相关 举报
数字图像处理第3章.pps_第1页
第1页 / 共84页
数字图像处理第3章.pps_第2页
第2页 / 共84页
数字图像处理第3章.pps_第3页
第3页 / 共84页
数字图像处理第3章.pps_第4页
第4页 / 共84页
数字图像处理第3章.pps_第5页
第5页 / 共84页
点击查看更多>>
资源描述

《数字图像处理第3章.pps》由会员分享,可在线阅读,更多相关《数字图像处理第3章.pps(84页珍藏版)》请在三一办公上搜索。

1、第三章 VC图像编程基础,3.1 VC+可视化编程3.2 ImageLoad.dll动态链接库 3.3 设计CDibObject类 3.4 使用CDibObject类 3.5 CDibObject类应用实例,3.1 VC+可视化编程,3.1.1 概述 VC+是Microsoft公司推出的开发Win 32应用程序(Windows 95/98/2000/XP/NT)的面向对象的可视化集成工具。随着VC+所提供的Microsoft基础类库(Microsoft Foundation Class Library,简写为MFC),对Windows 95/NT所用的Win 32应用程序接口(Win 32 A

2、pplication Programming InterfaceAPI)进行了彻底的封装,从而可以使用完全的面向对象的方法来进行Win 32应用程序的开发,这样大大缩短了应用程序开发周期,降低了开发成本,也将程序员从大量的复杂劳动中解放出来。,VC+Developer Studio包含有编写程序源代码的文本编辑器、设计用户界面(菜单、对话框、图标等)的资源编辑器、建立项目配置的项目管理器、检查程序错误的集成调试器等工具,同时它还提供了功能强大的应用程序向导工具AppWizard和类向导工具ClassWizard。AppWizard用于生成各种不同类型的具有Windows界面风格的应用程序的基本

3、框架,在生成应用程序框架后,使用ClassWizard便可轻松完成创建新类、定义消息处理函数、重载虚拟函数等操作。,3.1.2 用户界面,图3-1 VC+6.0用户界面,VC+6.0提供有多种不同用途的菜单命令和工具按钮,多数菜单和工具按钮是人们熟悉的标准Windows菜单和工具铵钮。用VC+6.0开发应用程序主要涉及三大类型的文件:文件(Files)、项目(Projects)和工作区(Workspaces)。在VC+6.0中,通常意义下开发一个Windows应用程序是指生成一个项目,该项目包含着一组相关的文件,如各种头文件(.h)、实现文件(.cpp)、资源文件(.rc)、图标文件(.ico

4、)、位图文件(.bmp)等,而该项目必须在一个工作区打开。所以,当第一次建立一个应用程序时,应选择新建一个项目,此时VC+6.0自动建立一个工作区,并把新建的项目在该工作区中打开,以后要对该项目进行修改、补充、增加等工作,只要打开对应的工作区即可。,VC+6.0以项目工作区(Project Workspace)的方式来组织文件、项目和项目配置,通过项目工作区窗口可以查看和访问项目中的所有元素。首次创建项目工作区时,要创建一个项目工作区目录、一个项目工作区文件、一个项目文件和一个工作区选项文件。项目工作区文件用于描述工作区及其内容,扩展名为.dsw。项目文件用于记录项目中各种文件的名字和位置,扩

5、展名为.dsp。工作区选项文件用于存储项目工作区设置,扩展名为.opt。,创建或者打开项目工作区时,VC+6.0将在项目工作区窗口中显示与项目有关的信息。项目工作区窗口主要由三个面板构成,即FileView、ResouceView和ClassView,分别用于显示项目中定义的C+类、资源文件和包含在项目工作区中的文件。每个面板用于指定项目工作区中所有项目的不同视图,视图中每个文件夹可以包含其他文件夹或各种元素(如,子项目、文件、资源、类和标题等)。通过项目工作区窗口可以定位到项目中的任一位置,以对其进行相应的编辑(源程序、资源等),编辑区窗口打开文本编辑器和资源编辑器。文本编辑器的使用与Wor

6、d非常类似,通过它可方便的进行程序源代码的输入、编辑和修改工作。在资源编辑器中可进行各种资源的编辑工作,如对话框、图标、菜单、位图等,从而直观地设计程序的用户界面。输出窗口用于显示项目建立过程中所产生的错误信息、调试过程中的输出信息等,用它可以方便地定位到工程中的错误位置,观察到程序调试过程中的输出结果。,3.1.3 框架和文档视结构 基于MFC的应用程序框架(Application Framework)是定义了程序结构的MFC类库中类的集合,它是VC+编程的骨架。运用MFC应用程序框架具有如下优点:(1)标准化的程序结构和用户接口:这对具有标准用户界面的Win 32程序来说,可以极大地减轻程

7、序员的负担,使程序员不必过多地考虑界面,而把主要精力放在程序设计上,以提高程序设计的效率。(2)框架产生的程序代码短,运行速度快,具有很大的灵活性。(3)MFC封装了Win 32 SDK中的几乎所有的函数,能够实现Win 32系统的任何功能。,MFC框架的核心是文档视结构(Document-View Architecture)。简单地说,文档视结构就是将数据和对数据的观察相分离,文档仅处理数据的读、写等操作,视则是显示和处理数据的窗口,视可以操作文档中的数据。MFC框架的基本结构包括应用程序对象、主框架窗口、文档、视等,框架通过命令和消息将它们结合在一起,共同对用户的操作做出响应。应用程序的对

8、象类由CWinApp派生,一个应用程序有且仅有一个应用程序对象,它负责应用程序实例的初始化和进程结束时的资源清除,以及创建和管理应用程序所支持的所有文档模板的工作。,主框架窗口是应用程序的主窗口。MFC框架定义了两种基本的主框架窗口类,即单文档接口SDI(Single Document Interface)主框架窗口类和多文档接口MDI(Multiple DocumentInterface)主框架窗口类。对于SDI,视是主框架窗口的子窗口;对于MDI,必须从CMDIChildWnd派生出主框架窗口的子窗口,视是该子窗口的子窗口。,文档类由CDocument类派生,文档是一个应用程序数据元素的集

9、合,它构成应用程序所使用的数据单元,另外,它还提供了管理和维护数据的手段。文档是一种数据源,数据源有很多种,最常见的是磁盘文件,但它不一定是一个磁盘文件,文档的数据源也可以来自串行口、网络或摄像机输入信号等。视类从CView或其子类(CEditView、CFormView、CRecordView、CScrollView等)派生,是数据的用户窗口,为用户提供了文档可视的数据显示,它将文档的部分或全部内容显示在窗口中。视还给用户提供了一个与文档中的数据进行交互的界面,它把用户的输入转化为对文档中数据的操作。每个文档都会有一个或多个视显示,一个视既可以输出到屏幕窗口中,也可以输出到打印机上。,图3-

10、2 MFC应用程序框架结构(a)SDI框架结构;(b)MDI框架结构,文档视结构大大简化了多数应用程序的设计开发过程。它带来的好处主要有:(1)将数据操作和数据显示、用户界面分离。这是一种“分而治之”的思想,这种思想使得模块划分更加合理、模块独立性更强,同时也简化了数据操作和数据显示、用户界面设计工作。文档只负责数据管理,不涉及用户界面;视只负责数据输出与用户界面的交互,可以不考虑应用程序的数据是如何组织的,甚至当文档中的数据结构发生变化时也不必改动视的代码。,(2)MFC在文档视结构中提供了许多标准操作界面,包括新建文件、打开文件、保存文件、打印等,减轻了用户的工作量。用户不必再编写这些重复

11、的代码,从而可以把更多的精力放到编写应用程序特定功能的代码上(主要是从数据源中读取数据和显示)。,(3)支持打印和打印预览,用户无需编写代码或只需要编写很少的代码,就可以为应用程序提供打印和打印预览功能。同样的功能如果自己写的话,需要数千行代码。由于文档视结构功能强大,因此一般用VC+进行程序设计时都首先使用AppWizard生成基于文档视结构的单文档或多文档应用程序框架,然后在其中添加自己需要的代码,完成应用程序的特定功能。,3.1.4 编程基本流程 VC+的资源编辑器能以所见即所得(What you see is what you get)的形式直接编辑应用程序用户界面,为所有资源分配ID

12、标识号。ClassWizard能把对话框模板与自动生成的类定义或与已有的类代码连接起来,为菜单项、控件等资源生成空的处理函数模板,创建消息映射函数模板,并将资源ID与处理函数联接起来。通过使用AppWizard,程序员的编程工作便简化为用资源编辑器直观地设计界面,完善对话框类代码。在空的处理函数模板处填写响应用户操作的代码,是一种完善的可视化编程方法。,用VC+进行Win 32可视化编程的基本流程如下:(l)生成框架:运行AppWizard,并按需要指定生成应用程序的选项,指定框架中视类的基类(CView、CEditView、CFormView、CScrollView、CTreeView等)。

13、AppWizard将按指定的选项生成应用程序框架和相关的文件,包括项目(project)的工作空间(workspace)文件和源文件,主要是应用程序(application)、文档(document)、视(view)和主框窗口(main frame)的C+代码文件(*.cpp,*.h文件),以及缺省包含标准界面接口的资源文件(*.rc)。,(2)设计用户界面:利用VC+资源编辑器编辑资源文件,设计菜单、对话框、工具条、字符串、加速键、位图、图标、光标等项目资源。(3)联接界面和代码:利用ClassWizard把资源文件中定义的界面资源标识ID(如菜单项、工具条和对话框中的控件等)在指定的源文件

14、中映射成相应的函数模板。(4)编写、修改函数代码:利用ClassWizard可以方便地在源代码编辑器(source code editor)中跳转到指定的函数代码处。,(5)根据需要创建新类和编写代码:用ClassWizard创建新类,并生成相应的源文件。如新类是对话框类,可先用资源编辑器生成对话框模板,然后用ClassWizard创建对话框类代码,并与模板联接,编写新类相关的源代码。(6)实现文档类:在AppWizard生成的框架基础上设计文档数据的数据结构,在文档类中增加相应的成员变量和成员函数,实现对数据的操作和文档与数据的接口。,(7)实现框架中标准的文件操作命令,即Open、Save

15、和Save As命令:框架已完成标准的文件操作命令的所有接口,程序员要做的仅仅是编写文档类的串行化(Serialize())成员函数。(8)实现视类:框架已构造好了文档与视的关系,视能方便地访问文档中的public数据成员,可根据文档的需要构造一个或多个视类。通过ClassWizard把视的用户接口资源映射成函数模板,并编写函数代码。,(9)如需要,增加分割窗口(splitter window):在SDI的主框窗口类或MDI的子窗口类中添加一个CSplitterWnd对象,并在窗口类的OnCreateClient成员函数中对CSplitterWnd对象进行创建和初始化。如果用户分割了一个窗口,

16、框架将给文档创建并增加附加的视对象。(10)建立、调试、修改应用程序。如有问题,可根据需要重复步骤(2)(10)。(11)测试应用程序。如有问题,可根据需要重复步骤(2)(11)。(12)结束。,3.2 ImageLoad.dll动态链接库,3.2.1 ImageLoad.dll库简介 使用VC+6.0提供的Dependency Walker工具,可以查看ImageLoad.dll的导出函数列表,如图3-3所示。可见,该动态链接库共有22个函数,其中18个函数与图像文件的读写操作有关,这些函数分为三类:Load函数用于读入图像文件;Save函数用于保存图像文件;Get函数用于获取图像文件的相关

17、信息。对于ImageLoad.dll动态链接库,查看其定义头文件ImageLoad.h便可对其属性(成员变量)和方法(成员函数)有一全面的了解。,3-3,/ImageLoad.h/Generic/Image Type#define IMAGETYPE_NONE 0#define IMAGETYPE_BMP1#define IMAGETYPE_GIF2#define IMAGETYPE_PCX3#define IMAGETYPE_TGA4#define IMAGETYPE_JPG5#define IMAGETYPE_TIF6,#ifdef-cplusplusextern C#endif/Erro

18、rint-declspec(dllexport)GetLastPicLibError(void);/Type filenameint-declspec(dllexport)FileType(const char*);,/BMP/hDib filenameHGLOBAL-declspec(dllexport)LoadBMP(const char*);/Success filename w h planes bits colorsBOOL-declspec(dllexport)GetBMPInfo(const char*,int*,int*,int*,int*,int*);/Success fil

19、ename hDibBOOL-declspec(dllexport)SaveBMP(const char*,HGLOBAL);,/GIF/hDib filenameHGLOBAL-declspec(dllexport)LoadGIF(const char*);/Success filename w h planes bits colorsBOOL-declspec(dllexport)GetGIFInfo(const char*,int*,int*,int*,int*,int*);/Success filename hDibBOOL-declspec(dllexport)SaveGIF(con

20、st char*,HGLOBAL);,/PCX/hDib filenameHGLOBAL-declspec(dllexport)LoadPCX(const char*);/Success filename w h planes bits colorsBOOL-declspec(dllexport)GetPCXInfo(const char*,int*,int*,int*,int*,int*);/Success filename hDibBOOL-declspec(dllexport)SavePCX(const char*,HGLOBAL);,/TGA/hDib filenameHGLOBAL-

21、declspec(dllexport)LoadTGA(const char*);/Success filename w h planes bits colorsBOOL-declspec(dllexport)GetTGAInfo(const char*,int*,int*,int*,int*,int*);/Success filename hDibBOOL-declspec(dllexport)SaveTGA(const char*,HGLOBAL);,/TIF/hDib filenameHGLOBAL-declspec(dllexport)LoadTIF(const char*);/Succ

22、ess filename w h planes bits colorsBOOL-declspec(dllexport)GetTIFInfo(const char*,int*,int*,int*,int*,int*);/Success filename hDibBOOL-declspec(dllexport)SaveTIF(const char*,HGLOBAL);,/JPG/hDib filenameHGLOBAL-declspec(dllexport)LoadJPG(const char*);/Success filename w h planes bits colorsBOOL-decls

23、pec(dllexport)GetJPGInfo(const char*,int*,int*,int*,int*,int*);/Success filename hDibBOOL-declspec(dllexport)SaveJPG(const char*,HGLOBAL,int);,/PALETTE/Count RGB History Colormap MaxColorsWORD-declspec(dllexport)MedianCut(WORD Hist,BYTE ColMap3,int);WORD-declspec(dllexport)Popularity(ZK(unsigned cha

24、r*pBits,int nBits,int nWidth,int nHeight,BYTE ColorMap3);ZK)#ifdef-cplusplus#endif,另外,为处理出错信息,还定义了一个ImageErros.h文件来声明读写图像文件时的错误代码,其内容如下:,/ImageErros.h#ifndef-ERRORS_H-#define-ERRORS_H-#define IMAGELIB_SUCCESS 0,/File errors#define IMAGELIB_FILE_OPEN_ERROR 1#define IMAGELIB_FILE_CREATION_ERROR-2#defi

25、ne IMAGELIB_FILE_WRITE_ERROR-3#define IMAGELIB_FILE_READ_ERROR-4/Memory erros#define IMAGELIB_MEMORY_ALLOCATION_ERROR-50#define IMAGELIB_MEMORY_LOCK_ERROR-51,/Argument errors#define IMAGELIB_NODIB-100/Operate errors#define IMAGELIB_UNSUPPORTED_FILETYPE-200#define IMAGELIB_HDIB_NULL-201#define IMAGEL

26、IB_LOGICAL_PALETTE_CREATION_ERROR-202#define IMAGELIB_NO_PALETTE_FOR_HIGH_COLOR-203#define IMAGELIB_STRETCHDIBITS_ERROR-204#define IMAGELIB_PALETTE_QUANTIZE_ERROR-205#define IMAGELIB_ATTEMPT_CHANGE_TO_SAME-206#define IMAGELIB_ROTATION_VALUE_ERROR-207#define IMAGELIB_ROTATE_ERROR-208#endif,3.3.2 Imag

27、eLoad.dll动态链接库的使用 要使用ImageLoad.dll动态链接库,需如下四个步骤:(1)将ImageLoad.dll拷贝到应用程序所在的目录、Windows目录、WindowsSystem目录或WindowsSystem32目录。(2)将ImageErros.h、ImageLoad.h两个头文件及ImageLoad.lib库文件拷贝到当前工程目录或是在VC+集成开发环境中设置其所在的路径。,(3)用VC+的ProjectAdd to projectFiles.菜单将ImageLoad.lib添加到工程中。(4)在要用到ImageLoad.dll的C+头文件(.h)或实现文件(.c

28、pp)中用#include ImageErros.h和#include ImageLoad.h两个语句将两个头文件包含到应用程序的设计中。这样就可以利用ImageLoad.dll动态链接库提供的相应函数,来完成六种格式图像文件的读写操作。,3.3 设计CDibObject类,由于MFC没有封装处理与DIB位图相关的Windows API函数的类,所以本着面向对象的思想,有必要设计一个CDibObject类来完成如下功能:读取某种类型的图像文件;获取图像的相关信息;显示图像;以相同或不同类型格式的图像文件保存该图像。从而在以后的数字图像处理中,可方便地将CDibObject类添加进设计的工程中以

29、完成相应的处理。,3.3.1 公用方法的设计 根据对CDibObject类的基本要求,它至少应该具有下述方法(成员函数):(1)构造函数:该类应提供三个不同版本的构造函数,一个是无参构造函数,用于动态创建对象;一个是接受文件名作为参数的构造函数,用于创建一个与由文件名指定的图像文件相对应的有意义的对象;另外,还应提供一个复制构造函数,以便将一个CDibObject类对象的属性直接复制到另一个CDibObject类对象中。,(2)Load()函数:该函数将一个图像文件装入CDibObject类对象,它以接受的文件名作为参数。(3)Save()函数:该函数用指定的文件名将保存在CDibObject

30、类对象中的当前图像保存为一个图像文件,该文件名同时也应指定保存图像的文件类型。(4)Draw()函数:该函数在指定的设备描述表上绘制图像,它应接受指向该设备环境的指针作为参数。调用此绘图函数时,也应该指定绘制图像的位置坐标。,(5)与图像信息有关的函数:即一系列用于获取和设置类属性的Get/Set函数。这些函数用来获取和设置图像的各种信息,如图像的类型、高度、宽度、位平面数、单个像素的位数、图像使用的颜色数等。(6)与调色板操作有关的函数:即用于创建、获取、设置逻辑或系统调色板的颜色数和调色板数据等信息的函数。,3.3.2 类属性的设计 CDibObject类主要应设计如下属性(成员变量):(

31、1)char*m_pszFilename:此变量用来保存图像文件名。(2)int m_nImageType:此变量用来保存图像类型,图像类型由文件“ImageLoad.h”定义。值得注意的是,图像的类型必须使用“ImageLoad.h”定义的原始顺序,它与“ImageLoad.dll”中的函数FileType返回的int类型的值相对应,对此不能进行改变。,(3)char szExtensions:这是一个数组变量,用来保存图像文件的扩展名(即在打开文件对话框中的文件过滤器),其值为.BMP、.GIF、.PCX、.TGA、.JPG、.TIF和(空字符串)。(4)HGLOBAL m_hDib:当图

32、像载入后,使用此变量获取该图像的DIB(Device Independent Bitmap设备无关位图)句柄。实际上无论什么类型的图像文件,如果要在Windows操作系统中显示,都应该使用DIB位图格式。,(5)int m_nWidth,m_nHeight,m_nPlanes,m_nBits,m_nColors:这些变量分别描述图像的宽度、高度、位平面数、每像素的位数(1、4、8、16、24或32位)和颜色数。(6)int m_nX,m_nY:用这两个变量确定绘制图像的左上角位置。(7)CPalette m_Palette:此变量指定图像中使用的调色板对象。,(8)int m_nPalette

33、CreationType:当需要通过颜色还原一幅具有调色板的图像时,使用此变量确定调色板类型。其中,0表示JGPT_POPULARITY_PALETTE,1表示JGPT_MEDIAN_CUT_PALETTE,2表示JGPT_FIXED_PALETTE。(9)LOGPALETTE*m_pLogPal:该指针型变量用来指向图像所使用的逻辑调色板。(10)int m_nQuality:使用此变量描述JPEG图像的压缩质量。该值为0到100之间的整数,其值越大,图像质量越好,但文件尺寸也将越大。,(11)int m_nLastError:该变量用来保存最后一次图像处理中的错误号,错误号由“ImageE

34、rros.h”头文件定义。对于CDibObject类的构造函数、载入和保存成员函数以及大多数Set/Get成员函数的意义都是暗含的,在此不再详细讨论。请读者阅读本书所附CD-ROM中的CDibObject类定义文件“DibObject.h”和实现文件“DibObject.cpp”,作者在程序源代码中加入了详尽的注释,相信读者能够理解。,3.4 使用CDibObject类,3.4.1 添加CDibObject类定义文件 将“DibObject.h”和“DibObject.cpp”两个文件复制到当前工程目录。选择VC+集成开发环境的ProjectAdd to projectFiles.菜单项,系统

35、打开如图3-4所示的“Insert Files into Project”对话框。,图3-4 在工程中添加“DibObject.h”和“DibObject.cpp”,选择文件“DibObject.h”和“DibObject.cpp”,单击“OK”将这两个文件添加到当前工程中。这样便将上一节所设计的CDibObject类添加到当前的工程中,从而可以使用类中提供的方法和属性。,3.4.2 设置工程选项 要使用ImageLoad.dll动态链接库,如前所述,先将其拷贝至Windows系统目录下(Windows 95/98为“System”目录,Windows 2000/XP/NT为“System32

36、”目录)或将其复制到编译后的应用程序当前目录(“Debug”或“Release”目录)。再将与ImageLoad.dll动态链接库相关的“ImageLoad.h”、“ImageLoad.lib”和“ImageErros.h”复制到当前工程目录。选择VC+集成开发环境的ProjectSettings.菜单项,系统打开如图3-5所示的“ProjectSettings”对话框,在“Object/Library modules”编辑框中输入“ImageLoad.lib”,单击“OK”。如此便可在应用程序中使用ImageLoad.dll动态链接库提供的多格式图像文件的打开和保存函数,轻松完成图像文件的读

37、写工作。,图3-5“Project/Settings”对话框,3.5 CDibObject类应用实例,3.5.1 建立应用程序框架 使用MFC AppWizard创建图像处理应用程序基本框架,其步骤如下:(1)从File菜单中选择New菜单项,弹出New对话框。(2)选择Projects选项卡,从项目类型列表中选择MFC AppWizard(.exe),在ProjectsName文本框中输入项目名称,这里设为Dip。(3)在MFC AppWizard-Step 1对话框中选择MDI用户界面和中文中国。,(4)在MFC AppWizard-Step 6对话框中将CDipView类的基类改为CSc

38、rollView以支持视图滚动。(5)其他各选项采用默认值。(6)单击Finish按钮,再单击OK,MFC AppWizard将自动生成图像处理程序的各个源文件。,3.5.2 添加消息映射函数 因为应用程序类CDipApp带有自己的“文件新建”和“文件打开”菜单,在此为这两个菜单项添加消息映射处理函数。使用MFC ClassWizard分别为ID_FILE_NEW和ID_FILE_OPEN两个菜单命令消息添加“OnFileNew”和“OnFileOpen”。MFC AppWizard自动生成的Dip应用程序框架在运行时会自动打开一个新的空白子窗口。若不希望出现此窗口,可以简单地声明OnFile

39、New函数,但不编写任何代码。,3.5.3 改写OnFileOpen函数以打开图像文件 在Dip.cpp文件头部添加如下代码:char szFilter=位图文件(*.BMP)|*.BMP|图形交换格式文件(*.GIF)|*.GIF|PCX文件(*.PCX)|*.PCX|TGA文件(*.TGA)|*.TGA|JPEG文件(*.JPG)|*.JPG|标记图像文件(*.TIF)|*.TIF|所有支持图片|*.BMP,*.GIF,*.PCX,*.TGA,*.JPG,*.TIF|所有文件(*.*)|*.*|;,在此声明的字符数组szFilter保存了文件打开和关闭对话框的过滤器数组。szFilter是

40、一个包含有通配符的以“|”字符分隔的字符串。要注意的是,在第一个“|”字符之前是将要显示在文件打开和保存对话框的“文件类型”列表框中的信息,第二个“|”字符和第一个“|”字符之间的内容为对话框的过滤器内容。在字符串szFilter的尾部,使用两个“|”字符而不是一个,表示过滤器内容结束。注意:szFilter中不能包含任何空格,并且声明为全局变量。,成员函数CDip:OnFileOpen负责打开一个图像文件,其代码如下:void CDipApp:OnFileOpen()static int nIndex=1;CFileDialog FileDlg(TRUE,NULL,NULL,OFN_HIDE

41、READONLY,szFilter);FileDlg.m_ofn.nFilterIndex=(DWORD)nIndex;if(FileDlg.DoModal()=IDOK)CString PathName=FileDlg.GetPathName();PathName.MakeUpper();OpenDocumentFile(PathName);nIndex=(int)FileDlg.m_ofn.nFilterIndex;,程序中声明一个CFileDialog类的对象FileDlg,其第一个参数设置为TRUE,表示该对话框为“打开”对话框,其最后一个参数为设置好的过滤器数组,其他参数可参阅VC+

42、帮助系统MSDN。程序接下来将FileDlg对象的m_ofn结构的nFilterIndex字段设置为缺省的第一个过滤器值,并调用FileDlg.DoModal()成员函数显示“打开”对话框。成员函数FileDlg.GetPathName()负责返回选择的包含完整路径信息的文件名,应用程序类CDipApp的成员函数OpenDocumentFile将使用该文件名创建一个文档。,3.5.4 添加CDibObject类对象成员变量 文档类CDipDoc负责维护文档的具体数据。因此,在该类中声明两个公有型的成员变量:,public:BOOL m_bImageLoaded;CDibObject*m_pDi

43、bObject;,其中,m_pDibObject为指向CDibObject类的指针,它将用于保存从图像文件中获取的图像。成员变量m_bImageLoaded声明为BOOL型,用来记录图像是否读入内存。,另外,声明的指针型变量还应在类的构造函数和析构函数中正确的初始化和释放。为此,在CDipDoc类的构造函数和析构函数中添加如下代码:CDipDoc:CDipDoc()/TODO:add onetime construction code here m_pDibObject=NULL;m_bImageLoaded=FALSE;CDipDoc:CDipDoc()if(m_pDibObject!=NU

44、LL)delete m_pDibObject;m_pDibObject=NULL;,注意:当删除了指针所指向的对象时,相应的指针本身并没有删除,此时指针变量本身的值指向何处就无法知道了,因此,再次将它赋值为NULL。要使程序能够正确编译,还必须在文件中添加定义CDibObject的头文件,可以在“DipDoc.h”文件的头部用#include将“DibObject.h”文件包含进来。但考虑到工程中多处将用到CDibObject类,以及“DibObject.h”文件将很少再改动,所以将其直接包含在“StdAfx.h”文件中比较合适,于是在“StdAfx.h”文件中添加如下代码:#include

45、DibObject.h,3.5.5 为CDipDoc文档类映射消息处理函数 使用MFC ClassWizard分别为ID_FILE_NEW、ID_FILE_OPEN、ID_FILE_SAVE AS菜单命令消息添加消息映射处理函数OnFileNew()、OnFileOpen()和OnFileSaveAs()函数。(1)ID_FILE_NEW消息处理函数代码如下:void CDipDoc:OnFileNew()/TODO:Add your command handler code here 与CDipApp类处理一样,CDipDoc类的消息映射函数OnFileNew()什么也不干,以防止自动打开一

46、个新的空白子窗口。,(2)ID_FILE_OPEN的消息处理函数代码如下:HT5”Kvoid CDipDoc:OnFileOpen()/TODO:Add your command handler code here static int nIndex=1;CFileDialog FileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFilter);FileDlg.m_ofn.nFilterIndex=(DWORD)nIndex;if(FileDlg.DoModal()=IDOK),CString strPathName=FileDlg.GetPathName();

47、AfxGetApp()-OpenDocumentFile(strPathName);nIndex=(int)FileDlg.m_ofn.nFilterIndex;if(!ReadImgToDoc()AfxMessageBox(无法载入图像文件!);return;,在CDipDoc类的消息映射函数OnFileOpen()中,除了要调用一个CDipDoc类的公有成员函数ReadImgToDoc()外(该函数将在后面进行说明),其他与CDipApp类消息映射函数OnFileOpen()基本一样。注意:在此再一次使用了数组szFilter,但它并不在“DipDoc.h”和“DipDoc.cpp”两个文

48、件中声明,因此需要在“DipDoc.cpp”头部添加如下外部声明信息。,/DipDoc.cpp:implementation of the CDipDoc class/#include stdafx.h#include Dip.h#include DipDoc.h#include MainFrm.h#include ChildFrm.h#include DipView.h,#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE=-FILE-;#endifextern char szFilter;,在文件“D

49、ipDoc.cpp”中同时还包含了“MainFrm.h”、“ChildFrm.h”和“DipView.h”三个头文件,因为CDipDoc类的成员函数必须使用它们链接指定的代码。成员函数ReadImgToDoc()负责读入图像对象文件,其声明与实现文件如下。在“DipDoc.h”文件添加如下代码:,/函数声明public:BOOL ReadImgToDoc();在“DipDoc.cpp”文件添加代码:/函数实现BOOL CDipDoc:ReadImgToDoc()CString strPathName=GetPathName();,/设置等待光标 BeginWaitCursor();m_pDib

50、Object=new CDibObject(strPathName.GetBuffer(3);/取消等待光标 EndWaitCursor();/读入图像文件失败 if(m_pDibObject=NULL)AfxMessageBox(无法创建图像类对象!);,/返回FALSE return(FALSE);/读入图像文件成功,设置相应变量 m_bImageLoaded=TRUE;/返回TRUE return(TRUE);,在ReadImgToDoc()成员函数中,首先设置等待光标,然后,以文件打开对话框返回的文件名为参数调用CDibObject类的构造函数创建CDibObject对象m_pDibO

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号