TNB Library
TnbMfcColorSelectButton.h
[詳解]
1#pragma once
13#include "TnbMfcDrawingButton.h"
14#include "TnbFontHandle.h"
15#include "TnbAccessor.h"
16
17
18
19//TNB Library
20namespace TNB {
21namespace MFC {
22
23
24
29#define CSBN_SELCHANGE 10
30
31
32
61{
62 DEFSUPER(CDrawingButton);
63public:
64
66 CColorSelectButton(void) : m_pAccessor(NULL)
67 {
68 m_face.SetSelectColor(RGB(255, 255, 255));
69 m_default.Resize(DEFAULTMAX);
70 loop ( i, DEFAULTMAX )
71 {
72 BYTE r = down_cast<BYTE>((i & _BIT(0)) == 0 ? 255 : 0);
73 BYTE g = down_cast<BYTE>((i & _BIT(1)) == 0 ? 255 : 0);
74 BYTE b = down_cast<BYTE>((i & _BIT(2)) == 0 ? 255 : 0);
75 m_default[i] = RGB(r, g, b);
76 }
77 }
78
84 void SetAccessor(IAccessor* pAccessor, LPCTSTR lpszAccessorSectionName)
85 {
86 m_pAccessor = pAccessor;
87 m_accessorSectionName = lpszAccessorSectionName;
88 IAccessor::CSection sec(m_pAccessor, m_accessorSectionName);
89 loop ( i, DEFAULTMAX )
90 {
91 CStr key = CStr::Fmt(_T("c%d"), i + 1);
92 m_default[i] = sec.QueryDword(key, m_default[i]);
93 }
94 }
95
101 COLORREF SetSelectColor(COLORREF c)
102 {
103 COLORREF r = m_face.GetSelectColor();
104 m_face.SetSelectColor(c);
105 m_InsertDefaultColor(c);
106 if ( ::IsWindow(GetSafeHwnd()) )
107 {
108 _super::SetNormalDrawer(m_face);
109 _super::RedrawWindow();
110 }
111 return r;
112 }
113
118 COLORREF GetSelectColor(void) const
119 {
120 return m_face.GetSelectColor();
121 }
122
129 COLORREF SetDefaultColor(INDEX index, COLORREF c)
130 {
131 if ( index >= 0 && index < DEFAULTMAX )
132 {
133 COLORREF r = m_default[index];
134 m_default[index] = c;
135 return r;
136 }
137 return INVALID_INDEX;
138 }
139
145 COLORREF GetDefaultColor(INDEX index) const
146 {
147 if ( index >= 0 && index < DEFAULTMAX )
148 {
149 return m_default[index];
150 }
151 return INVALID_INDEX;
152 }
153
154protected:
155
161 void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
162 {
163 if ( lpDrawItemStruct->CtlType == ODT_MENU )
164 {
165 HDC dc = lpDrawItemStruct->hDC;
166 CRect rc = lpDrawItemStruct->rcItem;
167 COLORREF color = lpDrawItemStruct->itemData;
168 {
169 CDcSelectAssistant dca(dc);
170 bool isSel = ((lpDrawItemStruct->itemState & CDIS_SELECTED) != 0);
171 ::FillRect(dc, &rc, ::GetSysColorBrush(isSel ? COLOR_HIGHLIGHT : COLOR_MENU));
172 CBrush brush(color);
173 dca.SelectBrush(brush);
174 CPen pen(PS_SOLID, 1, RGB(0, 0, 0));
175 dca.SelectPen(pen);
176 rc.DeflateRect(3, 3);
177 ::Rectangle(dc, rc.left, rc.top, rc.right, rc.bottom);
178 }
179 }
180 _super::OnDrawItem(nIDCtl, lpDrawItemStruct);
181 }
182
188 virtual void PreSubclassWindow(void)
189 {
191 _super::PreSubclassWindow();
192 CRect rc;
193 _super::GetClientRect(rc);
194 CFontHandle f;
195 f.Set(80, _T("MS Gothic"));
196 COLORREF c = m_face.GetSelectColor();
197 m_face.SetFont(f);
198 m_face.Resize(rc.Size());
199 m_face.SetTextColor(CLR_INVALID);
200 m_face.SetSelectColor(CLR_INVALID);
201 _super::SetDisableDrawer(m_face);
202 m_face.SetTextColor(RGB(0, 0, 0));
203 m_face.SetSelectColor(c);
204 _super::SetNormalDrawer(m_face);
205 }
206
211 virtual void OnClickButton(void)
212 {
213 _super::OnClickButton();
214 CMenu menu;
215 CRect rc;
216 _super::GetWindowRect(&rc);
217 menu.CreatePopupMenu();
218 UINT pos = static_cast<UINT>(-1);
219 loop ( i, DEFAULTMAX )
220 {
221 menu.InsertMenu(pos, MF_OWNERDRAW, ITEM_DEFAULTTOP + i, reinterpret_cast<LPCTSTR>(m_default[i]));
222 }
223 menu.InsertMenu(pos, MF_SEPARATOR);
224 menu.InsertMenu(pos, 0, ITEM_OTHER, _T("その他..."));
225 menu.TrackPopupMenu(0, rc.left, rc.bottom, this, NULL);
226 return;
227 }
228
238 virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
239 {
240 if ( message == WM_DRAWITEM )
241 {
242 OnDrawItem(wParam, reinterpret_cast<LPDRAWITEMSTRUCT>(lParam));
243 }
244 else if ( message == WM_COMMAND )
245 {
246 if ( wParam == ITEM_OTHER )
247 {
248 CColorDialog dlg(m_face.GetSelectColor());
249 if ( dlg.DoModal() == IDOK )
250 {
251 COLORREF c = dlg.GetColor();
252 m_face.SetSelectColor(c);
253 m_InsertDefaultColor(c);
254 _super::SetNormalDrawer(m_face);
255 _super::Invalidate();
257 }
258 }
259 else if ( wParam >= ITEM_DEFAULTTOP && ITEM_DEFAULTTOP + DEFAULTMAX > wParam )
260 {
261 COLORREF c = m_default[wParam - 2000];
262 m_face.SetSelectColor(c);
263 m_InsertDefaultColor(c);
264 _super::SetNormalDrawer(m_face);
265 _super::Invalidate();
267 }
268 }
269 return _super::WindowProc(message, wParam, lParam);
270 }
271
272private:
273
275 void m_InsertDefaultColor(COLORREF c)
276 {
277 if ( m_default[0] == c )
278 {
279 return;
280 }
281 loop ( i, m_default.GetSize() )
282 {
283 if ( c == m_default[i] )
284 {
285 // 途中に同じ色があった。
286 loop_dn ( j, i )
287 {
288 m_default[j + 1] = m_default[j];
289 }
290 m_default[0] = c;
291 m_WriteDefault();
292 return;
293 }
294 }
295 loop_dn ( i, m_default.GetSize() - 1)
296 {
297 m_default[i + 1] = m_default[i];
298 }
299 m_default[0] = c;
300 m_WriteDefault();
301 }
302
304 void m_WriteDefault(void)
305 {
306 if ( m_pAccessor == NULL )
307 {
308 return;
309 }
310 IAccessor::CSection sec(m_pAccessor, m_accessorSectionName);
311 loop ( i, DEFAULTMAX )
312 {
313 CStr key = CStr::Fmt(_T("c%d"), i + 1);
314 sec.WriteDword(key, m_default[i]);
315 }
316 }
317
319 class CFaceDrawer : public CNullDrawer
320 {
321 public:
323 CFaceDrawer(CFontHandle font = NULL, COLORREF textColor = CLR_INVALID, COLORREF selectColor = CLR_INVALID)
324 : m_font(font), m_selectColor(selectColor), m_textColor(textColor)
325 {
326 }
327 // 選択色取得
328 COLORREF GetSelectColor(void) const
329 {
330 return m_selectColor;
331 }
332 // 選択色設定
333 void SetSelectColor(COLORREF c)
334 {
335 m_selectColor = c;
336 }
337 // 文字色設定
338 void SetTextColor(COLORREF c)
339 {
340 m_textColor = c;
341 }
342 // フォント設定
343 void SetFont(CFontHandle font)
344 {
345 m_font = font;
346 }
352 virtual IDrawable* Clone(void) const
353 {
354 CFaceDrawer* P = new CFaceDrawer;
355 *P = *this;
356 return P;
357 }
366 virtual void Draw(HDC dc, int x = 0, int y = 0) const
367 {
368 CDcSelectAssistant dca(dc);
369 CRect rc(CPoint(x, y), m_size);
370 dca.SelectFont(m_font);
371 rc.DeflateRect(5, 5);
372 if ( m_font != NULL )
373 {
374 CRect r = rc;
375 CTextDrawer::DrawTextRect(r, dc, DT_RIGHT | DT_VCENTER, m_textColor, _T("▼"));
376 r.left -= 3;
377 r.right = r.left + 2;
378 ::DrawEdge(dc, &r, EDGE_ETCHED, BF_LEFT | BF_RIGHT);
379 rc.right = r.left - 4;
380 }
381 if ( IS_RGBVALUE(m_selectColor) )
382 {
383 CBrush brush(m_selectColor);
384 CPen pen(PS_SOLID, 1, RGB(0, 0, 0));
385 dca.SelectBrush(brush);
386 dca.SelectPen(pen);
387 ::Rectangle(dc, rc.left, rc.top, rc.right, rc.bottom);
388 }
389 }
390 private:
391 COLORREF m_selectColor;
392 COLORREF m_textColor;
393 CFontHandle m_font;
394 };
395
396 enum
397 {
398 DEFAULTMAX = 8,
399 ITEM_OTHER = 1000,
400 ITEM_DEFAULTTOP = 2000,
401 };
402 CFaceDrawer m_face;
403 CWorkMemT<COLORREF> m_default;
404 IAccessor* m_pAccessor;
405 CStr m_accessorSectionName;
406};
407
408
409
410}; //MFC
411}; //TNB
412
413
414
情報アクセス関係のヘッダ
#define loop_dn(VAR, CNT)
loop構文.
Definition: TnbDef.h:355
#define _BIT(X)
BIT演算
Definition: TnbDef.h:307
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
フォントハンドル関係のヘッダ
#define CSBN_SELCHANGE
カラー選択ボタン 選択変更.
描画情報ボタン関係のヘッダ
HWND GetSafeHwnd(void) const
[取得] ウィンドウハンドル取得.
デバイステキストセレクトアシスタント
void SelectBrush(HBRUSH brush)
[選択] ブラシ選択.
void SelectPen(HPEN pen)
[選択] ペン選択.
HFONT型ハンドルハンドル
Definition: TnbFontHandle.h:80
bool Set(const LOGFONT &attr)
[設定] フォント設定.
NULL描画クラス
Definition: TnbDrawable.h:106
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
Definition: TnbStr.h:1206
static bool DrawTextRect(RECT &_rect, HDC dc, DWORD drawStyle, const POINT &offset, COLORREF color1, COLORREF color2, LPCTSTR str)
[表示] 範囲文字表示.
size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbDef.h:665
void Resize(size_t l)
[設定] サイズ再設定
Definition: TnbDef.h:672
セクション情報アクセスクラス
Definition: TnbAccessor.h:294
DWORD QueryDword(LPCTSTR lpszKey, DWORD dwDefault=0) const
[取得] 数値情報取得
Definition: TnbAccessor.h:587
カラー選択ボタンコントロール
void SetAccessor(IAccessor *pAccessor, LPCTSTR lpszAccessorSectionName)
[設定] アクセサー指定.
CColorSelectButton(void)
コンストラクタ
COLORREF SetDefaultColor(INDEX index, COLORREF c)
[設定] デフォルト色設定.
COLORREF GetDefaultColor(INDEX index) const
[取得] デフォルト色取得.
COLORREF SetSelectColor(COLORREF c)
[設定] 選択色設定.
virtual void PreSubclassWindow(void)
[通知] subclassing/unsubclassing functions.
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
[通知] for processing Windows messages.
virtual void OnClickButton(void)
[通知] クリック.
void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
[通知] メニュー描画.
COLORREF GetSelectColor(void) const
[取得] 選択色取得.
描画情報ボタンコントロール
void SetBitmapChangeTime(UINT ms)
[設定] ビットマップ切り替え時間設定.
LRESULT SendCommandMessage(CWnd *pCtrl, UINT cmd)
[処理] WM_COMMAND送信.
Definition: TnbMfcCommon.h:475
TNB Library
Definition: TnbDoxyTitle.txt:2
情報アクセスインターフェース.
Definition: TnbAccessor.h:74
描画情報インターフェース
Definition: TnbDrawable.h:37