xref: /MusicPlayer2/MusicPlayer2/CTabCtrlEx.cpp (revision 86e2c9c227ea58a4f87dda2d9ffa8cbe422b3071)
1bb1ccb84SZhong Yang // CTabCtrlEx.cpp: 实现文件
2bb1ccb84SZhong Yang //
3bb1ccb84SZhong Yang 
4bb1ccb84SZhong Yang #include "stdafx.h"
5bb1ccb84SZhong Yang #include "MusicPlayer2.h"
6bb1ccb84SZhong Yang #include "CTabCtrlEx.h"
7*86e2c9c2Slrisora #include "TabDlg.h"
8bb1ccb84SZhong Yang 
9bb1ccb84SZhong Yang 
10bb1ccb84SZhong Yang // CTabCtrlEx
11bb1ccb84SZhong Yang 
12bb1ccb84SZhong Yang IMPLEMENT_DYNAMIC(CTabCtrlEx, CTabCtrl)
13bb1ccb84SZhong Yang 
14bb1ccb84SZhong Yang CTabCtrlEx::CTabCtrlEx()
15bb1ccb84SZhong Yang {
16bb1ccb84SZhong Yang 
17bb1ccb84SZhong Yang }
18bb1ccb84SZhong Yang 
19bb1ccb84SZhong Yang CTabCtrlEx::~CTabCtrlEx()
20bb1ccb84SZhong Yang {
21bb1ccb84SZhong Yang }
22bb1ccb84SZhong Yang 
23bb1ccb84SZhong Yang void CTabCtrlEx::AddWindow(CWnd* pWnd, LPCTSTR lable_text)
24bb1ccb84SZhong Yang {
25bb1ccb84SZhong Yang 	if (pWnd == nullptr || pWnd->GetSafeHwnd() == NULL)
26bb1ccb84SZhong Yang 		return;
27bb1ccb84SZhong Yang 
284d5a4f39Szhongyang     InsertItem(m_tab_list.size(), lable_text, m_tab_list.size());
29bb1ccb84SZhong Yang 
30bb1ccb84SZhong Yang 	pWnd->SetParent(this);
31bb1ccb84SZhong Yang 	pWnd->MoveWindow(m_tab_rect);
32bb1ccb84SZhong Yang 
33bb1ccb84SZhong Yang 	m_tab_list.push_back(pWnd);
34bb1ccb84SZhong Yang }
35bb1ccb84SZhong Yang 
36bb1ccb84SZhong Yang void CTabCtrlEx::SetCurTab(int index)
37bb1ccb84SZhong Yang {
38804e3dc8SZhong Yang     if (index < 0 || index >= static_cast<int>(m_tab_list.size()))
39804e3dc8SZhong Yang         index = 0;
40b26f7c9eSZhong Yang 	SetCurSel(index);
41b26f7c9eSZhong Yang 
42bb1ccb84SZhong Yang 	int tab_size = m_tab_list.size();
43bb1ccb84SZhong Yang 	for (int i = 0; i < tab_size; i++)
44bb1ccb84SZhong Yang 	{
45bb1ccb84SZhong Yang 		if (i == index)
46bb1ccb84SZhong Yang 		{
47bb1ccb84SZhong Yang 			m_tab_list[i]->ShowWindow(SW_SHOW);
48bb1ccb84SZhong Yang 			m_tab_list[i]->SetFocus();
49bb1ccb84SZhong Yang 		}
50bb1ccb84SZhong Yang 		else
51bb1ccb84SZhong Yang 		{
52bb1ccb84SZhong Yang 			m_tab_list[i]->ShowWindow(SW_HIDE);
53bb1ccb84SZhong Yang 		}
54bb1ccb84SZhong Yang 	}
559a422c1dSZhong Yang 
569a422c1dSZhong Yang     CTabDlg* pTabWnd = dynamic_cast<CTabDlg*>(m_tab_list[index]);
579a422c1dSZhong Yang     if (pTabWnd != nullptr)
589a422c1dSZhong Yang         pTabWnd->OnTabEntered();
59bb1ccb84SZhong Yang }
60bb1ccb84SZhong Yang 
613dbe6911SZhong Yang CWnd* CTabCtrlEx::GetCurrentTab()
623dbe6911SZhong Yang {
634df46f80Slrisora     size_t cur_tab_index = GetCurSel();
643dbe6911SZhong Yang     if (cur_tab_index >= 0 && cur_tab_index < m_tab_list.size())
653dbe6911SZhong Yang     {
663dbe6911SZhong Yang         return m_tab_list[cur_tab_index];
673dbe6911SZhong Yang     }
683dbe6911SZhong Yang     return nullptr;
693dbe6911SZhong Yang }
703dbe6911SZhong Yang 
71c16fcfceSZhong Yang void CTabCtrlEx::AdjustTabWindowSize()
72c16fcfceSZhong Yang {
73c16fcfceSZhong Yang     CalSubWindowSize();
74c16fcfceSZhong Yang     for (size_t i{}; i < m_tab_list.size(); i++)
75c16fcfceSZhong Yang     {
76c16fcfceSZhong Yang         m_tab_list[i]->MoveWindow(m_tab_rect);
77c16fcfceSZhong Yang     }
78c16fcfceSZhong Yang }
79c16fcfceSZhong Yang 
803dbe6911SZhong Yang void CTabCtrlEx::CalSubWindowSize()
813dbe6911SZhong Yang {
823dbe6911SZhong Yang     GetClientRect(m_tab_rect);
83fabb643fSzhongyang     CRect rc_temp = m_tab_rect;
84fabb643fSzhongyang     AdjustRect(FALSE, rc_temp);
85fabb643fSzhongyang     int margin = rc_temp.left - m_tab_rect.left;
863dbe6911SZhong Yang     CRect rcTabItem;
873dbe6911SZhong Yang     GetItemRect(0, rcTabItem);
88fabb643fSzhongyang     m_tab_rect.top += rcTabItem.Height() + margin;
89fabb643fSzhongyang     m_tab_rect.left += margin;
90fabb643fSzhongyang     m_tab_rect.bottom -= margin;
91fabb643fSzhongyang     m_tab_rect.right -= margin;
923dbe6911SZhong Yang }
933dbe6911SZhong Yang 
94bb1ccb84SZhong Yang 
95bb1ccb84SZhong Yang BEGIN_MESSAGE_MAP(CTabCtrlEx, CTabCtrl)
96bb1ccb84SZhong Yang 	ON_NOTIFY_REFLECT(TCN_SELCHANGE, &CTabCtrlEx::OnTcnSelchange)
973dbe6911SZhong Yang     ON_WM_SIZE()
98bb1ccb84SZhong Yang END_MESSAGE_MAP()
99bb1ccb84SZhong Yang 
100bb1ccb84SZhong Yang 
101bb1ccb84SZhong Yang 
102bb1ccb84SZhong Yang // CTabCtrlEx 消息处理程序
103bb1ccb84SZhong Yang 
104bb1ccb84SZhong Yang 
105bb1ccb84SZhong Yang 
106bb1ccb84SZhong Yang 
107bb1ccb84SZhong Yang void CTabCtrlEx::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
108bb1ccb84SZhong Yang {
109bb1ccb84SZhong Yang 	// TODO: 在此添加控件通知处理程序代码
110bb1ccb84SZhong Yang 	int tab_selected = GetCurSel();
111bb1ccb84SZhong Yang 	SetCurTab(tab_selected);
112bb1ccb84SZhong Yang 
113bb1ccb84SZhong Yang 	*pResult = 0;
114bb1ccb84SZhong Yang }
115bb1ccb84SZhong Yang 
116bb1ccb84SZhong Yang 
117bb1ccb84SZhong Yang void CTabCtrlEx::PreSubclassWindow()
118bb1ccb84SZhong Yang {
119bb1ccb84SZhong Yang 	// TODO: 在此添加专用代码和/或调用基类
120bb1ccb84SZhong Yang 
121bb1ccb84SZhong Yang 	//计算子窗口的位置
1223dbe6911SZhong Yang     CalSubWindowSize();
123bb1ccb84SZhong Yang 
124bb1ccb84SZhong Yang 	CTabCtrl::PreSubclassWindow();
125bb1ccb84SZhong Yang }
1263dbe6911SZhong Yang 
1273dbe6911SZhong Yang 
1283dbe6911SZhong Yang void CTabCtrlEx::OnSize(UINT nType, int cx, int cy)
1293dbe6911SZhong Yang {
1303dbe6911SZhong Yang     CTabCtrl::OnSize(nType, cx, cy);
1313dbe6911SZhong Yang 
1323dbe6911SZhong Yang     // TODO: 在此处添加消息处理程序代码
133c16fcfceSZhong Yang     AdjustTabWindowSize();
1343dbe6911SZhong Yang }
135