CPictureEx类:MFC和ATL中的图片处理

在开发MFC项目时,经常需要处理各种图片格式,如JPEG、GIF等。静态图片的显示相对简单,但动画GIF的处理则较为复杂。本文将介绍一个名为CPictureEx的类,它能够处理包括动画GIF在内的多种图片格式。

CPictureEx类的起源

CPictureEx类是为了满足一个MFC项目的需求而编写的,该项目需要支持JPEG和GIF格式的横幅广告。虽然使用OleLoadPicture函数和IPicture接口可以轻松显示静态图片,但处理动画GIF却是一个完全不同的问题。

类的功能

CPictureEx类的基本思想是将GIF分解为单独的帧,并使用OleLoadPicture和IPicture的组合来显示这些帧。在深入研究了GIF87a和GIF89a的规范后,作者编写了这个类。值得注意的是,CPictureEx不仅可以显示GIF(包括动画GIF),还可以显示JPEG、BMP、WMF、ICO和CUR等格式的图片。

如何在MFC中使用CPictureEx

要在MFC项目中使用CPictureEx类,首先需要在对话框中添加一个静态文本或图片控件,并将该控件的ID更改为例如IDC_MYPICTURE。然后,使用ClassWizard将成员变量(例如m_Picture)与添加的控件关联起来。在对话框的头文件中,将变量类型从CStatic更改为CPictureEx,并确保包含PictureEx.h。在OnInitDialog函数(或任何喜欢的地方)中,添加以下代码:

if (m_Picture.Load(_T("mypicture.gif"))) m_Picture.Draw();

这样,就可以坐下来欣赏动画了。

如何在ATL中使用CPictureEx

要在ATL项目中使用CPictureEx类(CPictureExWnd),可以按照与MFC相同的步骤操作,但不需要使用ClassWizard。手动在类中添加一个CPictureExWnd类型的变量,并在WM_INITDIALOG处理函数中添加以下代码:

HWND hWnd = GetDlgItem(IDC_MYPIC); if (hWnd) m_wndBanner.SubclassWindow(hWnd);

之后,可以调用CPictureExWnd::Load()和CPictureExWnd::Draw()。当然,也可以直接调用CPictureExWnd::Create,因为CPictureExWnd只是具有一些额外功能的另一个窗口。

接口函数

CPictureEx类提供了多个接口函数,包括:

  • Load(...) - 加载GIF并准备绘制对象;
  • Draw() - 绘制图片或继续动画;
  • Stop() - 停止动画;
  • UnLoad() - 停止动画并释放所有资源;
  • SetBkColor(COLORREF) - 设置透明区域的填充颜色;
  • GetBkColor() - 获取当前填充颜色;
  • IsGIF() - 如果当前图片是GIF,则返回TRUE;
  • IsAnimatedGIF() - 如果当前图片是动画GIF,则返回TRUE;
  • IsPlaying() - 如果当前图片正在播放动画,则返回TRUE;
  • GetSize() - 返回图片的尺寸;
  • GetFrameCount() - 返回当前图片的帧数;
  • GetPaintRect(RECT *lpRect) - 返回当前绘制矩形;
  • SetPaintRect(const RECT *lpRect) - 设置当前绘制矩形。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485