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