WEB开发网
开发学院软件开发VC 在MFC应用程序中显示JPG/GIF图像文件 阅读

在MFC应用程序中显示JPG/GIF图像文件

 2010-06-15 20:40:11 来源:WEB开发网   
核心提示:从上面的方法可以看出,Ipicture类操纵着图像对象及其属性,在MFC应用程序中显示JPG/GIF图像文件(2),图像对象提供对位图的抽象,而Windows负责BMP、JPG和GIF等格式的标准实现,同时将该程序命名为"Myimgapp";2、 在应用程序的项目代码中添加"CPictur

从上面的方法可以看出,Ipicture类操纵着图像对象及其属性。图像对象提供对位图的抽象,而Windows负责BMP、JPG和GIF等格式的标准实现。程序员要做的只是实例化Ipicture类对象,然后调用其Render()函数。与通常使用接口的方式不同,这里实例的创建我们不用CoCreateInstance()函数,而是用一个专门的函数OleLoadPicture(),具体实现代码如下:

IStream* pstm = // 需要一个流(stream)
IPicture* pIPicture;
hr = OleLoadPicture(pstm, 0, FALSE, IID_IPicture, (void**)&pIPicture);

OleLoadPicture()函数从数据流中加载图像并创建一个可用来显示图像的新IPicture对象。 rc = // 显示图像的矩形

IPicture 负责处理所有琐事,以便确定图形之格式,如 Windows 位图、JPEG或者GIF文件--甚至是图标和元文件(metafiles)。当然啦,所有这些的实现细节是需要技巧的,为此本实例写了一个Demo程序Myimgapp来示范这些IPicture的使用方法。Myimgapp是个典型的MFC文档/视图程序,在编写这个程序之前,首先对 IPicture COM接口进行封装,之所以要这么做,主要是考虑到并不是每一个程序员都能熟练运用COM接口进行编程,另外将IPicture的主要功能封装在C++类中可以使我们的问题更容易解决,封装的这个C++类名字叫做CPicture。它的定义和实现细节请参考本文提供的源代码。

本实例在这个类中将复杂而陌生的COM风格的参数映射成MFC程序员更为熟悉的类型。例如,CPicture可以让你直接从文件名加载一幅图像,CFile或者CArchive,而不用去处理流,CPicture::Render()替你完成了IPicture中所有令人讨厌的但又是必须的HIMETRIC平滑转换工作。CPicture甚至具备了一个Load()函数,它可以从资源数据中加载图像,所以你只要用下面的代码就可以显示资源中的图像:

CPicture pic(ID_MYPIC); // 加载图像
CRect rc(0,0,0,0); // 使用缺省的rc
pic.Render(pDC, rc); // 显示图像

CPicture::Render提供一个显示图片的矩形。IPicture 对图像进行延伸处理。如果传递一个空矩形,则CPicture用图像本身的大小--不进行延伸处理。对于图像本身而言,CPicture查找"IMAGE"类型的资源,所以在资源文件中必须要在程序的资源文件中加入如下语句来添加图像资源:IDR_MYPIC IMAGE MOVEABLE PURE "res\MyPic.jpg"。

CPicture是个很棒的傻瓜类,它具备一个 ATL 智能指针CComQIPtr指向IPicture接口,通过调用OleLoadPicture来初始化不同的Load函数。CPicture提供了常用的打包函数来调用底层的IPicture。CPicture只封装了那些在Demo例子程序中要用到的方法。如果读者朋友需要调用IPicture::get_Handle或其它一些很少用到的IPicture方法,可以自己尝试编写相应的打包代码。

总之,IPicture/CPicture简化了图像的显示,它甚至可以实现调色板的识别这样复杂的处理,读者朋友完全可以抛开老式DIB 图像绘制方法,如加载调色板、BitBlts()、StretchBlts()等操作--这一切IPicture全都可以搞掂。

程序中有一个消息处理器值得一提:它就是视图类的OnEraseBkgnd()函数,当要显示的图像比客户区小的时候,这个函数必须绘制空白区域,OnEraseBkgnd()函数创建一个与图像大小相等的切边(clip)矩形,然后将客户区填成黑色,之所以要创建切边矩形,主要是避免当改变窗口大小时出现的抖动--FillRect()不绘制切边矩形内的区域,此乃Windows图形处理的常识。

二、编程步骤

1、 启动Visual C++6.0,生成一个单文档视图结构的应用程序,视图类的基类为CscrollView,同时将该程序命名为"Myimgapp";

2、 在应用程序的项目代码中添加"CPicture"类;工具栏上添加图像显示比例的按钮,具体参加代码部分;

3、 使用资源编辑器向程序中添加Jepg格式的图像资源;

4、 添加代码,编译运行程序。

Tags:MFC 应用程序 显示

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接