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 { 37804e3dc8SZhong Yang if (index < 0 || index >= static_cast<int>(m_tab_list.size())) 38804e3dc8SZhong 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 } 54*9a422c1dSZhong Yang 55*9a422c1dSZhong Yang CTabDlg* pTabWnd = dynamic_cast<CTabDlg*>(m_tab_list[index]); 56*9a422c1dSZhong Yang if (pTabWnd != nullptr) 57*9a422c1dSZhong Yang pTabWnd->OnTabEntered(); 58bb1ccb84SZhong Yang } 59bb1ccb84SZhong Yang 603dbe6911SZhong Yang CWnd* CTabCtrlEx::GetCurrentTab() 613dbe6911SZhong Yang { 623dbe6911SZhong Yang int cur_tab_index = GetCurSel(); 633dbe6911SZhong Yang if (cur_tab_index >= 0 && cur_tab_index < m_tab_list.size()) 643dbe6911SZhong Yang { 653dbe6911SZhong Yang return m_tab_list[cur_tab_index]; 663dbe6911SZhong Yang } 673dbe6911SZhong Yang return nullptr; 683dbe6911SZhong Yang } 693dbe6911SZhong Yang 703dbe6911SZhong Yang void CTabCtrlEx::CalSubWindowSize() 713dbe6911SZhong Yang { 723dbe6911SZhong Yang GetClientRect(m_tab_rect); 733dbe6911SZhong Yang CRect rcTabItem; 743dbe6911SZhong Yang GetItemRect(0, rcTabItem); 753dbe6911SZhong Yang m_tab_rect.top += rcTabItem.Height() + 4; 763dbe6911SZhong Yang m_tab_rect.left += 4; 773dbe6911SZhong Yang m_tab_rect.bottom -= 4; 783dbe6911SZhong Yang m_tab_rect.right -= 4; 793dbe6911SZhong Yang } 803dbe6911SZhong Yang 81bb1ccb84SZhong Yang 82bb1ccb84SZhong Yang BEGIN_MESSAGE_MAP(CTabCtrlEx, CTabCtrl) 83bb1ccb84SZhong Yang ON_NOTIFY_REFLECT(TCN_SELCHANGE, &CTabCtrlEx::OnTcnSelchange) 843dbe6911SZhong Yang ON_WM_SIZE() 85bb1ccb84SZhong Yang END_MESSAGE_MAP() 86bb1ccb84SZhong Yang 87bb1ccb84SZhong Yang 88bb1ccb84SZhong Yang 89bb1ccb84SZhong Yang // CTabCtrlEx 消息处理程序 90bb1ccb84SZhong Yang 91bb1ccb84SZhong Yang 92bb1ccb84SZhong Yang 93bb1ccb84SZhong Yang 94bb1ccb84SZhong Yang void CTabCtrlEx::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult) 95bb1ccb84SZhong Yang { 96bb1ccb84SZhong Yang // TODO: 在此添加控件通知处理程序代码 97bb1ccb84SZhong Yang int tab_selected = GetCurSel(); 98bb1ccb84SZhong Yang SetCurTab(tab_selected); 99bb1ccb84SZhong Yang 100bb1ccb84SZhong Yang *pResult = 0; 101bb1ccb84SZhong Yang } 102bb1ccb84SZhong Yang 103bb1ccb84SZhong Yang 104bb1ccb84SZhong Yang void CTabCtrlEx::PreSubclassWindow() 105bb1ccb84SZhong Yang { 106bb1ccb84SZhong Yang // TODO: 在此添加专用代码和/或调用基类 107bb1ccb84SZhong Yang 108bb1ccb84SZhong Yang //计算子窗口的位置 1093dbe6911SZhong Yang CalSubWindowSize(); 110bb1ccb84SZhong Yang 111bb1ccb84SZhong Yang CTabCtrl::PreSubclassWindow(); 112bb1ccb84SZhong Yang } 1133dbe6911SZhong Yang 1143dbe6911SZhong Yang 1153dbe6911SZhong Yang void CTabCtrlEx::OnSize(UINT nType, int cx, int cy) 1163dbe6911SZhong Yang { 1173dbe6911SZhong Yang CTabCtrl::OnSize(nType, cx, cy); 1183dbe6911SZhong Yang 1193dbe6911SZhong Yang // TODO: 在此处添加消息处理程序代码 1203dbe6911SZhong Yang CalSubWindowSize(); 1213dbe6911SZhong Yang for (size_t i{}; i < m_tab_list.size(); i++) 1223dbe6911SZhong Yang { 1233dbe6911SZhong Yang m_tab_list[i]->MoveWindow(m_tab_rect); 1243dbe6911SZhong Yang } 1253dbe6911SZhong Yang } 126