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
IMPLEMENT_DYNAMIC(CTabCtrlEx,CTabCtrl)12bb1ccb84SZhong Yang IMPLEMENT_DYNAMIC(CTabCtrlEx, CTabCtrl)
13bb1ccb84SZhong Yang
14bb1ccb84SZhong Yang CTabCtrlEx::CTabCtrlEx()
15bb1ccb84SZhong Yang {
16bb1ccb84SZhong Yang
17bb1ccb84SZhong Yang }
18bb1ccb84SZhong Yang
~CTabCtrlEx()19bb1ccb84SZhong Yang CTabCtrlEx::~CTabCtrlEx()
20bb1ccb84SZhong Yang {
21bb1ccb84SZhong Yang }
22bb1ccb84SZhong Yang
AddWindow(CWnd * pWnd,LPCTSTR lable_text,IconMgr::IconType icon_type)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
SetCurTab(int index)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();
61f8019216SZhong Yang
62f8019216SZhong Yang if (m_last_tab_index != index && m_last_tab_index >= 0 && m_last_tab_index < static_cast<int>(m_tab_list.size()))
63f8019216SZhong Yang {
64f8019216SZhong Yang CTabDlg* pLastTabWnd = dynamic_cast<CTabDlg*>(m_tab_list[m_last_tab_index]);
65f8019216SZhong Yang if (pLastTabWnd != nullptr)
66f8019216SZhong Yang pLastTabWnd->OnTabExited();
67f8019216SZhong Yang }
68f8019216SZhong Yang
69f8019216SZhong Yang m_last_tab_index = index;
70bb1ccb84SZhong Yang }
71bb1ccb84SZhong Yang
GetCurrentTab()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
AdjustTabWindowSize()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
Clear()104*64f8684dSzhongyang219 void CTabCtrlEx::Clear()
105*64f8684dSzhongyang219 {
106*64f8684dSzhongyang219 DeleteAllItems();
107*64f8684dSzhongyang219 m_tab_list.clear();
108*64f8684dSzhongyang219 m_icon_list.clear();
109*64f8684dSzhongyang219 }
110*64f8684dSzhongyang219
CalSubWindowSize()1113dbe6911SZhong Yang void CTabCtrlEx::CalSubWindowSize()
1123dbe6911SZhong Yang {
1133dbe6911SZhong Yang GetClientRect(m_tab_rect);
114fabb643fSzhongyang CRect rc_temp = m_tab_rect;
115fabb643fSzhongyang AdjustRect(FALSE, rc_temp);
116fabb643fSzhongyang int margin = rc_temp.left - m_tab_rect.left;
1173dbe6911SZhong Yang CRect rcTabItem;
1183dbe6911SZhong Yang GetItemRect(0, rcTabItem);
119fabb643fSzhongyang m_tab_rect.top += rcTabItem.Height() + margin;
120fabb643fSzhongyang m_tab_rect.left += margin;
121fabb643fSzhongyang m_tab_rect.bottom -= margin;
122fabb643fSzhongyang m_tab_rect.right -= margin;
1233dbe6911SZhong Yang }
1243dbe6911SZhong Yang
125bb1ccb84SZhong Yang
BEGIN_MESSAGE_MAP(CTabCtrlEx,CTabCtrl)126bb1ccb84SZhong Yang BEGIN_MESSAGE_MAP(CTabCtrlEx, CTabCtrl)
127bb1ccb84SZhong Yang ON_NOTIFY_REFLECT(TCN_SELCHANGE, &CTabCtrlEx::OnTcnSelchange)
1283dbe6911SZhong Yang ON_WM_SIZE()
129bb1ccb84SZhong Yang END_MESSAGE_MAP()
130bb1ccb84SZhong Yang
131bb1ccb84SZhong Yang
132bb1ccb84SZhong Yang
133bb1ccb84SZhong Yang // CTabCtrlEx 消息处理程序
134bb1ccb84SZhong Yang
135bb1ccb84SZhong Yang
136bb1ccb84SZhong Yang
137bb1ccb84SZhong Yang
138bb1ccb84SZhong Yang void CTabCtrlEx::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
139bb1ccb84SZhong Yang {
140bb1ccb84SZhong Yang // TODO: 在此添加控件通知处理程序代码
141bb1ccb84SZhong Yang int tab_selected = GetCurSel();
142bb1ccb84SZhong Yang SetCurTab(tab_selected);
143bb1ccb84SZhong Yang
144bb1ccb84SZhong Yang *pResult = 0;
145bb1ccb84SZhong Yang }
146bb1ccb84SZhong Yang
147bb1ccb84SZhong Yang
PreSubclassWindow()148bb1ccb84SZhong Yang void CTabCtrlEx::PreSubclassWindow()
149bb1ccb84SZhong Yang {
150bb1ccb84SZhong Yang // TODO: 在此添加专用代码和/或调用基类
151bb1ccb84SZhong Yang
152bb1ccb84SZhong Yang //计算子窗口的位置
1533dbe6911SZhong Yang CalSubWindowSize();
154bb1ccb84SZhong Yang
155bb1ccb84SZhong Yang CTabCtrl::PreSubclassWindow();
156bb1ccb84SZhong Yang }
1573dbe6911SZhong Yang
1583dbe6911SZhong Yang
OnSize(UINT nType,int cx,int cy)1593dbe6911SZhong Yang void CTabCtrlEx::OnSize(UINT nType, int cx, int cy)
1603dbe6911SZhong Yang {
1613dbe6911SZhong Yang CTabCtrl::OnSize(nType, cx, cy);
1623dbe6911SZhong Yang
1633dbe6911SZhong Yang // TODO: 在此处添加消息处理程序代码
164c16fcfceSZhong Yang AdjustTabWindowSize();
1653dbe6911SZhong Yang }
166