1 // CTabCtrlEx.cpp: 实现文件 2 // 3 4 #include "stdafx.h" 5 #include "MusicPlayer2.h" 6 #include "CTabCtrlEx.h" 7 8 9 // CTabCtrlEx 10 11 IMPLEMENT_DYNAMIC(CTabCtrlEx, CTabCtrl) 12 13 CTabCtrlEx::CTabCtrlEx() 14 { 15 16 } 17 18 CTabCtrlEx::~CTabCtrlEx() 19 { 20 } 21 22 void CTabCtrlEx::AddWindow(CWnd* pWnd, LPCTSTR lable_text) 23 { 24 if (pWnd == nullptr || pWnd->GetSafeHwnd() == NULL) 25 return; 26 27 InsertItem(m_tab_list.size(), lable_text, m_tab_list.size()); 28 29 pWnd->SetParent(this); 30 pWnd->MoveWindow(m_tab_rect); 31 32 m_tab_list.push_back(pWnd); 33 } 34 35 void CTabCtrlEx::SetCurTab(int index) 36 { 37 if (index < 0 || index >= static_cast<int>(m_tab_list.size())) 38 index = 0; 39 SetCurSel(index); 40 41 int tab_size = m_tab_list.size(); 42 for (int i = 0; i < tab_size; i++) 43 { 44 if (i == index) 45 { 46 m_tab_list[i]->ShowWindow(SW_SHOW); 47 m_tab_list[i]->SetFocus(); 48 } 49 else 50 { 51 m_tab_list[i]->ShowWindow(SW_HIDE); 52 } 53 } 54 55 CTabDlg* pTabWnd = dynamic_cast<CTabDlg*>(m_tab_list[index]); 56 if (pTabWnd != nullptr) 57 pTabWnd->OnTabEntered(); 58 } 59 60 CWnd* CTabCtrlEx::GetCurrentTab() 61 { 62 size_t cur_tab_index = GetCurSel(); 63 if (cur_tab_index >= 0 && cur_tab_index < m_tab_list.size()) 64 { 65 return m_tab_list[cur_tab_index]; 66 } 67 return nullptr; 68 } 69 70 void CTabCtrlEx::AdjustTabWindowSize() 71 { 72 CalSubWindowSize(); 73 for (size_t i{}; i < m_tab_list.size(); i++) 74 { 75 m_tab_list[i]->MoveWindow(m_tab_rect); 76 } 77 } 78 79 void CTabCtrlEx::CalSubWindowSize() 80 { 81 GetClientRect(m_tab_rect); 82 CRect rc_temp = m_tab_rect; 83 AdjustRect(FALSE, rc_temp); 84 int margin = rc_temp.left - m_tab_rect.left; 85 CRect rcTabItem; 86 GetItemRect(0, rcTabItem); 87 m_tab_rect.top += rcTabItem.Height() + margin; 88 m_tab_rect.left += margin; 89 m_tab_rect.bottom -= margin; 90 m_tab_rect.right -= margin; 91 } 92 93 94 BEGIN_MESSAGE_MAP(CTabCtrlEx, CTabCtrl) 95 ON_NOTIFY_REFLECT(TCN_SELCHANGE, &CTabCtrlEx::OnTcnSelchange) 96 ON_WM_SIZE() 97 END_MESSAGE_MAP() 98 99 100 101 // CTabCtrlEx 消息处理程序 102 103 104 105 106 void CTabCtrlEx::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult) 107 { 108 // TODO: 在此添加控件通知处理程序代码 109 int tab_selected = GetCurSel(); 110 SetCurTab(tab_selected); 111 112 *pResult = 0; 113 } 114 115 116 void CTabCtrlEx::PreSubclassWindow() 117 { 118 // TODO: 在此添加专用代码和/或调用基类 119 120 //计算子窗口的位置 121 CalSubWindowSize(); 122 123 CTabCtrl::PreSubclassWindow(); 124 } 125 126 127 void CTabCtrlEx::OnSize(UINT nType, int cx, int cy) 128 { 129 CTabCtrl::OnSize(nType, cx, cy); 130 131 // TODO: 在此处添加消息处理程序代码 132 AdjustTabWindowSize(); 133 } 134