TNB Library
TnbMfcAnimateStatic.h
[詳解]
1#pragma once
13#include "TnbMfcCommon.h"
14#include "TnbBitmapAnimater.h"
15#include "TnbMfcRgnControl.h"
16
17
18
19//TNB Library
20namespace TNB {
21namespace MFC {
22
23
24
61{
64public:
65
68 : _super(), m_interval(1000), m_nowIndex(0), m_mode(0), m_useCache(false), m_isStopInDrag(false), m_doAnimate(false)
69 {
70 }
71
83 bool StartAnimation(bool mode, DWORD interval, bool useCache = false, bool isStopInDrag = false)
84 {
85 m_Stop();
86 if ( _animater::GetLength() > 0 )
87 {
88 m_mode = mode;
89 m_interval = interval;
90 m_useCache = useCache;
91 m_isStopInDrag = isStopInDrag;
93 //
94 m_nowIndex = 0;
95 m_nowBitmap.Null();
96 m_doAnimate = true;
97 m_Start();
98 return true;
99 }
100 return false;
101 }
102
106 void StopAnimation(void)
107 {
108 m_doAnimate = false;
109 m_Stop();
110 }
111
121 bool SetFirstFrame(CBitmapHandle bmp, const IBitmapWipable& defaultWiper)
122 {
123 bool r = _animater::SetFirstFrame(bmp, defaultWiper);
124 m_Resize();
125 return r;
126 }
127
136 {
137 bool r = _animater::SetFirstFrame(bmp);
138 m_Resize();
139 return r;
140 }
141
142 #ifndef _TnbDOXYGEN //Document作成用シンボル
143 /* 旧名
144 * アニメ開始。 StartAnimation() を使ってください。
145 */
146 bool SetAnimationParameter(bool mode, DWORD interval, bool useCache = false, bool isStopInDrag = false)
147 {
148 return StartAnimation(mode, interval, useCache, isStopInDrag);
149 }
150 #endif
151
152protected:
153
163 virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
164 {
165 switch ( message )
166 {
167 case WM_ERASEBKGND:
168 TTRACE0("WM_ERASEBKGND\n");
169 if ( _animater::GetLength() != 0 )
170 {
171 return 0;
172 }
173 case WM_PRINTCLIENT:
174 TTRACE0("WM_PRINTCLIENT\n");
175 {
176 CDC* pDc = CDC::FromHandle(reinterpret_cast<HDC>(wParam));
177 m_Draw(pDc);
178 }
179 return 0;
180 case WM_PAINT:
181 TTRACE0("WM_PAINT\n");
182 {
183 CPaintDC dc(this); // 描画用のデバイス コンテキスト
184 RECT rc;
185 GetClientRect(&rc);
186 if ( ::RectVisible(dc, &rc) )
187 {
188 m_Draw(&dc);
189 }
190 }
191 return 0;
192 case WM_ENABLE:
193 TTRACE0("WM_ENABLE\n");
194 (wParam != 0) ? m_Start() : m_Stop();
195 return 0;
196 case WM_SHOWWINDOW:
197 TTRACE0("WM_SHOWWINDOW\n");
198 if ( wParam != 0 )
199 {
200 m_nowIndex = 0;
201 m_nowBitmap.Null();
202 m_Start();
203 }
204 else
205 {
206 m_Stop();
207 }
208 return 0;
209 case WM_TIMER:
210 TTRACE0("WM_TIMER\n");
211 if ( wParam == TIMERID_ANIMA )
212 {
213 if ( ! ::IsWindowEnabled(m_hWnd) )
214 {
215 m_Stop();
216 }
217 else if ( m_IsAnimation() )
218 {
219 if ( m_mode > 0 )
220 {
221 m_nowIndex++;
222 if ( m_nowIndex >= _animater::GetLength() )
223 {
224 m_nowIndex = _animater::GetLength() - 2;
225 m_mode = -1;
226 }
227 }
228 else if ( m_mode < 0 )
229 {
230 if ( m_nowIndex > 0 )
231 {
232 m_nowIndex--;
233 }
234 else
235 {
236 m_nowIndex = 1;
237 m_mode = 1;
238 }
239 }
240 else
241 {
242 m_nowIndex++;
243 if ( m_nowIndex >= _animater::GetLength() )
244 {
245 m_nowIndex = 0;
246 }
247 }
248 m_nowBitmap.Null();
249// RedrawWindow(NULL, NULL, RDW_INVALIDATE);
250 RedrawWindow();
251 }
252 }
253 break;
254 case WM_LBUTTONDOWN:
255 return 0;
256 }
257 return _super::WindowProc(message, wParam, lParam);
258 }
259
265 virtual void PreSubclassWindow(void)
266 {
267 _super::ModifyStyle(0, SS_NOTIFY);
268 _super::PreSubclassWindow();
269 m_Resize();
270 }
271
272private:
273 enum { TIMERID_ANIMA = 10000 };
274 DWORD m_interval;
275 bool m_doAnimate;
276 INDEX m_nowIndex;
277 CBitmapHandle m_nowBitmap;
278 int m_mode;
279 bool m_useCache;
280 bool m_isStopInDrag;
282 void m_Resize(void)
283 {
284 if ( _animater::GetLength() == 0 ) { return; }
285 SIZE size;
286 if ( _animater::FrameAt(0).GetSize(size) )
287 {
288 MFCLIB::ChangeClientSize(this, size.cx, size.cy);
289 }
290 }
292 void m_Draw(CDC* pDC)
293 {
294 if ( m_nowBitmap.IsNull() && _animater::GetLength() != 0 )
295 {
296 m_nowBitmap = m_useCache ? _animater::FrameAtWithCache(m_nowIndex): _animater::FrameAt(m_nowIndex);
297 }
298 if ( m_clientRgn != NULL )
299 {
301 }
302 if ( ! m_nowBitmap.IsNull() )
303 {
304 m_nowBitmap.Draw(*pDC);
305 }
306 }
308 bool m_IsAnimation(void)
309 {
310 if ( m_isStopInDrag && ::GetCapture() != NULL )
311 {
312 return false;
313 }
314 return _animater::GetLength() > 1;
315 }
317 void m_Start(void)
318 {
319 if ( m_doAnimate && ::IsWindow(m_hWnd) )
320 {
321 SetTimer(TIMERID_ANIMA, m_interval, NULL);
322 }
323 }
325 void m_Stop(void)
326 {
327 if ( ::IsWindow(m_hWnd) )
328 {
329 KillTimer(TIMERID_ANIMA);
330 }
331 }
332
333};
334
335
336
337}; //MFC
338}; //TNB
339
340
341
ビットマップアニメ関係のヘッダ
MFCコントロール共通のヘッダ
領域指定コントロールクラス関係のヘッダ
ビットマップアニメクラス
void FlashCache(void)
[処理] キャッシュ消去
CBitmapHandle FrameAt(INDEX index) const
[取得] フレーム取得
size_t GetLength(void) const
[取得] フレーム数取得
CBitmapHandle FrameAtWithCache(INDEX index)
[取得] フレーム取得
bool SetFirstFrame(CBitmapHandle bmp, const IBitmapWipable &defaultWiper)
[設定] 最初のフレーム画像設定
HBITMAP型ハンドルハンドル
bool Draw(HDC hdc, int x=0, int y=0) const
[処理] イメージ描画.
bool IsNull(void) const
[確認] NULLチェック
void Null(void)
[設定] 開放.
アニメ表示コントロールクラス
CAnimateStatic(void)
コンストラクタ
bool StartAnimation(bool mode, DWORD interval, bool useCache=false, bool isStopInDrag=false)
[設定] アニメ設定.
void StopAnimation(void)
[設定] アニメ停止
virtual void PreSubclassWindow(void)
[通知] subclassing/unsubclassing functions.
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
[通知] for processing Windows messages.
bool SetFirstFrame(CBitmapHandle bmp, const IBitmapWipable &defaultWiper)
[設定] 最初のフレーム画像設定
bool SetFirstFrame(CBitmapHandle bmp)
[設定] 最初のフレーム画像設定
領域指定コントロールサポートクラス
HRGN m_clientRgn
クライアントリージョン
bool ChangeClientSize(CWnd *pWnd, int cx=-1, int cy=-1)
[設定] クライアントサイズ設定.
Definition: TnbMfcCommon.h:102
int SelectClipRgnOrg(CDC *pDC, HRGN rgn, int mode=RGN_COPY)
[設定] リージョン設定.
Definition: TnbMfcCommon.h:347
TNB Library
Definition: TnbDoxyTitle.txt:2
ビットマップワイパブルインターフェース