显示 GIF 图像

Visual C++6.0 本身并没有提供显示 GIF 图像的控件，但是 GIF 图像在日常的编程过程中确实十分常用。还好，Windows 操作系统为我们提供了一个显示 GIF 图像的接口 Ipicture，通过这个接口我们就可以在程序中显示 GIF 图像了。如图 1 所示。

图 1 显示 GIF 图像

本练习主要通过 IPicture 接口来显示 JPEG 和 GIF 图像。首先利用 CFile 对象从文件中读取图像数据到缓冲区中，然后调用 CreateStreamOnHGlobal 方法在缓冲区中创建一个流对象，接着调用 OleLoadPicture 方法从流中加载图像信息到 IPicture 中，最后调用 IPicture 的 Render 方法绘制图像。

实现过程：

一、程序创建的实现步骤

（1）新建一个 MFC 的单文档工程，命名为 GIF。

（2）在单文档中加入 ID 为 IDD_GIF 的对话框资源，并为对话框创建新类 CViewGif，实现文件是 ViewGif.cpp，头文件是 ViewGif.h。

（3）设计菜单 IDR_MAINFRAME，在菜单“查看”下新建子菜单，ID 设为 ID_VIEWGIF，Caption 为 gif。

（4）通过类向导（ClassWizard）为 ID 是 ID_VIEWGIF 的菜单添加处理函数。

（5）程序代码。

在菜单处理函数中添加如下代码：

char buf[512];

::GetCurrentDirectory(512,buf);//得到当前程序所在文件夹

strcat(buf,"\\test.gif");

CFileStatus fstatus;

CFile file;

IStream *pStm;

LONG cb;

if(file.Open(buf,CFile::modeRead)&&file.GetStatus(buf,fstatus)&&

((cb = fstatus.m_size) != -1)) //打开要读取的 GIF 文件

{

HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); //分配空间

LPVOID pvData = NULL;

if (hGlobal != NULL)

{

if ((pvData = GlobalLock(hGlobal)) != NULL) //锁定分配的空间

{

file.ReadHuge(pvData, cb);

GlobalUnlock(hGlobal);

CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

}

}

}

IPicture *pPic;

if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,false,IID_IPicture,(LPVOID*)&pPic)))//装载图片资源

{

long a,b;

pPic->get_Width(&a);

pPic->get_Height(&b);

CSize sz(a,b);

CDC *pdc=GetDC();

pdc->HIMETRICtoDP(&sz);

CRect rect;

this->GetClientRect(&rect);

//绘制图片，这种算法只能显示静态的 GIF 文件

pPic->Render(*pdc,rect.left+1,rect.top+1,sz.cx,sz.cy,0,b,a,-b,&rect);

}