xref: /MusicPlayer2/MusicPlayer2/CTabCtrlEx.cpp (revision 00d4a43e0c8d78aa1969ffe63ae7be10baaaa75c)
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);
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 
56 CWnd* CTabCtrlEx::GetCurrentTab()
57 {
58     int cur_tab_index = GetCurSel();
59     if (cur_tab_index >= 0 && cur_tab_index < m_tab_list.size())
60     {
61         return m_tab_list[cur_tab_index];
62     }
63     return nullptr;
64 }
65 
66 void CTabCtrlEx::CalSubWindowSize()
67 {
68     GetClientRect(m_tab_rect);
69     CRect rcTabItem;
70     GetItemRect(0, rcTabItem);
71     m_tab_rect.top += rcTabItem.Height() + 4;
72     m_tab_rect.left += 4;
73     m_tab_rect.bottom -= 4;
74     m_tab_rect.right -= 4;
75 }
76 
77 
78 BEGIN_MESSAGE_MAP(CTabCtrlEx, CTabCtrl)
79 	ON_NOTIFY_REFLECT(TCN_SELCHANGE, &CTabCtrlEx::OnTcnSelchange)
80     ON_WM_SIZE()
81 END_MESSAGE_MAP()
82 
83 
84 
85 // CTabCtrlEx 消息处理程序
86 
87 
88 
89 
90 void CTabCtrlEx::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
91 {
92 	// TODO: 在此添加控件通知处理程序代码
93 	int tab_selected = GetCurSel();
94 	SetCurTab(tab_selected);
95 
96 	*pResult = 0;
97 }
98 
99 
100 void CTabCtrlEx::PreSubclassWindow()
101 {
102 	// TODO: 在此添加专用代码和/或调用基类
103 
104 	//计算子窗口的位置
105     CalSubWindowSize();
106 
107 	CTabCtrl::PreSubclassWindow();
108 }
109 
110 
111 void CTabCtrlEx::OnSize(UINT nType, int cx, int cy)
112 {
113     CTabCtrl::OnSize(nType, cx, cy);
114 
115     // TODO: 在此处添加消息处理程序代码
116     CalSubWindowSize();
117     for (size_t i{}; i < m_tab_list.size(); i++)
118     {
119         m_tab_list[i]->MoveWindow(m_tab_rect);
120     }
121 }
122