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