基本的单文档应用程序框架包括应用类、单文档模板类、主边框窗口类、文档类和视图类,而多文档应用程序框架包括应用类、多文档模板类、主边框窗口类、子边框窗口类、文档类和视图类。不管是单文档还是多文档应用程序,应用类对象只有一个,其他类的对象可以有多个。单文档应用程序每次只能处理一个文档对象。当运行一个单文档应用程序时,首先构造一个文档对象,此文档对象一直存在,直至程序运行结束。当新建一个文件或打开另一个文件时,应用框架都会调用该文档对象的初始化函数,以初始化该文档对象,使之被重新利用。
2. 构造对象
(1) 单文档应用程序
首先由应用程序框架构造应用类对象,注意应用类对象只有一个,接着应用类对象构造单文档模板对象,单文档模板对象构造文档对象、主窗口对象,最后主窗口对象创造视图对象。
(2) 多文档应用程序
首先由应用程序框架构造应用类对象,注意应用类对象也只有一个,接着应用类对象构造多文档模板对象、构造主边框窗口对象及主边框窗口,多文档模板对象构造文档对象、子边框窗口对象及创建子边框窗口,最后再由子边框窗口对象构造视图对象和创建视图窗口。在本次课题中,使用的是多文档应用程序。
3.4 与设备无关的位图(DIB)
3.4.1 BMP文件中DIB的结构
DIB(Device-Independent Bitmap)是与设备无关位图的简称,它自带颜色信息,因此调色板管理非常容易。DIB也使打印时的灰度阴影的控制更加容易。它通常以BMP形式被保存在磁盘中或者作为资源保存在EXE文件和DLL文件中。MFC没有封装DIB,但在程序中使用DIB还是十分方便的,因此构造自己的函数库,对于以后编程将很方便。当用到DIB时,只要自己直接调用函数库就可以了。
DIB是标准的Windows位图格式,每个BMP文件中包含一个DIB。一个BMP文件由文件头、位图信息头、颜色信息和图像数据四部分组成。位图结构包括:位图文件头(BITMAPFILEHEADER)、位图信息头(BITMAPINFOHEADER) 、调色板(Palette)、实际的位图数据(Image Data)。如表3.1所示。
表3.1 BMP文件结构
BITMAPFILEHEADER位图文件头 BITMAPINFOHEADER位图信息头 Platte调色板 DIB Pixels图像数据 bfType="BM"
bfSize
bfReserved1
bfReserved2
bfOffBits
biSize
biWidth
biHeight
biPlanes
biBitCount
biCompression
biSizeImage
biXPelsPerMeter
biYPelsPerMeter
biClrUsed
biClrImportant 单色DIB有2个表项,16、256色DIB有16、256个表项或更少,真彩色DIB没有调色板,每个表项长度为4字节(32位)
像素按照每行每列的顺序排列,每一行的字节数必须是4的整数倍
(1)位图文件头BITMAPFILEHEADER,该结构的长度是固定的14个字节,其中WORD为无符号16位整数,DWORD为无符号32位整数。
(2)位图信息头BITMAPINFOHEADER,该结构的长度也是固定的,为40字节,LONG为32位整数。
(3)调色板(Palette)。有些位图需要调色板,有些位图,例如真彩色图,不需要调色板,它们的BITMAPINFOHEADER后面直接是位图数据。调色板实际上是一个数组,共有biClrUsed个元素,(如果该值为0,就是2的biBitCount次幂个元素)。数组中的每个元素都是一个RGBQUAD结构,占4个字节。
(4)实际的图像数据,对于用到调色板的位图,图像数据就是该像素在调色板的索引值,对于真彩色图像,图像数据就是实际的R、G、B值。
需要特别注意的是,一般来说,BMP文件的数据是从下到上,从左到右的,即从文件中最先读到的是图像最底行的左边第一个像素,然后是左边第二个,读满一行接下来是倒数第二行左边第一个像素,左边第二个,依此类推,最后得到的是最上面一行的最右的一个像素。这点和图像扫描显示的顺序有差别,在编程中,需要注意转换。
3.4.2 DIB访问函数简单介绍
(1) SetDIBitsToDevice
该函数可以直接在显示器或打印机上显示DIB。在显示时不进行压缩处理,即位图的每一像素对应于一个显示器的显示像素或一个打印机的打印点。该特点限制了该函数的使用。
(2) StretchDIBits
该函数类似于StretchBIt,利用它可以缩放显示DIB于显示器或打印机上。
(3) GetDIBits
该函数利用申请到的内存,由GDI(图形设备接口)位图构造DIB。通过该函数,可以对DIB的格式进行控制,可以指定每个像素颜色的位数,而且可以指定是否进行压缩。如果采用了压缩格式,则必须调用该函数两次,一次用于计算所需要的内存,另外一次用于产生DIB数据。
(4) CreateDIBitmap
利用该函数可以从DIB出发来创建GDI位图。
(5) CreateDIBSection
该函数能创建一种特殊的DIB,称为DIB项(DIB Section),然后返回一个GDI位图句柄。它提供了DIB和GDI位图的最好的特性。这样我们可以直接访问DIB的内存,可以利用位图句柄和内存设备环境,我们甚至还可以在DIB中调用GDI函数来绘图。
(6) LoadImage
该函数可以直接从磁盘文件中读入一个位图,并返回一个DIB句柄。
(7) DrawDibDraw
该函数是一个可以替代StretchDIBits的函数。它的最主要的优点是可以使用抖动颜色(Dithered Color),并且提高显示DIB的速度,缺点是必须将窗口视频(VFW)代码链接到进程中去。
3.5本章小结
本章主要介绍了本次课题设计所用的软件平台、MFC的基本知识以及设备无关位图(DIB)的部分内容。关于MFC,本章从MFC提供的基本应用程序框架入手,简单介绍了MFC应用中的基本知识,我们可以看出,使用MFC编程具有很多优点。关于DIB设备无关位图,本章通过图示说明了BMP文件中DIB的结构,并将其四部分做了详细的介绍,接着,又介绍了DIB函数库常用到的DIB访问函数,从而在整体上把握DIB函数库。简言之,本章的主要内容就是完成利用MFC编程前的准备工作,以便更好地服务于接下来的编程工作。
4图像编码软件实现
首先利用 MFC AppWizad[exe]创建新工程,命名为PicCoding,如图4.1所示。在程序实现之前,我们需要把建立的DIB函数库、GIF函数库,以及四种编码方式的源代码添加到工程中去如图4.2所示。
图4.1利用MFC建立新工程
完成了工程的建立,后面的工作是建立软件的对话框,并配置对话框参数。然后建立添加图像编码模块,在模块下加入霍夫曼编码、香农-弗诺编码、行程编码和LZW编码功能,软件结构如图4.3所示。完成这些工作,我们就建立起了图像编码软件。我们对同一幅256色位图图像"sdkd.bmp"进行压缩,通过编码结果我们可以分析各个编码方式之间的区别。
图4.2在工程中添加函数库和源代码
图4.3软件结构示意图
4.1创建对话框
4.1.1创建对话框的流程
图4.4创建对话框流程图
(1)在"项目工作区"部分,包含三个视图窗口:类视图(ClassView)、资源视图(ResourceView)和文件视图(FileView)。选择资源视图,右击"Dialog",选择"插入 Dialog", 向当前工程中添加"对话框资源"【13】。在对话框资源面板上单击鼠标右键,选择"属性"命令,弹出"对话属性"对话框,进行相应的设置(ID设置、标题等),这样就建立了最基本的对话框框架,如图4.2所示。
(2)创建与对话框相关联的对话框派生类。在对话框资源上单击鼠标右键,在弹出的菜单中选择"ClassWizard",在打开对话框过程中,如果系统检测到有新建对话框、菜单资源,而且该资源没有与其对应的类关联,会自动弹出"Adding a Class"对话框,选择"Create a new class",出现"New Class"对话框,实现类名的添加、基类的选择、以及对话框ID的设置等,点击确定,接下来就是在MFC ClassWizard 对话框中的
上一篇:
施工组织设计(小农水工程2011)
下一篇:
超市进销存管理系统的开发