VC图像编程基础.ppt

上传人:牧羊曲112 文档编号:6522774 上传时间:2023-11-08 格式:PPT 页数:64 大小:471KB
返回 下载 相关 举报
VC图像编程基础.ppt_第1页
第1页 / 共64页
VC图像编程基础.ppt_第2页
第2页 / 共64页
VC图像编程基础.ppt_第3页
第3页 / 共64页
VC图像编程基础.ppt_第4页
第4页 / 共64页
VC图像编程基础.ppt_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《VC图像编程基础.ppt》由会员分享,可在线阅读,更多相关《VC图像编程基础.ppt(64页珍藏版)》请在三一办公上搜索。

1、第3章 VC图像编程基础,3.1 Visual C+可视化编程 3.2 设计CDibObject类 3.3 使用CDibObject类 3.4 CDibObject类应用实例,3.1 Visual C+可视化编程3.1.1 概述Visual C+是Microsoft公司推出的开发Win32应用程序(Windows 95/98/2000/XP/NT)的面向对象的可视化集成工具。随Visual C+所提供的Microsoft基础类库对Windows 95/NT所用的Win32应用程序接口(Win32 Application Programming Interface,API)进行了彻底的封装,这使

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

3、、定义消息处理函数、重载虚函数等操作。,3.1.2 用户界面Visual C+6.0为标准的Windows用户界面,由标题栏、菜单栏、工具栏、工作区窗口、编辑区窗口、输出窗口和状态栏组成,如图3-1所示。,图3-1 Visual C+6.0用户界面,Visual C+6.0提供有多种不同用途的菜单命令和工具按钮,多数菜单和工具按钮是大家熟悉的标准Windows菜单和工具按钮。用Visual C+6.0开发应用程序主要涉及三大类型的文件:文件(Files)、项目(Projects)和工作区(Workspaces)。在Visual C+6.0中,通常意义下开发一个Windows应用程序是指生成一个

4、项目,该项目包含着一组相关的文件,如各种头文件(.h)、实现文件(.cpp)、资源文件(.rc)、图标文件(.ico)、位图文件(.bmp)等,而该项目必须在一个工作区打开。所以,当第一次建立一个应用程序时,应选择新建一个项目,此时Visual C+6.0自动建立一个工作区,并把新建的项目在该工作区中打开。以后要对该项目进行修改、补充、增加等工作,只要打开对应的工作区即可。,Visual C+6.0以项目工作区(Project Workspace)的方式来组织文件和项目,进行项目配置,通过项目工作区窗口可以查看和访问项目中的所有元素。首次创建项目工作区时,将创建一个项目工作区目录、一个项目工作

5、区文件、一个项目文件和一个工作区选项文件。项目工作区文件用于描述工作区及其内容,扩展名为.dsw。项目文件用于记录项目中各种文件的名字和位置,扩展名为.dsp。工作区选项文件用于存储项目工作区设置,扩展名为.opt。,创建或者打开项目工作区时,Visual C+6.0将在项目工作区窗口中显示与项目有关的信息。项目工作区窗口主要由三个面板构成,即FileView、ResouceView和ClassView,分别用于显示项目中定义的C+类、资源文件和包含在项目工作区中的文件。每个面板用于指定项目工作区中所有项目的不同视图,视图中每个文件夹可以包含其他文件夹或各种元素(如子项目、文件、资源、类和标题

6、等)。通过项目工作区窗口可以定位到项目中的任一位置,以对源程序、资源等进行相应的编辑。,在编辑区窗口中,可以打开文本编辑器或资源编辑器。文本编辑器的使用与Word非常类似,通过它可方便地进行程序源代码的输入、编辑和修改工作。在资源编辑器中可进行各种资源的编辑工作,如设置对话框、图标、菜单、位图等,从而直观地设计程序的用户界面。输出窗口用于显示项目建立(编译、链接)过程中所产生的错误信息、调试过程中的输出信息等。用它可以方便地定位到工程中的错误位置,观察到程序调试过程中的输出结果。,3.1.3 框架和文档-视结构基于MFC的应用程序框架(Application Framework)是定义了程序结

7、构的MFC类库中类的集合,它是Visual C+编程的骨架。运用MFC应用程序框架具有如下优点:(1)标准化的程序结构和用户接口,这对具有标准用户界面的Win32程序来说,可以极大地减轻程序员的负担,使程序员不必过多地考虑界面,而把主要精力放在程序设计上,以提高程序设计的效率。(2)框架产生的程序代码短,运行效率高,具有很大的灵活性。(3)MFC封装了Win32 SDK中几乎所有的函数,能够实现Win32系统的任何功能。,MFC框架的核心是文档-视结构(DocumentView Architecture)。简单地说,文档-视结构就是将数据和对数据的观察相分离,文档仅处理数据的读、写等操作;视则

8、是显示和处理数据的窗口,可以操作文档中的数据。MFC框架的基本结构包括应用程序对象、主框架窗口、文档、视等,框架通过命令和消息将它们结合在一起,共同对用户的操作做出响应。应用程序对象类由CWinApp派生,一个应用程序有且仅有一个应用程序对象,它负责应用程序实例的初始化和进程结束时的资源清除,以及创建和管理应用程序所支持的所有文档模板。,主框架窗口是应用程序的主窗口。MFC框架定义了两种基本的主框架窗口类,即单文档接口SDI(Single Document Interface)主框架窗口类和多文档接口MDI(Multiple Document Interface)主框架窗口类。对于SDI,视是

9、主框架窗口的子窗口;对于MDI,必须从CMDIChildWnd派生出主框架窗口的子窗口,视是该子窗口的子窗口。文档类由CDocument类派生。文档是一个应用程序数据元素的集合,它构成应用程序所使用的数据单元,另外,它还提供了管理和维护数据的手段。文档是一种数据源。数据源有很多种,最常见的是磁盘文件,但它不必是一个磁盘文件。文档的数据源也可以来自串行口、网络或摄像机输入信号等。,视类从CView或其子类(CEditView、CFormView、CRecordView、CScrollView等)派生,是数据的用户窗口,为用户提供了文档的可视的数据显示,它将文档的部分或全部内容显示在窗口中。视还给

10、用户提供了一个与文档中的数据进行交互的界面,它把用户的输入转化为对文档中数据的操作。每个文档都会有一个或多个视显示,一个视既可以输出到屏幕窗口中,也可以输出到打印机上。图3-2表示了MFC框架结构中各对象之间的关系。应用程序管理一个(SDI)或多个(MDI)文档模板,每个文档模板管理一个或多个文档。用户通过主框架窗口中的视观察和处理数据。,图3-2 MFC应用程序框架结构,文档-视结构大大简化了多数应用程序的设计开发过程,它带来的好处主要有:(1)将数据操作和数据显示、用户界面分离。这是一种“分而治之”的思想,这种思想使得模块划分更加合理,模块独立性更强,同时也简化了数据操作和数据显示、用户界

11、面设计工作。文档只负责数据管理,不涉及用户界面;视只负责数据输出与用户界面的交互,可以不考虑应用程序的数据是如何组织的,甚至当文档中的数据结构发生变化时也不必改动视的代码。,(2)MFC在文档-视结构中提供了许多标准操作界面,包括新建文件、打开文件、保存文件、打印等,减轻了用户的工作量。用户不必再编写这些重复的代码,从而可以把更多的精力放到编写应用程序特定功能的代码上(主要是从数据源中读取数据和显示)。(3)支持打印和打印预览,用户无需编写代码或只需要编写很少的代码,就可以为应用程序提供打印和打印预览功能。由于文档-视结构功能强大,因此,一般用Visual C+进行程序设计时,都首先使用App

12、Wizard生成基于文档-视结构的应用程序框架,然后在其中添加自己需要的代码,完成应用程序的特定功能。,3.1.4 编程基本流程Visual C+的资源编辑器能以所见即所得(What you see is what you get)的形式直接编辑应用程序用户界面,为所有资源分配ID标识号。ClassWizard能把对话框模板与自动生成的类定义或与已有的类代码连接起来,为菜单项、控件等资源生成空的处理函数模板,创建消息映射函数模板,并将资源ID与处理函数连接起来。通过使用AppWizard,程序员的编程工作便简化为用资源编辑器直观地设计界面,完善对话框类代码,在空的处理函数模板处填写响应用户操作

13、的代码,这是一种完善的可视化编程方法。,用Visual C+进行Win32可视化编程的基本流程如下:(1)生成框架。运行AppWizard,并按需要指定生成应用程序的选项,指定框架中视类的基类(CView、CEditView、CFormView、CScrollView、CTreeView等)。AppWizard将按指定的选项生成应用程序框架和相关的文件,包括包含项目(Project)的工作空间(Workspace)文件和源文件,主要是应用程序(Application)、文档(Document)、视(View)和主框窗口(Main Frame)的C+代码文件(*.cpp,*.h文件),以及缺省包

14、含标准界面接口的资源文件(*.rc)。,(2)设计用户界面。利用Visual C+资源编辑器编辑资源文件,设计菜单、对话框、工具条、字符串、加速键、位图、图标、光标等项目资源。(3)连接界面和代码。利用ClassWizard把资源文件中定义的界面资源标识ID(如菜单项、工具条和对话框中的控件等)在指定的源文件中映射成相应的函数模板。(4)编写、修改函数代码。利用ClassWizard可以方便地在源代码编辑器(Source Code Editor)中跳转到指定的函数代码处进行代码的编写和修改。(5)根据需要创建新类和编写代码。用ClassWizard创建新类,并生成相应的源文件。如新类是对话框类

15、,可先用资源编辑器生成对话框模板,然后用ClassWizard创建对话框类代码,并与模板连接,编写新类相关的源代码。,(6)实现文档类。在AppWizard生成的框架基础上设计文档数据的数据结构,在文档类中增加相应的成员变量和成员函数,实现对数据的操作和文档与数据的接口。(7)实现框架中标准的文件操作命令,即Open、Save和Save As命令。框架已完成标准的文件操作命令的所有接口,程序员要做的仅仅是编写文档类的串行化(Serialize()成员函数。(8)实现视类。框架已构造好了文档与视的关系,视能方便地访问文档中的public数据成员。可根据文档的需要构造一个或多个视类,通过Class

16、Wizard把视的用户接口资源映射成函数模板,并编写函数代码。,(9)如需要,增加分割窗口(Splitter Window)。在SDI的主框窗口类或MDI的子窗口类中添加一个CSplitterWnd对象,并在窗口类的OnCreateClient成员函数中对CSplitterWnd对象进行创建和初始化。如果用户分割了一个窗口,框架将给文档创建并增加附加的视对象。(10)建立、调试、修改应用程序。若有问题,可根据需要重复步骤(2)(10)。(11)测试应用程序。若有问题,可根据需要重复步骤(2)(11)。(12)结束。,3.2 设计CDibObject类由于MFC没有封装处理DIB位图相关Wind

17、ows API函数的类,所以本着面向对象的思想,有必要设计一个CDibObject类以完成如下功能:(1)读取BMP图像文件;(2)获取图像的相关信息;(3)显示图像;(4)保存图像。从而在以后的数字图像处理中,可方便地将CDibObject类添加到设计的工程中以完成相应的处理。,3.2.1 公用方法的设计根据对CDibObject类的基本要求,它至少应该具有下述方法(成员函数)。(1)构造函数:该类应提供三个不同版本的构造函数,一个是无参构造函数,用于动态创建对象;一个是接受文件名作为参数的构造函数,JP2用于创建一个与由文件名指定的图像文件相对应的有意义的对象;另外,还应提供一个复制构造函

18、数,以便将一个CDibObject类对象的属性直接复制到另一个CDibObject类对象中。(2)Load()函数:该函数将一个图像文件装入CDibObject类对象,它以接受的文件名作为参数。,(3)Save()函数:该函数用指定的文件名将保存在CDibObject类对象中的当前图像保存为一个图像文件。(4)Draw()函数:该函数在指定的设备描述表上绘制图像,它接受指向该设备环境的指针作为参数。调用此绘图函数时,也应该指定绘制图像的位置坐标。(5)与图像信息有关的函数:一系列用于获取和设置类属性的Get/Set函数。这些函数用来获取和设置图像的各种属性信息,如图像的类型、高度、宽度、位平面

19、数、单个像素的位数、图像使用的颜色数等。(6)与调色板操作有关的函数:用于创建、获取、设置逻辑或系统调色板的颜色数和调色板数据等信息的函数。,3.2.2 类属性的设计CDibObject类主要应设计如下的属性(成员变量)。(1)char*m_pszFilename:此变量用来保存图像文件名。(2)HGLOBAL m_hDib:当图像载入后,使用此变量获取该图像的DIB(Device Independent Bitmap,设备无关位图)句柄。实际上无论什么类型的图像文件,如果要在Windows操作系统中显示,都应该使用DIB位图格式。(3)int m_nWidth,m_nHeight,m_nPl

20、anes,m_nBits,m_nColors:这些变量分别描述图像的宽度、高度、位平面数、每像素的位数(1、4、8、16、24或32位)和颜色数。,(4)int m_nX,m_nY:用这两个变量确定图像左上角的位置。(5)CPalette m_Palette:此变量指定图像中使用的调色板对象。(6)int m_nPaletteCreationType:当需要通过颜色还原一幅具有调色板的图像时,使用此变量确定调色板类型。其中,0表示JGPT_POPULARITY_PALETTE,1表示JGPT_ MEDIAN_CUT_PALETTE,2表示JGPT_FIXED_PALETTE。(7)LOGPAL

21、ETTE*m_pLogPal:该指针型变量用来指向图像所使用的逻辑调色板。(8)int m_nLastError:该变量用来保存最后一次图像处理中的错误号,错误号由“ImageErrors.h”头文件定义。,对于CDibObject类的构造函数、载入和保存成员函数以及大多数Set/Get成员函数的意义都是暗含的,在此不再详细讨论。请读者阅读本书所附CD-ROM中的CDibObject类定义文件“DibObject.h”和实现文件“DibObject.cpp”,作者在程序源代码中加入了详尽的注释,相信读者能够理解。,3.3 使用CDibObject类利用3.2节设计的CDibObject类便可实

22、现图像文件的打开、保存和显示工作。但在使用CFileDialog类之前,还要做如下工作:(1)将“ImageErrors.h”、“DibObject.h”和“DibObject.cpp”三个文件复制到当前工程目录中。(2)选择VC+集成开发环境的ProjectAdd to projectFiles.菜单项,系统打开如图3-3所示的“Insert Files into Project”对话框。,图3-3 在工程中添加“DibObject.h”和“DibObject.cpp”文件,选择文件“DibObject.h”和“DibObject.cpp”文件,单击“OK”按钮将这两个文件添加到当前工程中。

23、这样便将上一节所设计的CDibObject类添加到当前的工程中,从而可以使用类中提供的方法和属性。,3.4 CDibObject类应用实例3.4.1 建立应用程序框架使用MFC AppWizard创建图像处理应用程序基本框架,其步骤如下:(1)从File菜单中选择New菜单项,弹出New对话框。(2)选择Projects选项卡,从项目类型中选择MFC AppWizard(.exe),在Projects Name文本框中输入项目名称,这里设为Dip。(3)在MFC AppWizardStep 1对话框中选择MDI用户界面和中文中国。,(4)在MFC AppWizardStep 6对话框中将CDi

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

25、窗口,可以简单地声明OnFileNew函数,但不编写任何代码。,3.4.3 改写OnFileOpen函数以打开图像文件在Dip.cpp文件头部添加如下代码:char szFilter=“位图文件(*.BMP)|*.BMP|所有文件(*.*)|*.*|”;在此声明的字符数组szFilter保存了文件打开和关闭对话框的过滤器数组。szFilter是一个包含有通配符的以“|”字符分隔的字符串。要注意的是,在第一个“|”字符之前是将要显示在文件打开和保存对话框的“文件类型”列表框中的信息,第二个“|”字符和第一个“|”字符之间的内容为对话框的过滤器内容。在字符串szFilter的尾部,使用两个“|”字

26、符以表示过滤器内容结束。,注意:szFilter中不能包含任何空格,并且szFilter声明为全局变量。成员函数CDipApp:OnFileOpen负责打开一个图像文件,其代码如下:void CDipApp:OnFileOpen()static int nIndex=1;CFileDialog FileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFilter);=(DWORD)nIndex;if(FileDlg.DoModal()=IDOK),CString PathName=FileDlg.GetPathName();PathName.MakeUpper();

27、OpenDocumentFile(PathName);nIndex=(int);,程序中声明一个CFileDialog类的对象FileDlg,其第一个参数设置为TRUE,表示该对话框为“打开”对话框,其最后一个参数为设置好的过滤器数组,其他参数可参阅VC帮助系统MSDN。程序接下来将FileDlg对象的m_ofn结构的nFilterIndex字段设置为缺省的第一个过滤器值,并调用FileDlg.DoModal()成员函数显示“打开”对话框。成员函数FileDlg.GetPathName()负责返回选择的包含完整路径信息的文件名,应用程序类CDipApp的成员函数OpenDocumentFile

28、将使用该文件名创建一个文档。,3.4.4 添加CDibObject类对象成员变量文档类CDipDoc负责维护文档的具体数据,因此,在该类中声明两个公有型的成员变量:public:BOOL m_bImageLoaded;CDibObject*m_pDibObject;其中,m_pDibObject为指向CDibObject类的指针,它将用于保存从图像文件中获取的图像。成员变量m_bImageLoaded声明为BOOL型,用来记录图像是否读入内存。,另外,声明的指针型变量还应在类的构造函数和析构函数中正确地初始化和释放。为此,在CDipDoc类的构造函数和析构函数中添加如下代码:CDipDoc:C

29、DipDoc()/TODO:add onetime construction code here m_pDibObject=NULL;m_bImageLoaded=FALSE;,CDipDoc:CDipDoc()if(m_pDibObject!=NULL)delete m_pDibObject;m_pDibObject=NULL;,注意:当删除了指针所指向的对象时,相应的指针本身并没有删除,此时指针变量本身的值指向何处是个未知数,因此,再次将它赋值为NULL。要使程序能够正确编译,还必须在文件中添加定义CDibObject的头文件,可以在“DipDoc.h”文件的头部用#include将“Di

30、bObject.h”文件包含进来。但考虑到工程中多处将用到CDibObject类,以及“DibObject.h”文件将很少再改动,所以将其直接包含在“StdAfx.h”文件中比较合适,于是在“StdAfx.h”文件中添加如下代码:#include“DibObject.h”,3.4.5 为CDipDoc文档类映射消息处理函数使用MFC ClassWizard分别为ID_FILE_NEW、ID_FILE_OPEN、ID_FILE_SAVE AS菜单命令消息添加消息映射处理函数OnFileNew()、OnFileOpen()和OnFileSaveAs()函数。(1)ID_FILE_NEW消息处理函数

31、代码如下:void CDipDoc:OnFileNew()/TODO:Add your command handler code here,与CDipApp类处理一样,CDipDoc类的消息映射函数OnFileNew()什么也不做,以防止自动打开一个新的空白子窗口。(2)ID_FILE_OPEN消息处理函数代码如下:void CDipDoc:OnFileOpen()/TODO:Add your command handler code here static int nIndex=1;CFileDialog FileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szF

32、ilter);=(DWORD)nIndex;,if(FileDlg.DoModal()=IDOK)CString strPathName=FileDlg.GetPathName();AfxGetApp()-OpenDocumentFile(strPathName);nIndex=(int);if(!ReadImgToDoc()AfxMessageBox(无法载入图像文件!);return;,在CDipDoc类的消息映射函数OnFileOpen()中,除了要调用一个CDipDoc类的公有成员函数ReadImgToDoc()外(该函数将在后面进行说明),其余与CDipApp类消息映射函数OnFil

33、eOpen()基本一样。,注意:在此再一次使用了数组szFilter,但它并不在“DipDoc.h”和“DipDoc.cpp”两个文件中声明,因此,需要在“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_

34、FILEstatic char THIS_FILE=_FILE_;#endifextern char szFilter;在文件“DipDoc.cpp”中同时还包含了“MainFrm.h”、“ChildFrm.h”和“DipView.h”三个头文件,因为CDipDoc类的成员函数必须使用它们链接指定的代码。,成员函数ReadImgToDoc()负责读入图像对象文件,其声明与实现文件如下:在“DipDoc.h”文件中添加如下代码:/函数声明public:BOOL ReadImgToDoc();在“DipDoc.cpp”文件中添加如下代码:/函数实现BOOL CDipDoc:ReadImgToDoc

35、()CString strPathName=GetPathName();,/设置等待光标 BeginWaitCursor();m_pDibObject=new CDibObject(strPathName.GetBuffer(3);/取消等待光标 EndWaitCursor();/读入图像文件失败 if(m_pDibObject=NULL)AfxMessageBox(无法创建图像类对象!);/返回FALSE return(FALSE);,/读入图像文件成功,设置相应变量 m_bImageLoaded=TRUE;/返回TRUE return(TRUE);在ReadImgToDoc()成员函数中,

36、首先设置等待光标,然后,以文件打开对话框返回的文件名为参数,调用CDibObject类的构造函数创建CDibObject对象m_pDibObject,从而将图像文件中保存的图像数据读入内存,并将文档类的m_bImageLoaded设为TRUE。,(3)ID_FILE_SAVEAS消息处理函数代码如下:void CDipDoc:OnFileSaveAs()static int nIndex=1;CFileDialog DialogSaveAs(ZK(FALSE,NULL,m_pDibObject-GetImageName(),OFN_HIDEREADONLY,szFilter);,=(DWORD

37、)nIndex;if(DialogSaveAs.DoModal()=IDOK)CMainFrame*pMainFrame=(CMainFrame*)AfxGetMainWnd();CChildFrame*pChildFrame=(CChildFrame*)pMainFrame-MDIGetActive();CDipView*pDipView=(CDipView*)pChildFrame-GetActiveView();,nIndex=(int);/CDibObject类中有图像才能保存 if(m_pDibObject!=NULL)/获取指定的文件名(含路径名)CString strPathNa

38、me=DialogSaveAs.GetPathName();int nFindIndex=strPathName.Find(.);if(nFindIndex!=-1)strPathName=strPathName.Left(nFindIndex);/加上指定的扩展名以构成完整文件名 strPathName+=.BMP;,/调用CDibObject类成员函数Save()保存图像 m_pDibObject-Save(strPathName);/设置窗口标题 CString strFileName=DialogSaveAs.GetFileName();nFindIndex=strFileName.F

39、ind(.);if(nFindIndex!=-1)strFileName=strFileName.Left(nFindIndex);strFileName+=.BMP;pChildFrame-SetWindowText(strFileName);SetPathName(strPathName);,程序OnFileSaveAs()首先声明一个CFileDialog类的实例DialogSaveAs,它的第一个参数为FALSE,表示是一个“另存为”对话框,第三个参数为m_pDibObject的成员函数GetImageName()返回的m_pDibObject指定的CDibObject对象中的图像文件

40、的文件名。在调用DialogSaveAs的DoModal()显示对话框后,程序中如下三个语句:CMainFrame*pMainFrame=(CMainFrame*)AfxGetMainWnd();CChildFrame*pChildFrame=(CChildFrame*)pMainFrame-MDIGetActive();CDipView*pDipView=(CDipView*)pChildFrame-GetActiveView();,用来获取应用程序类的主框架窗口类CMainFrame、子框架窗口类CChildFrame和视类CDipView的指针pMainFrame、pChildFram和

41、pDipView,以完成对相应类的操作。程序接下来调用成员函数m_pDibObject-Save()将CDibObject对象中的图像另存为指定格式的图像文件。另外,一旦将文件更名保存,就需要将该图像所属的子窗口标题栏中的标题更新为新的文件名,此项任务由成员函数pChildFrame-SetWindowText()负责。至此,图像读入与保存的程序代码就全部完成了,接下来的任务是在屏幕上绘制图像。,3.4.6 绘制读入的图像具体的图像绘制任务是在CDipView视类成员函数CDipView:OnDraw中完成的,其代码如下:void CDipView:OnDraw(CDC*pDC)CDipDoc

42、*pDoc=GetDocument();ASSERT_VALID(pDoc);,/TODO:add draw code for native data here if(!pDoc-m_bImageLoaded)pDoc-LoadImageToDocument();/滚动窗口 CSize sizeTotal;sizeTotal.cx=pDoc-m_pDibObject-GetWidth();sizeTotal.cy=pDoc-m_pDibObject-GetHeight();,SetScrollSizes(MM_TEXT,sizeTotal);/获取客户区尺寸 OnPrepareDC(pDC);

43、CRect Rect;GetClientRect(&Rect);/获取图像宽度及高度 int nImageWidth,nImageHeight;nImageWidth=pDoc-m_pDibObject-GetWidth();nImageHeight=pDoc-m_pDibObject-GetHeight();,/当图像实际尺寸小于窗口尺寸时,将图像放在客户区中间 int nX,nY;if(nImageWidth Rect.Width()nX=(Rect.Width()-nImageWidth)/2;else nX=0;,if(nImageHeight m_pDibObject-Draw(pD

44、C,nX,nY);,代码含义非常清楚,不需要解释。在此,要强调的是当程序没有打开任何窗口时,选择“文件打开”菜单项将调用的是视图类的成员函数CDipView:OnFileOpen(),而不是文档类的成员函数CDipDoc:OnFileOpen()。此时,并没有载入图像数据,因此必须调用文档类的成员函数pDoc-LoadImageToDocument()载入图像数据并设置m_pDibObject指针。到此为止,读入、保存和显示一幅图像的代码就完成了,大家可以编译运行此程序并打开几个图像文件来观察效果。希望同学们在学习本章之后能够举一反三。,注意:在此只介绍了BMP图像文件的基本操作,它具有较强的

45、代表性,同时也为后续图像处理编程的学习做了必要的准备工作。对JPEG、TIF、GIF等其它格式的图像文件,可先用相应软件将其转换为BMP文件格式,经过处理后再转换为相应格式的文件。,习 题1.简述用Visual C+进行程序设计的基本步骤。2.用面向对象的思想设计CDibObject类时,主要涉及哪些内容?3.试设计一个Visual C+工程,完成CDibObject类的添加。4.在本章示例工程Dip的基础上,通过添加合适的资源及相应的消息映射代码,完成获取图像信息头数据的功能。5.在本章示例工程Dip的基础上,编制程序将读入的BMP格式图像文件的像素数据写入数组,并以文本文件格式(*.txt)输出。,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号