HiEasyX  Ver 0.3.0
EasyX 全面扩展库
HiEasyX::Gif类 参考

#include <HiGif.h>

Public 成员函数

 Gif (const WCHAR *gifFileName=nullptr, HDC hdc=GetImageHDC())
 
 Gif (const Gif &gif)
 
virtual ~Gif ()
 
Gifoperator= (const Gif &gif)
 
void load (const WCHAR *gifFileName)
 加载图像 更多...
 
void bind (HDC hdc)
 绑定设备 更多...
 
void clear ()
 清空图像 更多...
 
void setPos (int x, int y)
 
void setSize (int width, int height)
 
int getX () const
 
int getY () const
 
int getWidth () const
 
int getHeight () const
 
int getOrginWidth () const
 
int getOrginHeight () const
 
int getFrameCount () const
 
int getCurFrame () const
 
int getDelayTime (int frame) const
 
void setDelayTime (int frame, long time_ms)
 
void setAllDelayTime (long time_ms)
 
void updateTime ()
 
void draw ()
 
void draw (int x, int y)
 
void drawFrame (int frame)
 
void drawFrame (int frame, int x, int y)
 
void getimage (IMAGE *pimg, int frame)
 获取图像 更多...
 
void play ()
 
void pause ()
 
void toggle ()
 
bool IsPlaying () const
 
void setVisible (bool enable)
 
bool IsVisible () const
 
bool IsAnimation () const
 
void resetPlayState ()
 重置播放状态 更多...
 
void info () const
 

详细描述

    Gif 动图
 使用方法:
    1. load 加载图像
    2. bind 绑定输出 HDC
    3. (可选)setPos 设置位置
    4. (可选)setSize 设置缩放大小(为 0 表示原图大小)
    5. play 开始播放
    6. draw 绘制到 HDC
Bug:
    1. 释放时可能崩溃
    2. 对绑定的 HDC 调整大小可能导致崩溃

在文件 HiGif.h34 行定义.

构造及析构函数说明

◆ Gif() [1/2]

HiEasyX::Gif::Gif ( const WCHAR *  gifFileName = nullptr,
HDC  hdc = GetImageHDC() 
)

在文件 HiGif.cpp8 行定义.

9  {
10  init();
11  if (gifFileName != nullptr)
12  load(gifFileName);
13  bind(hdc);
14  }

◆ Gif() [2/2]

HiEasyX::Gif::Gif ( const Gif gif)

在文件 HiGif.cpp17 行定义.

18  {
19  copy(gif);
20  }

◆ ~Gif()

HiEasyX::Gif::~Gif ( )
virtual

在文件 HiGif.cpp23 行定义.

24  {
25  delete gifImage;
26  delete pItem;
27  delete graphics;
28  }

成员函数说明

◆ bind()

void HiEasyX::Gif::bind ( HDC  hdc)

绑定设备

参数
[in]hdc绘图设备

在文件 HiGif.cpp67 行定义.

68  {
69  this->hdc = hdc;
70  if (graphics != nullptr)
71  delete graphics;
72  graphics = Gdiplus::Graphics::FromHDC(hdc);
73  }

◆ clear()

void HiEasyX::Gif::clear ( )

清空图像

在文件 HiGif.cpp76 行定义.

77  {
78  if (gifImage) {
79  delete gifImage;
80  gifImage = nullptr;
81  }
82 
83  if (pItem) {
84  delete pItem;
85  pItem = nullptr;
86  }
87  frameCount = 0;
88  }

◆ draw() [1/2]

void HiEasyX::Gif::draw ( )

在文件 HiGif.cpp120 行定义.

121  {
122  draw(x, y);
123  }

◆ draw() [2/2]

void HiEasyX::Gif::draw ( int  x,
int  y 
)

在文件 HiGif.cpp126 行定义.

127  {
128  updateTime();
129  drawFrame(curFrame, x, y);
130  }

◆ drawFrame() [1/2]

void HiEasyX::Gif::drawFrame ( int  frame)

在文件 HiGif.cpp133 行定义.

134  {
135  drawFrame(frame, x, y);
136  }

◆ drawFrame() [2/2]

void HiEasyX::Gif::drawFrame ( int  frame,
int  x,
int  y 
)

在文件 HiGif.cpp139 行定义.

140  {
141  if (!visible)
142  return;
143  int w = width, h = height;
144  if (w == 0 && h == 0) {
145  w = gifImage->GetWidth();
146  h = gifImage->GetHeight();
147  }
148  if (frameCount != 0 && gifImage && 0 <= frame) {
149  frame %= frameCount;
150  gifImage->SelectActiveFrame(&Gdiplus::FrameDimensionTime, frame);
151  graphics->DrawImage(gifImage, x, y, w, h);
152  }
153  }

◆ getCurFrame()

int HiEasyX::Gif::getCurFrame ( ) const
inline

在文件 HiGif.h101 行定义.

101 { return curFrame; }

◆ getDelayTime()

int HiEasyX::Gif::getDelayTime ( int  frame) const

在文件 HiGif.cpp182 行定义.

183  {
184  if (frame < 0 || frameCount <= frame ||
185  !pItem || pItem->length <= (unsigned int)frame)
186  return 0;
187  else
188  return ((long*)pItem->value)[frame] * 10;
189  }

◆ getFrameCount()

int HiEasyX::Gif::getFrameCount ( ) const
inline

在文件 HiGif.h100 行定义.

100 { return frameCount; }

◆ getHeight()

int HiEasyX::Gif::getHeight ( ) const
inline

在文件 HiGif.h93 行定义.

93 { return height; }

◆ getimage()

void HiEasyX::Gif::getimage ( IMAGE *  pimg,
int  frame 
)

获取图像

参数
[in]pimg载体
[in]frame帧索引

在文件 HiGif.cpp156 行定义.

157  {
158  if (frame < 0 || frameCount <= frame)
159  return;
160 
161  int width = gifImage->GetWidth(), height = gifImage->GetHeight();
162 
163  if (width != pimg->getwidth() || height != pimg->getheight())
164  Resize(pimg, width, height);
165 
166  // 自定义图像缓存区(ARGB)
167  Gdiplus::BitmapData bitmapData;
168  bitmapData.Stride = width * 4;
169  int buffSize = width * height * sizeof(COLORREF);
170  bitmapData.Scan0 = GetImageBuffer(pimg);
171 
172  gifImage->SelectActiveFrame(&Gdiplus::FrameDimensionTime, frame);
173  Gdiplus::Rect rect(0, 0, width, height);
174  // 以 32 位像素 ARGB 格式读取, 自定义缓存区
175 
176  gifImage->LockBits(&rect,
177  Gdiplus::ImageLockModeRead | Gdiplus::ImageLockModeUserInputBuf, PixelFormat32bppARGB, &bitmapData);
178  gifImage->UnlockBits(&bitmapData);
179  }

◆ getOrginHeight()

int HiEasyX::Gif::getOrginHeight ( ) const

在文件 HiGif.cpp99 行定义.

100  {
101  if (!gifImage)
102  return 0;
103  return gifImage->GetHeight();
104  }

◆ getOrginWidth()

int HiEasyX::Gif::getOrginWidth ( ) const

在文件 HiGif.cpp91 行定义.

92  {
93  if (!gifImage)
94  return 0;
95  return gifImage->GetWidth();
96  }

◆ getWidth()

int HiEasyX::Gif::getWidth ( ) const
inline

在文件 HiGif.h92 行定义.

92 { return width; }

◆ getX()

int HiEasyX::Gif::getX ( ) const
inline

在文件 HiGif.h88 行定义.

88 { return x; }

◆ getY()

int HiEasyX::Gif::getY ( ) const
inline

在文件 HiGif.h89 行定义.

89 { return y; }

◆ info()

void HiEasyX::Gif::info ( ) const

在文件 HiGif.cpp247 行定义.

248  {
249  printf("绘制区域大小: %d x %d\n", getWidth(), getHeight());
250  printf("原图像大小 : %d x %d\n", getOrginWidth(), getOrginHeight());
251  int frameCnt = getFrameCount();
252  printf("帧数: %d\n", getFrameCount());
253  printf("帧的延时时间:\n");
254  for (int i = 0; i < frameCnt; i++)
255  printf("第%3d 帧:%4d ms\n", i, getDelayTime(i));
256  }

◆ IsAnimation()

bool HiEasyX::Gif::IsAnimation ( ) const
inline

在文件 HiGif.h134 行定义.

134 { return frameCount > 1; }

◆ IsPlaying()

bool HiEasyX::Gif::IsPlaying ( ) const
inline

在文件 HiGif.h129 行定义.

129 { return playing; }

◆ IsVisible()

bool HiEasyX::Gif::IsVisible ( ) const
inline

在文件 HiGif.h132 行定义.

132 { return visible; }

◆ load()

void HiEasyX::Gif::load ( const WCHAR *  gifFileName)

加载图像

参数
[in]gifFileName图像文件路径

在文件 HiGif.cpp58 行定义.

59  {
60  if (gifImage != nullptr)
61  delete gifImage;
62  gifImage = new Gdiplus::Bitmap(gifFileName);
63  read();
64  }

◆ operator=()

Gif & HiEasyX::Gif::operator= ( const Gif gif)

在文件 HiGif.cpp31 行定义.

32  {
33  if (this == &gif) return *this;
34  if (graphics != nullptr) delete graphics;
35  if (pItem != nullptr) delete pItem;
36  if (gifImage != nullptr) delete gifImage;
37 
38  copy(gif);
39 
40  return *this;
41  }

◆ pause()

void HiEasyX::Gif::pause ( )

在文件 HiGif.cpp223 行定义.

224  {
225  if (playing) {
226  playing = false;
227  this->pauseTime = clock();
228  }
229  }

◆ play()

void HiEasyX::Gif::play ( )

在文件 HiGif.cpp209 行定义.

210  {
211  playing = true;
212  clock_t sysTime = clock();
213  if (frameBaseTime == 0) {
214  pauseTime = frameBaseTime = sysTime;
215  curFrame = 0;
216  frameDelayTime = getDelayTime(curFrame);
217  }
218  else
219  frameBaseTime += sysTime - pauseTime;
220  }

◆ resetPlayState()

void HiEasyX::Gif::resetPlayState ( )

重置播放状态

在文件 HiGif.cpp238 行定义.

239  {
240  curFrame = 0;
241  curDelayTime = frameBaseTime = frameDelayTime = 0;
242  pauseTime = 0;
243  playing = false;
244  }

◆ setAllDelayTime()

void HiEasyX::Gif::setAllDelayTime ( long  time_ms)

在文件 HiGif.cpp202 行定义.

203  {
204  for (int i = 0; i < frameCount; i++)
205  ((long*)pItem->value)[i] = time_ms / 10;
206  }

◆ setDelayTime()

void HiEasyX::Gif::setDelayTime ( int  frame,
long  time_ms 
)

在文件 HiGif.cpp192 行定义.

193  {
194  if (frame < 0 || frameCount <= frame ||
195  !pItem || pItem->length <= (unsigned int)frame)
196  return;
197  else
198  ((long*)pItem->value)[frame] = time_ms / 10;
199  }

◆ setPos()

void HiEasyX::Gif::setPos ( int  x,
int  y 
)

在文件 HiGif.cpp106 行定义.

107  {
108  this->x = x;
109  this->y = y;
110  }

◆ setSize()

void HiEasyX::Gif::setSize ( int  width,
int  height 
)

在文件 HiGif.cpp113 行定义.

114  {
115  this->width = width;
116  this->height = height;
117  }

◆ setVisible()

void HiEasyX::Gif::setVisible ( bool  enable)
inline

在文件 HiGif.h131 行定义.

131 { visible = enable; }

◆ toggle()

void HiEasyX::Gif::toggle ( )

在文件 HiGif.cpp232 行定义.

233  {
234  playing ? pause() : play();
235  }

◆ updateTime()

void HiEasyX::Gif::updateTime ( )

在文件 HiGif.cpp304 行定义.

305  {
306  // 图像为空,或者不是动图,或者没有调用过play()播放()
307  if (frameCount <= 1 || frameBaseTime == 0
308  || (pItem && pItem->length == 0))
309  return;
310 
311  // 根据播放或暂停计算帧播放时间
312  curDelayTime = playing ? (clock() - frameBaseTime) : (pauseTime - frameBaseTime);
313 
314  int cnt = 0, totalTime = 0;
315 
316  // 间隔时间太长可能会跳过多帧
317  while (curDelayTime >= frameDelayTime) {
318  curDelayTime -= frameDelayTime;
319  frameBaseTime += frameDelayTime;
320 
321  // 切换到下一帧
322  if (++curFrame >= frameCount)
323  curFrame = 0;
324  frameDelayTime = getDelayTime(curFrame);
325 
326  totalTime += frameDelayTime;
327 
328  // 多帧图像,但总延时时间为0的处理
329  if (++cnt == frameCount && totalTime == 0)
330  break;
331  }
332  }

该类的文档由以下文件生成:
HiEasyX::Gif::play
void play()
Definition: HiGif.cpp:209
HiEasyX::Gif::getWidth
int getWidth() const
Definition: HiGif.h:92
HiEasyX::Gif::getOrginHeight
int getOrginHeight() const
Definition: HiGif.cpp:99
HiEasyX::Gif::bind
void bind(HDC hdc)
绑定设备
Definition: HiGif.cpp:67
HiEasyX::Gif::getOrginWidth
int getOrginWidth() const
Definition: HiGif.cpp:91
HiEasyX::Gif::getHeight
int getHeight() const
Definition: HiGif.h:93
HiEasyX::Gif::updateTime
void updateTime()
Definition: HiGif.cpp:304
HiEasyX::Gif::getDelayTime
int getDelayTime(int frame) const
Definition: HiGif.cpp:182
HiEasyX::Gif::pause
void pause()
Definition: HiGif.cpp:223
HiEasyX::Gif::load
void load(const WCHAR *gifFileName)
加载图像
Definition: HiGif.cpp:58
HiEasyX::Gif::draw
void draw()
Definition: HiGif.cpp:120
HiEasyX::Gif::getFrameCount
int getFrameCount() const
Definition: HiGif.h:100
HiEasyX::Gif::drawFrame
void drawFrame(int frame)
Definition: HiGif.cpp:133