xref: /MusicPlayer2/MusicPlayer2/CTabCtrlEx.cpp (revision 804e3dc8c6c87d5a011ccfbf1090c5bfba930d86)
1bb1ccb84SZhong Yang // CTabCtrlEx.cpp: 实现文件
2bb1ccb84SZhong Yang //
3bb1ccb84SZhong Yang 
4bb1ccb84SZhong Yang #include "stdafx.h"
5bb1ccb84SZhong Yang #include "MusicPlayer2.h"
6bb1ccb84SZhong Yang #include "CTabCtrlEx.h"
7bb1ccb84SZhong Yang 
8bb1ccb84SZhong Yang 
9bb1ccb84SZhong Yang // CTabCtrlEx
10bb1ccb84SZhong Yang 
11bb1ccb84SZhong Yang IMPLEMENT_DYNAMIC(CTabCtrlEx, CTabCtrl)
12bb1ccb84SZhong Yang 
13bb1ccb84SZhong Yang CTabCtrlEx::CTabCtrlEx()
14bb1ccb84SZhong Yang {
15bb1ccb84SZhong Yang 
16bb1ccb84SZhong Yang }
17bb1ccb84SZhong Yang 
18bb1ccb84SZhong Yang CTabCtrlEx::~CTabCtrlEx()
19bb1ccb84SZhong Yang {
20bb1ccb84SZhong Yang }
21bb1ccb84SZhong Yang 
22bb1ccb84SZhong Yang void CTabCtrlEx::AddWindow(CWnd* pWnd, LPCTSTR lable_text)
23bb1ccb84SZhong Yang {
24bb1ccb84SZhong Yang 	if (pWnd == nullptr || pWnd->GetSafeHwnd() == NULL)
25bb1ccb84SZhong Yang 		return;
26bb1ccb84SZhong Yang 
27bb1ccb84SZhong Yang 	InsertItem(m_tab_list.size(), lable_text);
28bb1ccb84SZhong Yang 
29bb1ccb84SZhong Yang 	pWnd->SetParent(this);
30bb1ccb84SZhong Yang 	pWnd->MoveWindow(m_tab_rect);
31bb1ccb84SZhong Yang 
32bb1ccb84SZhong Yang 	m_tab_list.push_back(pWnd);
33bb1ccb84SZhong Yang }
34bb1ccb84SZhong Yang 
35bb1ccb84SZhong Yang void CTabCtrlEx::SetCurTab(int index)
36bb1ccb84SZhong Yang {
37*804e3dc8SZhong Yang     if (index < 0 || index >= static_cast<int>(m_tab_list.size()))
38*804e3dc8SZhong Yang         index = 0;
39b26f7c9eSZhong Yang 	SetCurSel(index);
40b26f7c9eSZhong Yang 
41bb1ccb84SZhong Yang 	int tab_size = m_tab_list.size();
42bb1ccb84SZhong Yang 	for (int i = 0; i < tab_size; i++)
43bb1ccb84SZhong Yang 	{
44bb1ccb84SZhong Yang 		if (i == index)
45bb1ccb84SZhong Yang 		{
46bb1ccb84SZhong Yang 			m_tab_list[i]->ShowWindow(SW_SHOW);
47bb1ccb84SZhong Yang 			m_tab_list[i]->SetFocus();
48bb1ccb84SZhong Yang 		}
49bb1ccb84SZhong Yang 		else
50bb1ccb84SZhong Yang 		{
51bb1ccb84SZhong Yang 			m_tab_list[i]->ShowWindow(SW_HIDE);
52bb1ccb84SZhong Yang 		}
53bb1ccb84SZhong Yang 	}
54bb1ccb84SZhong Yang }
55bb1ccb84SZhong Yang 
563dbe6911SZhong Yang CWnd* CTabCtrlEx::GetCurrentTab()
573dbe6911SZhong Yang {
583dbe6911SZhong Yang     int cur_tab_index = GetCurSel();
593dbe6911SZhong Yang     if (cur_tab_index >= 0 && cur_tab_index < m_tab_list.size())
603dbe6911SZhong Yang     {
613dbe6911SZhong Yang         return m_tab_list[cur_tab_index];
623dbe6911SZhong Yang     }
633dbe6911SZhong Yang     return nullptr;
643dbe6911SZhong Yang }
653dbe6911SZhong Yang 
663dbe6911SZhong Yang void CTabCtrlEx::CalSubWindowSize()
673dbe6911SZhong Yang {
683dbe6911SZhong Yang     GetClientRect(m_tab_rect);
693dbe6911SZhong Yang     CRect rcTabItem;
703dbe6911SZhong Yang     GetItemRect(0, rcTabItem);
713dbe6911SZhong Yang     m_tab_rect.top += rcTabItem.Height() + 4;
723dbe6911SZhong Yang     m_tab_rect.left += 4;
733dbe6911SZhong Yang     m_tab_rect.bottom -= 4;
743dbe6911SZhong Yang     m_tab_rect.right -= 4;
753dbe6911SZhong Yang }
763dbe6911SZhong Yang 
77bb1ccb84SZhong Yang 
78bb1ccb84SZhong Yang BEGIN_MESSAGE_MAP(CTabCtrlEx, CTabCtrl)
79bb1ccb84SZhong Yang 	ON_NOTIFY_REFLECT(TCN_SELCHANGE, &CTabCtrlEx::OnTcnSelchange)
803dbe6911SZhong Yang     ON_WM_SIZE()
81bb1ccb84SZhong Yang END_MESSAGE_MAP()
82bb1ccb84SZhong Yang 
83bb1ccb84SZhong Yang 
84bb1ccb84SZhong Yang 
85bb1ccb84SZhong Yang // CTabCtrlEx 消息处理程序
86bb1ccb84SZhong Yang 
87bb1ccb84SZhong Yang 
88bb1ccb84SZhong Yang 
89bb1ccb84SZhong Yang 
90bb1ccb84SZhong Yang void CTabCtrlEx::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
91bb1ccb84SZhong Yang {
92bb1ccb84SZhong Yang 	// TODO: 在此添加控件通知处理程序代码
93bb1ccb84SZhong Yang 	int tab_selected = GetCurSel();
94bb1ccb84SZhong Yang 	SetCurTab(tab_selected);
95bb1ccb84SZhong Yang 
96bb1ccb84SZhong Yang 	*pResult = 0;
97bb1ccb84SZhong Yang }
98bb1ccb84SZhong Yang 
99bb1ccb84SZhong Yang 
100bb1ccb84SZhong Yang void CTabCtrlEx::PreSubclassWindow()
101bb1ccb84SZhong Yang {
102bb1ccb84SZhong Yang 	// TODO: 在此添加专用代码和/或调用基类
103bb1ccb84SZhong Yang 
104bb1ccb84SZhong Yang 	//计算子窗口的位置
1053dbe6911SZhong Yang     CalSubWindowSize();
106bb1ccb84SZhong Yang 
107bb1ccb84SZhong Yang 	CTabCtrl::PreSubclassWindow();
108bb1ccb84SZhong Yang }
1093dbe6911SZhong Yang 
1103dbe6911SZhong Yang 
1113dbe6911SZhong Yang void CTabCtrlEx::OnSize(UINT nType, int cx, int cy)
1123dbe6911SZhong Yang {
1133dbe6911SZhong Yang     CTabCtrl::OnSize(nType, cx, cy);
1143dbe6911SZhong Yang 
1153dbe6911SZhong Yang     // TODO: 在此处添加消息处理程序代码
1163dbe6911SZhong Yang     CalSubWindowSize();
1173dbe6911SZhong Yang     for (size_t i{}; i < m_tab_list.size(); i++)
1183dbe6911SZhong Yang     {
1193dbe6911SZhong Yang         m_tab_list[i]->MoveWindow(m_tab_rect);
1203dbe6911SZhong Yang     }
1213dbe6911SZhong Yang }
122