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