TNB Library
TnbFlowLayout.h
[詳解]
1#pragma once
11#include "TnbSimpleVector.h"
12#include "TnbLayout.h"
13
14
15
16//TNB Library
17namespace TNB
18{
19
20
21
75{
76 DEFSUPER(CAbstractLayout);
77public:
78
80 CFlowLayout(void) : m_hLocation(LEFT)
81 {
82 m_params = new CParamVector();
83 }
84
91 {
92 m_hLocation = hloc;
93 }
94
101 CFlowLayout& Add(const ILayout& layout, ELocation vloc = DEFAULT)
102 {
103 m_params->Add(TParam(vloc, DEFAULT, layout));
104 return *this;
105 }
106
112 virtual ILayout* Clone(void) const
113 {
114 CFlowLayout* P = new CFlowLayout();
115 *P = *this;
116 return P;
117 }
118
127 virtual bool GetMinimumSize(SIZE& _size) const
128 {
129 _size.cx = 0;
130 _size.cy = 0;
131 loop ( item, m_params->GetSize() )
132 {
133 TParam& pa = m_params->At(item);
134 SIZE sz;
135 if ( ! pa.pLayout->GetSize(sz) )
136 {
137 return false;
138 }
139 _size.cx = max(_size.cx, sz.cx);
140 }
141 AddMargnSize(_size);
142 return true;
143 }
144
152 int GetMinimumHeight(size_t width) const
153 {
154 CSimpleVectorT<POINT> lineNum; // ライン毎情報。 X がアイテム数、 Y のHIWORDが高さ、LOWORDが幅
155 CSimpleVectorT<SIZE> sizes; // アイテム毎情報。
156 int h = m_Calc(lineNum, sizes, width);
157 if ( h >= 0 )
158 {
159 h += m_margn.top + m_margn.bottom;
160 }
161 return h;
162 }
163
172 virtual void Decide(int x, int y, WPARAM wParam, LPARAM lParam)
173 {
174 if ( m_params.IsNull() )
175 {
176 return;
177 }
178 // 表示範囲
179 int clientWidth = m_layoutSize.cx - m_margn.left - m_margn.right;
180 // 全アイテムの大きさを取得
181 CSimpleVectorT<POINT> lineNum; // ライン毎情報。 X がアイテム数、 Y のHIWORDが高さ、LOWORDが幅
182 CSimpleVectorT<SIZE> sizes; // アイテム毎情報。
183 if ( m_Calc(lineNum, sizes, clientWidth) < 0 )
184 {
185 return;
186 }
187 // ライン毎の処理
188 int item = 0;
189 int yy = m_margn.top;
190 loop ( line, lineNum.GetSize() )
191 {
192 int hh = LOWORD(lineNum[line].y);
193 int xx = (clientWidth - HIWORD(lineNum[line].y));
194 switch ( m_hLocation )
195 {
196 case LEFT:
197 xx = 0;
198 break;
199 case CENTER:
200 case DEFAULT:
201 if ( xx < 0 ) { xx = 0; }
202 xx /= 2;
203 break;
204 }
205 xx += m_margn.left;
206 loop ( i, lineNum[line].x )
207 {
208 TParam& pa = m_params->At(item);
209 SIZE& sz = sizes[item];
210 HorizontalItemDecide(pa.pLayout, x, xx, sz.cx, LEFT, wParam, lParam);
211 VerticalItemDecide(pa.pLayout, y, yy, sz.cy, pa.verticalLocate, wParam, lParam);
212 item++;
213 xx += sz.cx + m_gapSize.cx;
214 }
215 yy += m_gapSize.cy + hh;
216 }
217 }
218
219private:
220
221 // _lineNum ライン毎情報。 X がアイテム数、 Y のHIWORDが高さ、LOWORDが幅
222 // _sizes アイテム毎情報。
223 int m_Calc(CSimpleVectorT<POINT>& _lineNum, CSimpleVectorT<SIZE>& _sizes, size_t clientWidth) const
224 {
225 size_t itemNum = m_params->GetSize();
226 _sizes.SetSize(itemNum);
227 _lineNum.RemoveAll();
228 int height = 0;
229 int im = 0;
230 int h = 0;
231 int w = 0;
232 loop ( item, itemNum )
233 {
234 TParam& pa = m_params->At(item);
235 SIZE& sz = _sizes[item];
236 if ( ! pa.pLayout->GetSize(sz) )
237 {
238 return -1;
239 }
240 if ( im > 0 && w + sz.cx + m_gapSize.cx > ToInt(clientWidth) )
241 {
242 // 幅を超えた
243 POINT p = { im, MAKELONG(h, w) };
244 height += h;
245 if ( _lineNum.GetSize() != 0 )
246 {
247 height += m_gapSize.cy;
248 }
249 _lineNum.Add(p);
250 im = 0;
251 h = 0;
252 w = 0;
253 }
254 w += sz.cx;
255 if ( im > 0 )
256 {
257 w += m_gapSize.cx;
258 }
259 h = max(h, sz.cy);
260 im++;
261 }
262 if ( im > 0 )
263 {
264 // 幅を超えた
265 POINT p = { im, MAKELONG(h, w) };
266 height += h;
267 if ( _lineNum.GetSize() != 0 )
268 {
269 height += m_gapSize.cy;
270 }
271 _lineNum.Add(p);
272 }
273 return height;
274 }
275
276 typedef CSimpleVectorT<TParam> CParamVector;
278 ELocation m_hLocation;
279};
280
281
282
283}; // TNB
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
レイアウト関係のヘッダ
簡易配列型情報管理関係のヘッダ
レイアウトアイテム抽象クラス.
Definition: TnbLayout.h:194
ELocation
レイアウトアイテム配置方法.
Definition: TnbLayout.h:204
@ DEFAULT
横方向は左寄せ、縦方向は中央
Definition: TnbLayout.h:205
@ LEFT
左寄せ(横方向用)
Definition: TnbLayout.h:210
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
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
RECT m_margn
外周のマージン
Definition: TnbLayout.h:325
フローレイアウトアイテムクラス.
Definition: TnbFlowLayout.h:75
void SetLineLocation(ELocation hloc=LEFT)
[設定] 配置設定.
Definition: TnbFlowLayout.h:90
virtual bool GetMinimumSize(SIZE &_size) const
[取得] 最小サイズ取得.
CFlowLayout(void)
コンストラクタ
Definition: TnbFlowLayout.h:80
int GetMinimumHeight(size_t width) const
[取得] 最小高さサイズ取得.
virtual ILayout * Clone(void) const
[作成] クローン作成.
CFlowLayout & Add(const ILayout &layout, ELocation vloc=DEFAULT)
[設定] アイテム追加.
virtual void Decide(int x, int y, WPARAM wParam, LPARAM lParam)
[処理] 決定.
ポインタ型ハンドルテンプレート
void RemoveAll(void)
[削除] 空化
size_t GetSize(void) const
[取得] サイズ取得
void SetSize(size_t s)
[設定] サイズ設定
INDEX Add(const TYP &t)
[追加] 要素一つ追加.
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:367
TNB Library
Definition: TnbDoxyTitle.txt:2
管理パラメータ型
Definition: TnbLayout.h:307
ELocation verticalLocate
アイテムの垂直配置種
Definition: TnbLayout.h:309
ILayout::Ptr pLayout
レイアウトアイテム
Definition: TnbLayout.h:310
レイアウトインターフェース.
Definition: TnbLayout.h:34
virtual bool GetSize(SIZE &_size) const =0
[取得] サイズ取得.