xref: /MusicPlayer2/MusicPlayer2/CTabCtrlEx.cpp (revision 3f01865b94c96f8705736816f9994bfd2bf2f36b)
1 // CTabCtrlEx.cpp: 实现文件
2 //
3 
4 #include "stdafx.h"
5 #include "MusicPlayer2.h"
6 #include "CTabCtrlEx.h"
7 
8 
9 // CTabCtrlEx
10 
11 IMPLEMENT_DYNAMIC(CTabCtrlEx, CTabCtrl)
12 
13 CTabCtrlEx::CTabCtrlEx()
14 {
15 
16 }
17 
18 CTabCtrlEx::~CTabCtrlEx()
19 {
20 }
21 
22 void CTabCtrlEx::AddWindow(CWnd* pWnd, LPCTSTR lable_text)
23 {
24 	if (pWnd == nullptr || pWnd->GetSafeHwnd() == NULL)
25 		return;
26 
27     InsertItem(m_tab_list.size(), lable_text, m_tab_list.size());
28 
29 	pWnd->SetParent(this);
30 	pWnd->MoveWindow(m_tab_rect);
31 
32 	m_tab_list.push_back(pWnd);
33 }
34 
35 void CTabCtrlEx::SetCurTab(int index)
36 {
37     if (index < 0 || index >= static_cast<int>(m_tab_list.size()))
38         index = 0;
39 	SetCurSel(index);
40 
41 	int tab_size = m_tab_list.size();
42 	for (int i = 0; i < tab_size; i++)
43 	{
44 		if (i == index)
45 		{
46 			m_tab_list[i]->ShowWindow(SW_SHOW);
47 			m_tab_list[i]->SetFocus();
48 		}
49 		else
50 		{
51 			m_tab_list[i]->ShowWindow(SW_HIDE);
52 		}
53 	}
54 
55     CTabDlg* pTabWnd = dynamic_cast<CTabDlg*>(m_tab_list[index]);
56     if (pTabWnd != nullptr)
57         pTabWnd->OnTabEntered();
58 }
59 
60 CWnd* CTabCtrlEx::GetCurrentTab()
61 {
62     size_t cur_tab_index = GetCurSel();
63     if (cur_tab_index >= 0 && cur_tab_index < m_tab_list.size())
64     {
65         return m_tab_list[cur_tab_index];
66     }
67     return nullptr;
68 }
69 
70 void CTabCtrlEx::AdjustTabWindowSize()
71 {
72     CalSubWindowSize();
73     for (size_t i{}; i < m_tab_list.size(); i++)
74     {
75         m_tab_list[i]->MoveWindow(m_tab_rect);
76     }
77 }
78 
79 void CTabCtrlEx::CalSubWindowSize()
80 {
81     GetClientRect(m_tab_rect);
82     CRect rc_temp = m_tab_rect;
83     AdjustRect(FALSE, rc_temp);
84     int margin = rc_temp.left - m_tab_rect.left;
85     CRect rcTabItem;
86     GetItemRect(0, rcTabItem);
87     m_tab_rect.top += rcTabItem.Height() + margin;
88     m_tab_rect.left += margin;
89     m_tab_rect.bottom -= margin;
90     m_tab_rect.right -= margin;
91 }
92 
93 
94 BEGIN_MESSAGE_MAP(CTabCtrlEx, CTabCtrl)
95 	ON_NOTIFY_REFLECT(TCN_SELCHANGE, &CTabCtrlEx::OnTcnSelchange)
96     ON_WM_SIZE()
97 END_MESSAGE_MAP()
98 
99 
100 
101 // CTabCtrlEx 消息处理程序
102 
103 
104 
105 
106 void CTabCtrlEx::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
107 {
108 	// TODO: 在此添加控件通知处理程序代码
109 	int tab_selected = GetCurSel();
110 	SetCurTab(tab_selected);
111 
112 	*pResult = 0;
113 }
114 
115 
116 void CTabCtrlEx::PreSubclassWindow()
117 {
118 	// TODO: 在此添加专用代码和/或调用基类
119 
120 	//计算子窗口的位置
121     CalSubWindowSize();
122 
123 	CTabCtrl::PreSubclassWindow();
124 }
125 
126 
127 void CTabCtrlEx::OnSize(UINT nType, int cx, int cy)
128 {
129     CTabCtrl::OnSize(nType, cx, cy);
130 
131     // TODO: 在此处添加消息处理程序代码
132     AdjustTabWindowSize();
133 }
134