在你的MFC应用程序中显示一个JPG文件

在VB中,我可以通过创建一个图像控件来显示一个JPG或GIF文件,但是我如何在我的MFC应用程序中显示一个JGP文件呢?

好问题!有时使用VB的程序员觉得这个很容易。只要往你的表中拖入一个图像控件,然后你就可以往下做了……然而C++程序员就不得不感到烦恼和头疼。那我们要做些什么呢,编写我们自己的JPG解压函数吗?

当然不是这样的!事实上,C/C++程序员能够使用与VB程序员所使用的非常类似(可以说是差不多)的图像控件。我并没有开玩笑。VB图像控件是基于一个叫"IPicture"的系统COM类(如 Figure 1 所示)。IPicture管理一个图像对象和它的特性。图像对象为位图提供一个抽象化的东西。Windows提供了一个知道如何处理BMP,JPG和GIF位图的标准操作。你所要做的只是使IPicture实例化,并调用Render。你可以调用一个叫做"OleLoadPicture"的特殊函数,来替代通常所要调用的"CoCreateInstance"。

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

OleLoadPicture从信息流里加载图像,并创建一个你能够用来显示图像的新的IPicture对象。

rc = // 要在其中显示的矩形
// 转换rc为HIMETRIC
spIPicture->Render(pDC, rc);

IPicture包揽了所有的令人厌烦的用来推算图像是否是Windows位图,JPEG,或GIF文件的事, 它甚至还可以推算图像是否是图标和图元文件!自然,其中的细节是需要些技巧,所以我就写了一个将它们都包含其中的叫"ImgView"( 如 Figure 2 所示)的演示程序。

Figure 2 ImgView

ImgView是一个典型的MFC文档/视图结构的应用程序,它使用了一个我以前写的叫"CPicture"的类(如 Figure 3 所示)来封装IPicture。CPicture将一些麻烦的COM类型的参数映射为那些更容易被MFC程序员接受的类型。例如,CPicture可以让你直接从一个文件名加载图像,如CFile或CArchive,而不是处理信息流;而且CPicture::Render完成了所有的令人厌烦的而又是IPicture所需要的HIMETRIC坐标转换,这样,你就没必要去做这些了。CPicture甚至还有一个可以从你的资源数据中加载图像的加载函数,所以要显示一个资源图像,你所要做的就是像下面那样写:

CPicture pic(ID_MYPIC); // 加载pic
   CRect rc(0,0,0,0);   // 使用默认 rc
   pic.Render(pDC, rc);  // 显示它

什么能够使工作变得更加容易呢?CPicture::Render能获得一个你想在其中显示图像的矩形。IPicture可以适当地拉伸图像。如果你传递了一个空的矩形,CPicture就使用图像本来的尺寸,并不对其进行拉伸。对于图像本身,CPicture要寻找一个名为"IMAGE"的资源类型,所以你必须对你的RC文件进行如下的编写:

IDR_MYPIC IMAGE MOVEABLE PURE "res\\MyPic.jpg"

总的来说,CPicture相当没头脑。它有一个ATL CComQIPtr巧妙的指向IPicture界面的指针,其中不同的加载函数通过调用OleLoadPicture来初始化该界面。CPicture提供一般的封装函数来调用里面的IPicture。CPicture仅封装了我编写ImgView所需要的IPicture成员函数;这么做是因为我是这样的一个懒惰的程序员。如果你还需要调用IPicture::get_Handle或一些其它的较少用的IPicture成员函数,很抱歉,你就只好自己为其添加封装了。至少,这代码是件琐碎的事情。

顺便说一下,在我写完CPicture后,我就觉得有件事要提一下,那就是我发现一个鲜为人知的叫做"CPictureHolder"的MFC类也做了绝大部分的类似的事情。你可以在afxctl.h中找到它。

正如我先前提到的,ImgView是一个典型的MFC文档/视图结构的应用程序,其中CPictureDoc和CPictureView类分别对应于文档和视图结构。如 Figure 4 所示 中显示了该视图。CPictureDoc有些琐碎;它使用CPicture来保存图像--

class CPictureDoc : public CDocument {
protected:
 CPicture m_pict; // 图像
};

,并且CPictureDoc::Serialize调用CPicture::Load从MFC所建立的存档中读取图像。

void CPictureDoc::Serialize(CArchive& ar)
{
 if (ar.IsLoading()) {
  m_pict.Load(ar);
 }
}

时间: 2024-10-29 18:50:57

在你的MFC应用程序中显示一个JPG文件的相关文章

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

如果你是一个使用Visual Basic编程的程序员,要在程序中显示JPG或者GIF图像简直易如反掌,将图像控件拖到Form中就可以了.但是C++程序员要显示同样格式的图像文件却没有那么轻松,那么是不是要自己编写JPG解压缩代码呢?当然不用那么复杂啦!本实例将针对这个问题讨论如何在MFC中显示JPG或者GIF格式的图像文件. 一.实现方法 用Visual Basic写图像显示程序之所以如此轻松,完全是利用了琳琅满目的图像处理控件,它们处理了显示图像文件的所有底层工作,而C++程序员为了实现相同的

MFC框架程序中全屏显示特性的实现

在开发图像显示程序以及视频应用程序时,常常需要全屏显示特性,比如ACD See和豪杰解霸等应用都有全屏显示功能.本文将介绍如何在MFC框架程序中实现视图的全屏显示,也就是说将标题.菜单.工具栏.状态栏以及窗口的所有边框全部被隐藏,视图充满整个屏幕.并提供全屏显示与框架窗口之间的快捷切换操作. 大家知道,在MFC框架中并没有提供现成的类或者函数来实现全屏显示特性,至少我到目前为止是没有发现.但是要实现这个特性也并不难.其基本思路是调整主窗口的大小和位置,使视图的显示充满屏幕.它需要以屏幕左上角为原

在MFC程序中显示 JPG/GIF图像

如果你是一个使用VB编程的程序员,要在程序中显示JPG或者GIF图像简直易如反掌,将图像控件拖到Form中,分分钟即可搞掂.但是C++程序员要显  示同样的图形却没有那么轻松,那么是不是要自己编写JPG解压缩代码呢?当然不用那么复杂啦!本文将针对这个问题讨论如何在MFC中显示JPG或者GIF 图像. 用VB写图像显示程序之所以如此轻松,完全是利用了琳琅满目的图像处理控件,把你想要做的事情都一一搞掂.而C++程序员为了实现相同的功能必须忙 乎半 天.其实,C/C++程序员也能使用那些VB程序员所用

如何从MFC应用程序中调用.NET框架

如何发送击键到其它应用程序? 关于如何通过编程来发送 Ctrl+Alt+Del 击键? 如何从 MFC 应用程序中调用 .NET 框架? 我想编写一个应用程序,它能通过击键将信息写到另外一个应用程序的窗体中.我是不是应该发送 WM_KEYDOWN 和 WM_KEYUP 消息?有没有更好的办法? 发送 WM_KEYDOWN 和 WM_KEYUP 消息也许能行得通,但 SendInput 是专门被设计用于此目的的 API 函数.它通过 INPUT 结构数组参数来合成包括击键和鼠标事件在内的输入,每个

MFC对话框程序状态栏显示工具按钮提示信息的问题?

问题描述 MFC对话框程序状态栏显示工具按钮提示信息的问题? 写了一个对话框程序,想要在鼠标点到工具按钮时,状态栏显示工具栏的提示信息,可总是报错,请大神帮我看看 这是OnMouseMove的程序 void CEasyRecognizeDlg::OnMouseMove(UINT nFlags, CPoint point) { CString str; CRect rect; GetDlgItem(ID_OPENIMAGE)->GetWindowRect(&rect); //获取按钮区域 if

从WinForm程序中显示WPF Window出现“The URI prefix is not recognized”异

从WinForm程序中显示WPF Window出现"The URI prefix is not recognized"异常的解决方法 从WinForm App中显示WPF窗口的代码: MyWindow wpfWindow = new MyWindow(); WindowInteropHelper wih = new WindowInteropHelper(wpfWindow); wih.Owner = ownerHwnd; wpfWindow.ShowDialog(); 一般情况下,这

mfc-想在MFC中显示一个开关按钮,请问怎么实现

问题描述 想在MFC中显示一个开关按钮,请问怎么实现 MFC怎么制作开关按钮,按下去保持凹的状态,再按一次才凸出来,有没有简单的方法,网上的代码看不懂 解决方案 你可以用checkbox控件,设置为push button外观 解决方案二: 设置按钮属性,push button 解决方案三: 自己绘画控件还是挺好玩的,可以用一个成员变量来保存按钮的当前状态啊,

mfc opencv 窗口关闭-MFC应用程序中,opencv弹出的窗口如何关闭

问题描述 MFC应用程序中,opencv弹出的窗口如何关闭 如题,我用VS2013+opencv2.4.8,做了一个应用程序,用opencv弹出了两个视频显示窗口,用MFC界面上的一个Button,做"系统退出",但是当MFC的界面退出后,opencv的那两个窗口还在,不知道如何自主关闭?除了"Esc",知道的大神们,请帮帮忙,先谢谢了! 解决方案 http://blog.csdn.net/jhh_move_on/article/details/8088461 解决

如何在MFC对话框程序中动态创建一个单文档。

问题描述 如何在MFC对话框程序中动态创建一个单文档. 就是在MFC对话框程序里单击一个按钮可以出现一个单文档界面,是MFC对话框的框架 解决方案 再做一个单文档的exe,点击按钮,启动它