TNB Library
TnbMfcPagesTabCtrl.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
50template<typename TAB = CTabCtrl>
51class CPagesTabCtrlT : public TAB
52{
53 DEFSUPER(TAB);
54public:
55
64 template<typename TYP>
65 int AddItem(LPCTSTR lpszName, TYP* pWnd)
66 {
67 return AddItem(lpszName, pWnd, TYP::IDD);
68 }
69
79 int AddItem(LPCTSTR lpszName, CDialog* pWnd, UINT idd)
80 {
81 CWnd* pParent = GetParent();
82 CDialog* P = pWnd;
83 if ( ::IsWindow(P->GetSafeHwnd()) )
84 {
85 ASSERT0( false, "AddItem", "既にクリエイトされているObjectが指定されました。" );
86 return -1;
87 }
88 if ( ! P->Create(idd, pParent) )
89 {
90 ASSERT0( false, "AddItem", "クリエイトに失敗しました。" );
91 return -1;
92 }
93 P->SetParent(pParent);
94 this->SetWindowPos(&wndBottom, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
95 P->SetWindowText(lpszName);
96 DWORD style = P->GetStyle();
97 if ( (style & WS_CHILD) == 0 )
98 {
99 ASSERT0( false, "AddItem", "ダイアログのリソースに、チャイルドのスタイルがありません。" );
100 P->DestroyWindow();
101 return -1;
102 }
103 P->ModifyStyleEx(0, WS_EX_CONTROLPARENT);
104 P->ModifyStyle(DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU, 0, SWP_FRAMECHANGED);
105 int i = _super::GetItemCount();
106 int r = _super::InsertItem(i, lpszName);
107 if ( r >= 0 )
108 {
109 m_apPages.Add(P);
110 int o = _super::GetCurSel();
111 if ( o < 0 )
112 {
113 o = 0;
114 }
115 _super::SetCurSel(o);
116 m_ResizeAll();
117 }
118 else
119 {
120 P->DestroyWindow();
121 }
122 return r;
123 }
124
132 int FindItem(HWND page) const
133 {
134 loop ( i, m_apPages.GetSize() )
135 {
136 if ( m_apPages[i]->GetSafeHwnd() == page )
137 {
138 return i;
139 }
140 }
141 return -1;
142 }
143
152 CWnd* GetWndItem(int nItem) const
153 {
154 if ( m_apPages.IsInRange(nItem) )
155 {
156 return m_apPages[nItem];
157 }
158 return NULL;
159 }
160
167 int SetCurSel(int nItem)
168 {
169 return _super::SetCurSel(nItem);
170 }
171
178 int SetCurSel(HWND page)
179 {
180 return _super::SetCurSel(FindItem(page));
181 }
182
189 int GetCurSel(void) const
190 {
191 return _super::GetCurSel();
192 }
193
201 CWnd* GetWndCurSel(void) const
202 {
203 return GetWndItem(_super::GetCurSel());
204 }
205
212 BOOL DeleteItem(int nItem)
213 {
214 if ( m_apPages.IsInRange(nItem) )
215 {
216 m_apPages[nItem]->DestroyWindow();
217 m_apPages.Remove(nItem);
218 return _super::DeleteItem(nItem);
219 }
220 return FALSE;
221 }
222
228 BOOL DeleteAllItems(void)
229 {
230 loop ( i, m_apPages.GetSize() )
231 {
232 if ( ::IsWindow(m_apPages[i]->GetSafeHwnd()) )
233 {
234 m_apPages[i]->DestroyWindow();
235 }
236 }
238 return _super::DeleteAllItems();
239 }
240
241protected:
242
244
250 virtual void PreSubclassWindow(void)
251 {
252 _super::PreSubclassWindow();
253 }
254
267 virtual BOOL OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* _pResult)
268 {
269 if ( message == WM_NOTIFY )
270 {
271 LPNMHDR lpNmHdr = reinterpret_cast<LPNMHDR>(lParam);
272 if ( lpNmHdr->hwndFrom == m_hWnd && lpNmHdr->code == TCN_SELCHANGE )
273 {
274 m_SetCurSel(_super::GetCurSel());
275 }
276 }
277 return _super::OnChildNotify(message, wParam, lParam, _pResult);
278 }
279
289 virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
290 {
291 switch ( message )
292 {
293 case TCM_SETCURSEL:
294 m_SetCurSel(wParam);
295 break;
296 case WM_MOVE:
297 m_ResizeAll();
298 break;
299 case WM_SIZE:
300 m_ResizeAll();
301 break;
302 case WM_DESTROY:
304 //DeleteAllItems();
305 break;
306 default:
307 break;
308 }
309 return _super::WindowProc(message, wParam, lParam);
310 }
311
312private:
314 void m_SetCurSel(int idx)
315 {
316 ASSERT( ToInt(m_apPages.GetSize()) == _super::GetItemCount() );
317 if ( m_apPages.IsInRange(idx) )
318 {
319 m_apPages[idx]->ShowWindow(SW_SHOW);
320 loop ( i, m_apPages.GetSize() )
321 {
322 if ( idx != ToInt(i) )
323 {
324 BOOL r = m_apPages[i]->IsWindowVisible();
325 m_apPages[i]->ShowWindow(SW_HIDE);
326 if ( r )
327 {
328 m_apPages[i]->SendMessage(WM_ACTIVATE, WA_INACTIVE, 0);
329 }
330 }
331 }
332 m_apPages[idx]->SendMessage(WM_ACTIVATE, WA_ACTIVE, 0);
333 m_apPages[idx]->SetFocus();
334 }
335 }
337 void m_ResizeAll(void)
338 {
339 CRect r;
340 _super::GetWindowRect(&r); // タブコントロールのウィンドウ領域(スクリーン座標系)
341 _super::GetParent()->ScreenToClient(&r); // クライアント座標系に修正
342 _super::AdjustRect(FALSE, &r); // ウィンドウ領域に基づき、表示部の領域に調整
343 loop ( i, m_apPages.GetSize() )
344 {
345 m_apPages[i]->MoveWindow(r.left, r.top, r.Width(), r.Height());
346 }
347 }
348 BOOL GetItem(int nItem, TCITEM* pTabCtrlItem) const;
349 BOOL SetItem(int nItem, TCITEM* pTabCtrlItem);
350 BOOL SetItemExtra(int nBytes);
351 BOOL InsertItem(int nItem);
352 void AdjustRect(BOOL bLarger, LPRECT lpRect);
353 void RemoveImage(int nImage);
354};
355
356
357
398{
399};
400
401
402
403}; // MFC
404}; // 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)
[追加] 要素一つ追加.
ページ付きタブコントロールテンプレート
int AddItem(LPCTSTR lpszName, CDialog *pWnd, UINT idd)
[追加] アイテム追加.
BOOL DeleteItem(int nItem)
[削除] アイテム削除.
virtual BOOL OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT *_pResult)
[通知] for notifications from parent
CWnd * GetWndItem(int nItem) const
[取得] ウィンドウ取得.
int AddItem(LPCTSTR lpszName, TYP *pWnd)
[追加] アイテム追加.
CSimpleVectorT< CWnd * > m_apPages
ページウィンドウ群
virtual void PreSubclassWindow(void)
[通知] subclassing/unsubclassing functions.
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
[通知] for processing Windows messages.
BOOL DeleteAllItems(void)
[削除] 全アイテム削除.
CWnd * GetWndCurSel(void) const
[取得] 選択ウィンドウ取得.
int FindItem(HWND page) const
[検索] アイテム検索.
int SetCurSel(HWND page)
[選択] タブ選択.
int GetCurSel(void) const
[取得] 選択アイテム取得.
int SetCurSel(int nItem)
[選択] タブ選択.
ページ付きタブコントロール
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:367
TNB Library
Definition: TnbDoxyTitle.txt:2