source: trunk/src/HaliteTabCtrl.hpp @ 445

Revision 445, 2.3 KB checked in by Eoin, 12 years ago (diff)

The preview snapshot.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2007.
3// Distributed under the Boost Software License, Version 1.0.
4//    (See accompanying file LICENSE_1_0.txt or copy at
5//          http://www.boost.org/LICENSE_1_0.txt)
6
7#pragma once
8
9#include "stdAfx.hpp"
10#include "HaliteTabPage.hpp"
11
12class CHalTabCtrl : 
13        public CWindowImpl<CHalTabCtrl, CTabCtrl>,
14        public CMessageFilter
15{
16        struct CHalTabPage
17        {
18                CHalTabPage() :
19                        hWnd(0),
20                        msgFilter(NULL)
21                {}
22
23                template <class T>
24                CHalTabPage(CHalTabPageImpl<T>& tabPage) :
25                        hWnd(tabPage),
26                        msgFilter(&tabPage)
27                {}
28
29                HWND hWnd;
30                WTL::CMessageFilter* msgFilter;
31        };
32
33public:
34        CHalTabCtrl() :
35                currentPage_(0)
36        {}
37
38    BEGIN_MSG_MAP_EX(CHalTabCtrl)
39                MSG_WM_SIZE(OnSize)
40
41                REFLECTED_NOTIFY_CODE_HANDLER_EX(TCN_SELCHANGE, OnSelChange)
42
43        DEFAULT_REFLECTION_HANDLER()
44    END_MSG_MAP()
45
46        virtual BOOL PreTranslateMessage(MSG* pMsg)
47        {
48                if (::IsWindow(m_hWnd))
49                {
50                        assert(pages_[GetCurSel()].msgFilter);
51               
52                        return pages_[GetCurSel()].msgFilter->PreTranslateMessage(pMsg);
53                }
54
55                return false;
56        }
57
58        void Attach(HWND hWndNew)
59        {
60                ATLASSERT(::IsWindow(hWndNew));
61        CWindowImpl<CHalTabCtrl, CTabCtrl>::SubclassWindow(hWndNew);
62        }
63
64        void SetCurrentPage(unsigned index)
65        {
66                if (currentPage_)
67                        ::ShowWindow(currentPage_, SW_HIDE);
68
69                if (!pages_.empty())
70                {
71                        currentPage_ = pages_[index].hWnd;
72                        ::ShowWindow(currentPage_, SW_SHOW);
73
74                        RECT rect;
75                        GetClientRect(&rect);
76                        AdjustRect(false, &rect);
77
78                        ::SetWindowPos(currentPage_, HWND_TOP, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, 0);
79                }
80        }
81
82        LRESULT OnSelChange(LPNMHDR lpHdr)
83        {
84                SetCurrentPage(GetCurSel());
85
86                return 0;
87        }
88
89        void OnSize(UINT, CSize)
90        {
91                CRect rect;
92                GetClientRect(&rect);
93                AdjustRect(false, &rect);
94
95                ::MoveWindow(currentPage_,  rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, true);
96        }
97
98        template <class T>
99        void AddPage(CHalTabPageImpl<T>& tabPage, std::wstring wndText)
100        {
101                TCITEM tie = { TCIF_TEXT, 0, 0, const_cast<wchar_t*>(wndText.c_str()), 0, -1, 0 };
102                InsertItem(pages_.size(), &tie);
103
104                pages_.push_back(CHalTabPage(tabPage));
105        }
106
107        HWND GetCurrentPage() const     { return currentPage_; }
108
109protected:
110        std::vector<CHalTabPage> pages_;
111        HWND currentPage_;
112};
Note: See TracBrowser for help on using the repository browser.