TNB Library
TnbLayout.h
[詳解]
1#pragma once
11#include "TnbPointerHandle.h"
12
13
14
15//TNB Library
16namespace TNB
17{
18
19
20
33struct ILayout
34{
36 virtual ~ILayout(void) {}
37
43 virtual ILayout* Clone(void) const = 0;
44
52 virtual bool GetSize(SIZE& _size) const = 0;
53
61 virtual bool GetMinimumSize(SIZE& _size) const = 0;
62
70 virtual bool Resize(const SIZE& size) = 0;
71
80 virtual void Decide(int x, int y, WPARAM wParam, LPARAM lParam) = 0;
81
84};
85
86
87
98class CLayoutSpacer : public ILayout
99{
100 DEFSUPER(ILayout);
101public:
102
108 CLayoutSpacer(int cx = 0, int cy = 0)
109 {
110 m_size.cx = cx;
111 m_size.cy = cy;
112 }
113
119 virtual ILayout* Clone(void) const
120 {
121 return new CLayoutSpacer(m_size.cx, m_size.cy);
122 }
123
131 virtual bool GetSize(SIZE& _size) const
132 {
133 _size = m_size;
134 return true;
135 }
136
144 virtual bool GetMinimumSize(SIZE& _size) const
145 {
146 return GetSize(_size);
147 }
148
156 virtual bool Resize(const SIZE& size)
157 {
158 m_size = size;
159 return true;
160 }
161
170 virtual void Decide(int x, int y, WPARAM wParam, LPARAM lParam)
171 {
172 }
173
174private:
175 SIZE m_size;
176};
177
178
179
194{
195 DEFSUPER(ILayout);
196public:
197
204 {
212/* EL_Default, ///< 横方向は左寄せ、縦方向は中央
213 EL_Top, ///< 上寄せ(縦方向用)
214 EL_Center, ///< 中央
215 EL_Bottom, ///< 下寄せ(縦方向用)
216 EL_Adjust, ///< 調整(Resize出来ない場合中央)
217 EL_Left = EL_Top, ///< 左寄せ(横方向用)
218 EL_Right = EL_Bottom, ///< 右寄せ(横方向用)
219*/ };
220
223 {
226 ::SetRectEmpty(&m_margn);
227 }
228
233 void SetMargnSize(const RECT& rc)
234 {
235 m_margn = rc;
236 CalcScale(m_margn);
237 }
238
243 void SetMargnSize(int mg)
244 {
245 ::SetRect(&m_margn, mg, mg, mg, mg);
246 CalcScale(m_margn);
247 }
248
253 void SetGapSize(const SIZE& size)
254 {
255 m_gapSize = size;
256 CalcScale(m_gapSize);
257 }
258
263 void SetGapSize(int size)
264 {
265 m_gapSize.cx = CalcScaleX(size);
266 m_gapSize.cy = CalcScaleY(size);
267 }
268
276 virtual bool GetSize(SIZE& _size) const
277 {
278 if ( ! m_isValidLayoutSize )
279 {
281 {
282 return false;
283 }
284 m_isValidLayoutSize = true;
285 }
286 _size = m_layoutSize;
287 return true;
288 }
289
297 virtual bool Resize(const SIZE& size)
298 {
299 m_layoutSize = size;
300 m_isValidLayoutSize = true;
301 return true;
302 }
303
304protected:
306 struct TParam
307 {
312 TParam(void)
313 {}
319 TParam(ELocation hloc, ELocation vloc, const ILayout& lay)
320 : horizontalLocate(hloc), verticalLocate(vloc), pLayout(lay.Clone())
321 {}
322 };
323 mutable bool m_isValidLayoutSize;
324 mutable SIZE m_layoutSize;
325 RECT m_margn;
327
338 void HorizontalItemDecide(ILayout* pLayout, INT_PTR x, INT_PTR xx, INT_PTR width, ELocation loc, WPARAM wParam, LPARAM lParam)
339 {
340 SIZE sz;
341 if ( x < 0 || pLayout == NULL || ! pLayout->GetSize(sz) )
342 {
343 return;
344 }
345 INT_PTR w = width - sz.cx;
346 switch ( loc )
347 {
348 case DEFAULT: // デフォルト
349 case LEFT: // 左寄せ
350 w = 0;
351 break;
352 case RIGHT: // 右寄せ
353 break;
354 case ADJUST: // 調整(Resize出来ない場合中央)
355 sz.cx = ToInt(width);
356 if ( pLayout->Resize(sz) )
357 {
358 w = 0;
359 break;
360 }
361 //以下に続く
362 case CENTER: // 中央
363 w /= 2;
364 break;
365 }
366 pLayout->Decide(ToInt(x + xx + w), -1, wParam, lParam);
367 }
368
379 void VerticalItemDecide(ILayout* pLayout, INT_PTR y, INT_PTR yy, INT_PTR height, ELocation loc, WPARAM wParam, LPARAM lParam)
380 {
381 SIZE sz;
382 if ( y < 0 || pLayout == NULL || ! pLayout->GetSize(sz) )
383 {
384 return;
385 }
386 INT_PTR w = height - sz.cy;
387 switch ( loc )
388 {
389 case TOP: // 左寄せ
390 w = 0;
391 break;
392 case BOTTOM: // 右寄せ
393 break;
394 case ADJUST: // 調整(Resize出来ない場合中央)
395 sz.cy = ToInt(height);
396 if ( pLayout->Resize(sz) )
397 {
398 w = 0;
399 break;
400 }
401 //以下に続く
402 case CENTER: // 中央
403 case DEFAULT: // デフォルト
404 w /= 2;
405 break;
406 }
407 pLayout->Decide(-1, ToInt(y + yy + w), wParam, lParam);
408 }
409
414 void GetMargnSize(SIZE& _size) const
415 {
416 _size.cx = m_margn.left + m_margn.right; //両端のマージン
417 _size.cy = m_margn.top + m_margn.bottom; //両端のマージン
418 }
419
425 void AddMargnSize(SIZE& _size) const
426 {
427 _size.cx += m_margn.left + m_margn.right; //両端のマージン
428 _size.cy += m_margn.top + m_margn.bottom; //両端のマージン
429 }
430
438 void AddChinkSize(SIZE& _size, size_t cx, size_t cy) const
439 {
440 AddMargnSize(_size);
441 if ( cx > 0 )
442 {
443 _size.cx += static_cast<LONG>(m_gapSize.cx * (cx - 1)); //アイテム間のサイズ
444 }
445 if ( cy > 0 )
446 {
447 _size.cy += static_cast<LONG>(m_gapSize.cy * (cy - 1)); //アイテム間のサイズ
448 }
449 }
450};
451
452
453
454}; // TNB
ポインタハンドル関係のヘッダ
レイアウトアイテム抽象クラス.
Definition: TnbLayout.h:194
ELocation
レイアウトアイテム配置方法.
Definition: TnbLayout.h:204
@ TOP
上寄せ(縦方向用)
Definition: TnbLayout.h:206
@ DEFAULT
横方向は左寄せ、縦方向は中央
Definition: TnbLayout.h:205
@ BOTTOM
下寄せ(縦方向用)
Definition: TnbLayout.h:208
@ LEFT
左寄せ(横方向用)
Definition: TnbLayout.h:210
@ RIGHT
右寄せ(横方向用)
Definition: TnbLayout.h:211
@ ADJUST
調整(Resize出来ない場合中央)
Definition: TnbLayout.h:209
CAbstractLayout(void)
コンストラクタ
Definition: TnbLayout.h:222
void GetMargnSize(SIZE &_size) const
[取得] マージンサイズ取得.
Definition: TnbLayout.h:414
void AddMargnSize(SIZE &_size) const
[加算] マージンサイズ加算.
Definition: TnbLayout.h:425
void HorizontalItemDecide(ILayout *pLayout, INT_PTR x, INT_PTR xx, INT_PTR width, ELocation loc, WPARAM wParam, LPARAM lParam)
[設定] 水平方向アイテム決定.
Definition: TnbLayout.h:338
void SetMargnSize(const RECT &rc)
[設定] 外周マージン設定
Definition: TnbLayout.h:233
SIZE m_gapSize
各アイテム間のギャップ(縦、横)
Definition: TnbLayout.h:326
SIZE m_layoutSize
レイアウト全体サイズ(縦、横)
Definition: TnbLayout.h:324
void VerticalItemDecide(ILayout *pLayout, INT_PTR y, INT_PTR yy, INT_PTR height, ELocation loc, WPARAM wParam, LPARAM lParam)
[設定] 垂直方向アイテム決定.
Definition: TnbLayout.h:379
virtual bool Resize(const SIZE &size)
[設定] サイズ設定.
Definition: TnbLayout.h:297
void SetGapSize(int size)
[設定] 各アイテム間のギャップ設定
Definition: TnbLayout.h:263
void SetMargnSize(int mg)
[設定] 外周マージン設定
Definition: TnbLayout.h:243
bool m_isValidLayoutSize
レイアウト全体サイズの設定の有効フラグ
Definition: TnbLayout.h:323
void SetGapSize(const SIZE &size)
[設定] 各アイテム間のギャップ設定
Definition: TnbLayout.h:253
void AddChinkSize(SIZE &_size, size_t cx, size_t cy) const
[加算] 隙間サイズ加算.
Definition: TnbLayout.h:438
virtual bool GetSize(SIZE &_size) const
[取得] サイズ取得.
Definition: TnbLayout.h:276
RECT m_margn
外周のマージン
Definition: TnbLayout.h:325
レイアウトスペーサー.
Definition: TnbLayout.h:99
virtual bool GetMinimumSize(SIZE &_size) const
[取得] 最小サイズ取得.
Definition: TnbLayout.h:144
virtual ILayout * Clone(void) const
[作成] クローン作成.
Definition: TnbLayout.h:119
virtual void Decide(int x, int y, WPARAM wParam, LPARAM lParam)
[処理] 決定.
Definition: TnbLayout.h:170
CLayoutSpacer(int cx=0, int cy=0)
コンストラクタ
Definition: TnbLayout.h:108
virtual bool Resize(const SIZE &size)
[設定] サイズ設定.
Definition: TnbLayout.h:156
virtual bool GetSize(SIZE &_size) const
[取得] サイズ取得.
Definition: TnbLayout.h:131
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:367
void Zero(V &value)
[設定] ゼロクリア.
Definition: TnbDef.h:399
TNB Library
Definition: TnbDoxyTitle.txt:2
管理パラメータ型
Definition: TnbLayout.h:307
ELocation horizontalLocate
アイテムの水平配置種
Definition: TnbLayout.h:308
ELocation verticalLocate
アイテムの垂直配置種
Definition: TnbLayout.h:309
TParam(ELocation hloc, ELocation vloc, const ILayout &lay)
コンストラクタ
Definition: TnbLayout.h:319
ILayout::Ptr pLayout
レイアウトアイテム
Definition: TnbLayout.h:310
TParam(void)
コンストラクタ
Definition: TnbLayout.h:312
レイアウトインターフェース.
Definition: TnbLayout.h:34
virtual bool Resize(const SIZE &size)=0
[設定] サイズ設定.
CPointerHandleT< ILayout > Ptr
ポインタハンドル型宣言
Definition: TnbLayout.h:83
virtual bool GetMinimumSize(SIZE &_size) const =0
[取得] 最小サイズ取得.
virtual bool GetSize(SIZE &_size) const =0
[取得] サイズ取得.
virtual void Decide(int x, int y, WPARAM wParam, LPARAM lParam)=0
[処理] 決定.
virtual ILayout * Clone(void) const =0
[作成] クローン作成.
virtual ~ILayout(void)
デストラクタ
Definition: TnbLayout.h:36