xref: /MusicPlayer2/MusicPlayer2/CTabCtrlEx.cpp (revision f801921613aae1d8838ee0d4bc8ae60449cd0863)
1bb1ccb84SZhong Yang // CTabCtrlEx.cpp: 实现文件
2bb1ccb84SZhong Yang //
3bb1ccb84SZhong Yang 
4bb1ccb84SZhong Yang #include "stdafx.h"
5bb1ccb84SZhong Yang #include "MusicPlayer2.h"
6bb1ccb84SZhong Yang #include "CTabCtrlEx.h"
786e2c9c2Slrisora #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 
23ccb67e16Slrisora void CTabCtrlEx::AddWindow(CWnd* pWnd, LPCTSTR lable_text, IconMgr::IconType icon_type)
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);
34ccb67e16Slrisora     if (icon_type != IconMgr::IconType::IT_NO_ICON)
35ccb67e16Slrisora         m_icon_list.push_back(icon_type);
36bb1ccb84SZhong Yang }
37bb1ccb84SZhong Yang 
38bb1ccb84SZhong Yang void CTabCtrlEx::SetCurTab(int index)
39bb1ccb84SZhong Yang {
40804e3dc8SZhong Yang     if (index < 0 || index >= static_cast<int>(m_tab_list.size()))
41804e3dc8SZhong Yang         index = 0;
42b26f7c9eSZhong Yang 	SetCurSel(index);
43b26f7c9eSZhong Yang 
44bb1ccb84SZhong Yang 	int tab_size = m_tab_list.size();
45bb1ccb84SZhong Yang 	for (int i = 0; i < tab_size; i++)
46bb1ccb84SZhong Yang 	{
47bb1ccb84SZhong Yang 		if (i == index)
48bb1ccb84SZhong Yang 		{
49bb1ccb84SZhong Yang 			m_tab_list[i]->ShowWindow(SW_SHOW);
50bb1ccb84SZhong Yang 			m_tab_list[i]->SetFocus();
51bb1ccb84SZhong Yang 		}
52bb1ccb84SZhong Yang 		else
53bb1ccb84SZhong Yang 		{
54bb1ccb84SZhong Yang 			m_tab_list[i]->ShowWindow(SW_HIDE);
55bb1ccb84SZhong Yang 		}
56bb1ccb84SZhong Yang 	}
579a422c1dSZhong Yang 
589a422c1dSZhong Yang     CTabDlg* pTabWnd = dynamic_cast<CTabDlg*>(m_tab_list[index]);
599a422c1dSZhong Yang     if (pTabWnd != nullptr)
609a422c1dSZhong Yang         pTabWnd->OnTabEntered();
61*f8019216SZhong Yang 
62*f8019216SZhong Yang     if (m_last_tab_index != index && m_last_tab_index >= 0 && m_last_tab_index < static_cast<int>(m_tab_list.size()))
63*f8019216SZhong Yang     {
64*f8019216SZhong Yang         CTabDlg* pLastTabWnd = dynamic_cast<CTabDlg*>(m_tab_list[m_last_tab_index]);
65*f8019216SZhong Yang         if (pLastTabWnd != nullptr)
66*f8019216SZhong Yang             pLastTabWnd->OnTabExited();
67*f8019216SZhong Yang     }
68*f8019216SZhong Yang 
69*f8019216SZhong Yang     m_last_tab_index = index;
70bb1ccb84SZhong Yang }
71bb1ccb84SZhong Yang 
723dbe6911SZhong Yang CWnd* CTabCtrlEx::GetCurrentTab()
733dbe6911SZhong Yang {
744df46f80Slrisora     size_t cur_tab_index = GetCurSel();
753dbe6911SZhong Yang     if (cur_tab_index >= 0 && cur_tab_index < m_tab_list.size())
763dbe6911SZhong Yang     {
773dbe6911SZhong Yang         return m_tab_list[cur_tab_index];
783dbe6911SZhong Yang     }
793dbe6911SZhong Yang     return nullptr;
803dbe6911SZhong Yang }
813dbe6911SZhong Yang 
82c16fcfceSZhong Yang void CTabCtrlEx::AdjustTabWindowSize()
83c16fcfceSZhong Yang {
84c16fcfceSZhong Yang     CalSubWindowSize();
85c16fcfceSZhong Yang     for (size_t i{}; i < m_tab_list.size(); i++)
86c16fcfceSZhong Yang     {
87c16fcfceSZhong Yang         m_tab_list[i]->MoveWindow(m_tab_rect);
88c16fcfceSZhong Yang     }
89ccb67e16Slrisora     //为每个标签添加图标
90ccb67e16Slrisora     if (m_icon_list.empty())
91ccb67e16Slrisora         return;
92cf53bbc5Slrisora     CSize icon_size = IconMgr::GetIconSize(IconMgr::IconSize::IS_DPI_16);
93ccb67e16Slrisora     CImageList ImageList;
94cf53bbc5Slrisora     ImageList.Create(icon_size.cx, icon_size.cy, ILC_COLOR32 | ILC_MASK, 2, 2);
95ccb67e16Slrisora     for (auto icon_type : m_icon_list)
96ccb67e16Slrisora     {
97ccb67e16Slrisora         HICON hIcon = theApp.m_icon_mgr.GetHICON(icon_type, IconMgr::IconStyle::IS_OutlinedDark, IconMgr::IconSize::IS_DPI_16);
98ccb67e16Slrisora         ImageList.Add(hIcon);
99ccb67e16Slrisora     }
100ccb67e16Slrisora     SetImageList(&ImageList);
101ccb67e16Slrisora     ImageList.Detach();
102c16fcfceSZhong Yang }
103c16fcfceSZhong Yang 
1043dbe6911SZhong Yang void CTabCtrlEx::CalSubWindowSize()
1053dbe6911SZhong Yang {
1063dbe6911SZhong Yang     GetClientRect(m_tab_rect);
107fabb643fSzhongyang     CRect rc_temp = m_tab_rect;
108fabb643fSzhongyang     AdjustRect(FALSE, rc_temp);
109fabb643fSzhongyang     int margin = rc_temp.left - m_tab_rect.left;
1103dbe6911SZhong Yang     CRect rcTabItem;
1113dbe6911SZhong Yang     GetItemRect(0, rcTabItem);
112fabb643fSzhongyang     m_tab_rect.top += rcTabItem.Height() + margin;
113fabb643fSzhongyang     m_tab_rect.left += margin;
114fabb643fSzhongyang     m_tab_rect.bottom -= margin;
115fabb643fSzhongyang     m_tab_rect.right -= margin;
1163dbe6911SZhong Yang }
1173dbe6911SZhong Yang 
118bb1ccb84SZhong Yang 
119bb1ccb84SZhong Yang BEGIN_MESSAGE_MAP(CTabCtrlEx, CTabCtrl)
120bb1ccb84SZhong Yang 	ON_NOTIFY_REFLECT(TCN_SELCHANGE, &CTabCtrlEx::OnTcnSelchange)
1213dbe6911SZhong Yang     ON_WM_SIZE()
122bb1ccb84SZhong Yang END_MESSAGE_MAP()
123bb1ccb84SZhong Yang 
124bb1ccb84SZhong Yang 
125bb1ccb84SZhong Yang 
126bb1ccb84SZhong Yang // CTabCtrlEx 消息处理程序
127bb1ccb84SZhong Yang 
128bb1ccb84SZhong Yang 
129bb1ccb84SZhong Yang 
130bb1ccb84SZhong Yang 
131bb1ccb84SZhong Yang void CTabCtrlEx::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
132bb1ccb84SZhong Yang {
133bb1ccb84SZhong Yang 	// TODO: 在此添加控件通知处理程序代码
134bb1ccb84SZhong Yang 	int tab_selected = GetCurSel();
135bb1ccb84SZhong Yang 	SetCurTab(tab_selected);
136bb1ccb84SZhong Yang 
137bb1ccb84SZhong Yang 	*pResult = 0;
138bb1ccb84SZhong Yang }
139bb1ccb84SZhong Yang 
140bb1ccb84SZhong Yang 
141bb1ccb84SZhong Yang void CTabCtrlEx::PreSubclassWindow()
142bb1ccb84SZhong Yang {
143bb1ccb84SZhong Yang 	// TODO: 在此添加专用代码和/或调用基类
144bb1ccb84SZhong Yang 
145bb1ccb84SZhong Yang 	//计算子窗口的位置
1463dbe6911SZhong Yang     CalSubWindowSize();
147bb1ccb84SZhong Yang 
148bb1ccb84SZhong Yang 	CTabCtrl::PreSubclassWindow();
149bb1ccb84SZhong Yang }
1503dbe6911SZhong Yang 
1513dbe6911SZhong Yang 
1523dbe6911SZhong Yang void CTabCtrlEx::OnSize(UINT nType, int cx, int cy)
1533dbe6911SZhong Yang {
1543dbe6911SZhong Yang     CTabCtrl::OnSize(nType, cx, cy);
1553dbe6911SZhong Yang 
1563dbe6911SZhong Yang     // TODO: 在此处添加消息处理程序代码
157c16fcfceSZhong Yang     AdjustTabWindowSize();
1583dbe6911SZhong Yang }
159