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