TNB Library
TnbMfcPagesCtrl.h
[詳解]
1#pragma once
11#include "TnbMfcCommon.h"
12#include "TnbSimpleVector.h"
13
14
15
16//TNB Library
17namespace TNB {
18namespace MFC {
19
20
21
69class CPagesCtrl : public CStatic
70{
71 DEFSUPER(CStatic);
72public:
73
75 CPagesCtrl(void) : m_currentIndex(-1)
76 {
77 }
78
87 template<typename TYP>
88 int AddItem(TYP* pWnd)
89 {
90 return AddItem(pWnd, TYP::IDD);
91 }
92
102 int AddItem(CDialog* pWnd, UINT idd)
103 {
104 CWnd* pParent = GetParent();
105 CDialog* P = pWnd;
106 if ( ::IsWindow(P->GetSafeHwnd()) )
107 {
108 ASSERT0( false, "AddItem", "既にクリエイトされているObjectが指定されました。" );
109 return -1;
110 }
111 if ( ! P->Create(idd, pParent) )
112 {
113 ASSERT0( false, "AddItem", "クリエイトに失敗しました。" );
114 return -1;
115 }
116 P->SetParent(pParent);
117 P->SetWindowPos(this, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
118 this->SetWindowPos(P, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
119 DWORD style = P->GetStyle();
120 if ( (style & WS_CHILD) == 0 )
121 {
122 ASSERT0( false, "AddItem", "ダイアログのリソースに、チャイルドのスタイルがありません。" );
123 P->DestroyWindow();
124 return -1;
125 }
126 P->ModifyStyleEx(0, WS_EX_CONTROLPARENT);
127 P->ModifyStyle(DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU, 0, SWP_FRAMECHANGED);
128 int r = m_apPages.GetSize();
129 m_apPages.Add(P);
130 m_ResizeAll();
131 return r;
132 }
133
141 int FindItem(HWND page) const
142 {
143 loop ( i, m_apPages.GetSize() )
144 {
145 if ( m_apPages[i]->GetSafeHwnd() == page )
146 {
147 return i;
148 }
149 }
150 return -1;
151 }
152
161 CWnd* GetWndItem(int nItem) const
162 {
163 if ( m_apPages.IsInRange(nItem) )
164 {
165 return m_apPages[nItem];
166 }
167 return NULL;
168 }
169
175 size_t GetItemCount(void) const
176 {
177 return m_apPages.GetSize();
178 }
179
186 int GetItemSel(void) const
187 {
188 return m_currentIndex;
189 }
190
198 CWnd* GetWndItemSel(void) const
199 {
200 return GetWndItem(m_currentIndex);
201 }
202
209 int SetItemSel(int nItem)
210 {
211 int r = m_currentIndex;
212 m_SetCurSel(nItem);
213 m_currentIndex = nItem;
214 return r;
215 }
216
223 int SetItemSel(HWND page)
224 {
225 return SetItemSel(FindItem(page));
226 }
227
234 bool DeleteItem(int nItem)
235 {
236 if ( m_apPages.IsInRange(nItem) )
237 {
238 m_apPages[nItem]->DestroyWindow();
239 m_apPages.Remove(nItem);
240 return true;
241 }
242 return false;
243 }
244
249 void DeleteAllItems(void)
250 {
251 loop ( i, m_apPages.GetSize() )
252 {
253 m_apPages[i]->DestroyWindow();
254 }
256 }
257
258protected:
259
261
267 virtual void PreSubclassWindow(void)
268 {
269 m_currentIndex = -1;
270 _super::ShowWindow(SW_HIDE);
271 _super::PreSubclassWindow();
272 }
273
283 virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
284 {
285 switch ( message )
286 {
287 case WM_SIZE:
288 m_ResizeAll();
289 break;
290 case WM_DESTROY:
292 break;
293 default:
294 break;
295 }
296 return _super::WindowProc(message, wParam, lParam);
297 }
298
299private:
300
301 int m_currentIndex;
302
304 void m_SetCurSel(int idx)
305 {
306 if ( m_apPages.IsInRange(idx) )
307 {
308 m_apPages[idx]->ShowWindow(SW_SHOW);
309 }
310 loop ( i, m_apPages.GetSize() )
311 {
312 if ( idx != ToInt(i) )
313 {
314 if ( m_apPages[i]->IsWindowVisible() )
315 {
316 m_apPages[i]->ShowWindow(SW_HIDE);
317 m_apPages[i]->SendMessage(WM_ACTIVATE, WA_INACTIVE, 0);
318 }
319 }
320 }
321 CWnd* pFocus = GetFocus();
322 if ( pFocus != NULL )
323 {
324 CWnd* P = pFocus->GetParent();
325 if ( P != NULL && ! P->IsWindowVisible() )
326 {
327 _super::SetFocus();
328 }
329 }
330 if ( m_apPages.IsInRange(idx) )
331 {
332 m_apPages[idx]->SendMessage(WM_ACTIVATE, WA_ACTIVE, 0);
333 }
334 }
336 void m_ResizeAll(void)
337 {
338 CRect r;
339 _super::GetWindowRect(&r);
340 _super::GetParent()->ScreenToClient(&r); // クライアント座標系に修正
341 loop ( i, m_apPages.GetSize() )
342 {
343 m_apPages[i]->MoveWindow(r.left, r.top, r.Width(), r.Height());
344 }
345 }
346};
347
348
349
350}; // MFC
351}; // TNB
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
MFCコントロール共通のヘッダ
簡易配列型情報管理関係のヘッダ
スタティックコントロール.
ウィンドウ管理.
BOOL SetWindowPos(const CWnd *pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags)
[設定] ウィンドウサイズポジション設定.
HWND GetSafeHwnd(void) const
[取得] ウィンドウハンドル取得.
void RemoveAll(void)
[削除] 空化
size_t GetSize(void) const
[取得] サイズ取得
bool Remove(INDEX index)
[削除] 要素一つ削除.
bool IsInRange(INDEX index) const
[確認] INDEXの有効確認.
INDEX Add(const TYP &t)
[追加] 要素一つ追加.
ページコントロール
bool DeleteItem(int nItem)
[削除] アイテム削除.
CPagesCtrl(void)
コンストラクタ
int SetItemSel(HWND page)
[選択] タブ選択.
int SetItemSel(int nItem)
[選択] アイテム選択.
int AddItem(CDialog *pWnd, UINT idd)
[追加] アイテム追加.
size_t GetItemCount(void) const
[取得] アイテム数取得.
CWnd * GetWndItem(int nItem) const
[取得] ウィンドウ取得.
int AddItem(TYP *pWnd)
[追加] アイテム追加.
CSimpleVectorT< CWnd * > m_apPages
ページウィンドウ群
virtual void PreSubclassWindow(void)
[通知] subclassing/unsubclassing functions.
int GetItemSel(void) const
[取得] 選択アイテム取得.
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
[通知] for processing Windows messages.
CWnd * GetWndItemSel(void) const
[取得] 選択アイテム取得.
int FindItem(HWND page) const
[検索] アイテム検索.
void DeleteAllItems(void)
[削除] 全アイテム削除.
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:367
TNB Library
Definition: TnbDoxyTitle.txt:2