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); 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 56 CWnd* CTabCtrlEx::GetCurrentTab() 57 { 58 int cur_tab_index = GetCurSel(); 59 if (cur_tab_index >= 0 && cur_tab_index < m_tab_list.size()) 60 { 61 return m_tab_list[cur_tab_index]; 62 } 63 return nullptr; 64 } 65 66 void CTabCtrlEx::CalSubWindowSize() 67 { 68 GetClientRect(m_tab_rect); 69 CRect rcTabItem; 70 GetItemRect(0, rcTabItem); 71 m_tab_rect.top += rcTabItem.Height() + 4; 72 m_tab_rect.left += 4; 73 m_tab_rect.bottom -= 4; 74 m_tab_rect.right -= 4; 75 } 76 77 78 BEGIN_MESSAGE_MAP(CTabCtrlEx, CTabCtrl) 79 ON_NOTIFY_REFLECT(TCN_SELCHANGE, &CTabCtrlEx::OnTcnSelchange) 80 ON_WM_SIZE() 81 END_MESSAGE_MAP() 82 83 84 85 // CTabCtrlEx 消息处理程序 86 87 88 89 90 void CTabCtrlEx::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult) 91 { 92 // TODO: 在此添加控件通知处理程序代码 93 int tab_selected = GetCurSel(); 94 SetCurTab(tab_selected); 95 96 *pResult = 0; 97 } 98 99 100 void CTabCtrlEx::PreSubclassWindow() 101 { 102 // TODO: 在此添加专用代码和/或调用基类 103 104 //计算子窗口的位置 105 CalSubWindowSize(); 106 107 CTabCtrl::PreSubclassWindow(); 108 } 109 110 111 void CTabCtrlEx::OnSize(UINT nType, int cx, int cy) 112 { 113 CTabCtrl::OnSize(nType, cx, cy); 114 115 // TODO: 在此处添加消息处理程序代码 116 CalSubWindowSize(); 117 for (size_t i{}; i < m_tab_list.size(); i++) 118 { 119 m_tab_list[i]->MoveWindow(m_tab_rect); 120 } 121 } 122