使用GDI+ 显示GIF动画 P424.docVIP

  • 10
  • 0
  • 约5.1千字
  • 约 7页
  • 2016-11-27 发布于河南
  • 举报
使用GDI显示GIF动画P424

《Visual C++ 开发实战宝典》10.6 GDI+ 图像处理 10.6.2 使用GDI+ 显示GIF动画 P424 ①定义下面内存画布CMemDC,加速图像处理,否则会出现闪烁!! ②以下洋红部分,为将内存画布背景设置成白色。然后,在此上面绘制GIF图像帧。 ③以下蓝色部分,为将内存画布颜色设成画刷颜色。为实现GIF背景与窗口客户区颜色一致。 ④断言:ASSERT(this-GetDeviceCaps(RASTERCAPS)RC_BITBLT==RC_BITBLT),用来判断画面是否 支持PatBlt函数。 ⑤在CMemDC构造函数中,若不向内存画布绘制白色或其它颜色或图案,将构造函数中的洋红与蓝色部分注释掉。则显示原汁原味GIF动画(和ACDSee中看到的一样,即保持原背景色)。如下图 ⑥ 析构函数中的BitBlt()函数不可缺少! ? ? ?内存画布对象CMemDC dc是OnTimer定时器处理函数中的局部变量,OnTimer作用是定时显示GIF动画帧。 第执行一次,将一帧画绘制到内存画布dc上,OnTimer()执行退出后,调用调用析构函数中的BitBlt()函数将内存画布dc中的图像绘制到窗口客户区指定的部分。 ? ? 可见,内存画布dc中的图像包括2部分:其一,在构造函数中绘制的背景(如白色或其它画刷图案),当然,也可以不用绘制背景。其二,在OnTimer()函数中绘制的动画帧。 class CMemDC : public CDC? //定义一个CMemDC类 { private: CBitmap* m_bmp; //定义一个位图对象 CBitmap* m_oldbmp; //定义一个位图对象 ? CDC* m_pDC; //定义一个设备上下文指针 CRect m_Rect; //定义一个区域对象 public: CMemDC(CDC* pDC, const CRect rect) : CDC() //定义构造函数 { CreateCompatibleDC(pDC); //创建一个兼容的设备上下文 m_bmp = new CBitmap; //为位图对象分配空间 //创建位图对象 ? m_bmp-CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); ? m_oldbmp = SelectObject(m_bmp); //选中创建的位图到内存画布 ? m_pDC = pDC; //设置成员变量 m_Rect = rect; //设置区域对象 //? this-BitBlt(0, 0, m_Rect.Width(), m_Rect.Height(),? //? pDC, m_Rect.left, m_Rect.top,?WHITENESS?); //绘制白色背景 ,若想采用任意颜色,如下蓝色部分 //? 判断是否支持PatBlt函数 ? ASSERT(this-GetDeviceCaps(RASTERCAPS)RC_BITBLT==RC_BITBLT);? CBrush brush; brush.CreateSolidBrush(RGB(236,233,216)); ?//RGB(,,)是对话框背景色,使用取色软件ColorPix 获得。 SelectObject(brush); this-PatBlt(0,0,m_Rect.Width(),m_Rect.Height(),PATCOPY); //将画刷色彩拷贝到内存画布。 } ~CMemDC()? //析构函数 { m_pDC-BitBlt(m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height(),? this,?0, 0, SRCCOPY);//绘制图像,将内存画布上的图像拷贝到窗口画布上。 SelectObject(m_oldbmp); //选中原来的位图对象 if (m_bmp != NULL)? //判断位图对象是否为空 delete m_bmp; //删除位图对象 DeleteObject(this); //释放设备上下文 } }; 下面给出OnTimer()函数 void COutputGIFDlg::OnTimer(UINT nIDEvent)? { GUID Guid = FrameDimensionTime;

文档评论(0)

1亿VIP精品文档

相关文档