TNB Library
TnbMfcProcessingCtrl.h
[詳解]
1#pragma once
11#include "TnbMfcCommon.h"
12#include "TnbThread.h"
13#include "TnbDrawable.h"
14
15
16
17//TNB Library
18namespace TNB {
19namespace MFC {
20
21
22
42{
43 DEFSUPER(CWnd);
44public:
45
47 enum EMode
48 {
51 };
52
55 : _super(), m_size(0, 0), m_colorMark(::GetSysColor(COLOR_HIGHLIGHT))
56 , m_isActing(false), m_interval(10), m_step(1), m_colorBack(::GetSysColor(COLOR_BTNFACE))
57 , m_markWidth(6), m_pos(0), m_mode(1)
58 {
59 m_thread.SetRunner(this);
60 }
61
64 {
65 m_thread.Stop();
66 m_DeleteDrawer();
67 }
68
76 void SetParameter(EMode mode, DWORD interval, int step = 6, COLORREF colorBack = CLR_INVALID)
77 {
78 m_mode = mode;
79 m_interval = interval;
80 m_step = step;
81 m_colorBack = (colorBack != CLR_INVALID) ? colorBack : ::GetSysColor(COLOR_BTNFACE);
82 }
83
90 void SetMarker(COLORREF colorMark, int width)
91 {
92 Action(false);
93 m_DeleteDrawer();
94 m_colorMark = (colorMark != CLR_INVALID) ? colorMark : ::GetSysColor(COLOR_HIGHLIGHT);
95 m_markWidth = width;
96 }
97
103 void SetMarker(const IDrawable& draw)
104 {
105 Action(false);
106 m_DeleteDrawer();
107 SIZE s;
108 if ( draw.GetSize(s) )
109 {
110 m_piMarkerDrawer = draw.Clone();
111 m_markWidth = s.cx;
112 }
113 }
114
121 void Action(bool isAction)
122 {
123 m_isActing = isAction;
124 m_thread.Stop();
125 if ( isAction )
126 {
127 m_pos = 0;
128 m_thread.Start(_T("ProcessingCtrl"));
129 }
130 RedrawWindow();
131 }
132
139 bool IsActing(void) const
140 {
141 return m_isActing;
142 }
143
149 {
150 return m_thread;
151 }
152
153protected:
154
160 virtual void PreSubclassWindow(void)
161 {
162 CRect rc;
163 _super::GetClientRect(rc);
164 m_size = rc.Size();
165 }
166
176 virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
177 {
178 if ( message == WM_PAINT )
179 {
180 CPaintDC dc(this); // 描画用のデバイス コンテキスト
181 m_Draw(&dc);
182 return 0;
183 }
184 else if ( message == WM_PRINTCLIENT )
185 {
186 CDC* pDc = CDC::FromHandle(reinterpret_cast<HDC>(wParam));
187 m_Draw(pDc);
188 return 0;
189 }
190 else if ( message == WM_DESTROY )
191 {
192 m_isActing = false;
193 m_thread.Stop();
194 }
195 return _super::WindowProc(message, wParam, lParam);
196 }
197
202 DWORD Run(void)
203 {
204 while ( IsRunnable() )
205 {
206 ::Sleep(m_interval);
207 if ( m_isActing )
208 {
209 if ( m_mode > 0 )
210 {
211 m_pos += m_step;
212 if ( m_pos + m_markWidth > m_size.cx )
213 {
214 m_pos = m_size.cx - m_markWidth;
215 m_mode = -1;
216 }
217 }
218 else if ( m_mode < 0 )
219 {
220 if ( m_pos >= m_step )
221 {
222 m_pos -= m_step;
223 }
224 else
225 {
226 m_mode = 1;
227 m_pos = 0;
228 }
229 }
230 else
231 {
232 m_pos += m_step;
233 if ( m_pos > m_size.cx )
234 {
235 m_pos = -m_markWidth;
236 }
237 }
238 if ( IsRunnable() )
239 {
240 _super::Invalidate();
241 }
242 }
243 }
244 return 0;
245 }
246
247private:
249 void m_DeleteDrawer(void)
250 {
251 m_piMarkerDrawer.Null();
252 }
257 void m_Draw(CDC* pDC)
258 {
259 CRect cliRect(CPoint(0, 0), m_size);
260 HRGN rgn = ::CreateRectRgnIndirect(&cliRect);
261 MFCLIB::SelectClipRgnOrg(pDC, rgn);
262 _DeleteObject(rgn);
263 if ( m_isActing )
264 {
265 CRect markRect(m_pos, 0, m_pos + m_markWidth, m_size.cy);
266 if ( m_piMarkerDrawer.IsNull() )
267 {
268 pDC->FillSolidRect(markRect, m_colorMark);
269 }
270 else
271 {
272 m_piMarkerDrawer->Draw(*pDC, m_pos, 0);
273 }
274 HRGN rgn = ::CreateRectRgnIndirect(&markRect);
275 MFCLIB::SelectClipRgnOrg(pDC, rgn, RGN_DIFF);
276 _DeleteObject(rgn);
277 }
278 pDC->FillSolidRect(cliRect, m_colorBack);
279 pDC->SelectClipRgn(NULL);
280 }
281 CThread m_thread;
282 CSize m_size;
283 COLORREF m_colorBack;
284 bool m_isActing;
285 DWORD m_interval;
286 int m_step;
287 COLORREF m_colorMark;
288 IDrawable::Ptr m_piMarkerDrawer;
289 int m_markWidth;
290 int m_pos;
291 int m_mode;
292};
293
294
295
296}; //MFC
297}; //TNB
描画情報関係のヘッダ
MFCコントロール共通のヘッダ
スレッド管理関係のヘッダ
ウィンドウ管理.
bool IsNull(void) const
[確認] NULLチェック
void Null(void)
[設定] 開放.
スレッド状態管理クラス
Definition: TnbThread.h:128
スレッド管理クラス
Definition: TnbThread.h:316
bool SetRunner(IRunner *pRunner)
[設定] ランナー、設定
Definition: TnbThread.h:420
bool Stop(DWORD dwWait=15000)
[設定] スレッド停止 スレッドに対して停止要求します。
Definition: TnbThread.h:505
bool Start(LPCTSTR lpszName=NULL)
[設定] スレッド開始
Definition: TnbThread.h:618
処理中コントロール
DWORD Run(void)
スレッド処理関数
CThreadStatus & ReferThreadStatus(void)
[設定] スレッド状態種取得
void Action(bool isAction)
[設定] 動作.
void SetParameter(EMode mode, DWORD interval, int step=6, COLORREF colorBack=CLR_INVALID)
[設定] 動き指定
void SetMarker(COLORREF colorMark, int width)
[設定] マーカー指定.
CProcessingCtrl(void)
コンストラクタ
bool IsActing(void) const
[確認] 動作確認.
~CProcessingCtrl(void)
デストラクタ
virtual void PreSubclassWindow(void)
[通知] subclassing/unsubclassing functions.
void SetMarker(const IDrawable &draw)
[設定] マーカー指定.
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
[通知] for processing Windows messages.
int SelectClipRgnOrg(CDC *pDC, HRGN rgn, int mode=RGN_COPY)
[設定] リージョン設定.
Definition: TnbMfcCommon.h:347
TNB Library
Definition: TnbDoxyTitle.txt:2
スレッド実行管理ランナーインターフェース
Definition: TnbThread.h:341
bool IsRunnable(void) const
[確認] 実行可能か否か
Definition: TnbThread.h:355
描画情報インターフェース
Definition: TnbDrawable.h:37
virtual bool GetSize(SIZE &_size) const =0
[取得] サイズ取得.
virtual IDrawable * Clone(void) const =0
[作成] クローン作成.
virtual void Draw(HDC dc, int x=0, int y=0) const =0
[描画] 描画.