📄 cooltabctrl.cpp
字号:
break;
case TABMODE_BOTTOMTAB:
rect.DeflateRect(2, 2, 4, 20);
break;
case TABMODE_TOPTAB:
rect.DeflateRect(2, 20, 4, 4);
break;
default:
break;
}
lpncsp->rgrc[0] = rect;
}
void CCoolTabCtrl::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
lpwndpos->flags |= SWP_FRAMECHANGED;
CWnd::OnWindowPosChanging(lpwndpos);
}
UINT CCoolTabCtrl::OnNcHitTest(CPoint point)
{
return HTCAPTION;
}
void CCoolTabCtrl::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
SetCapture();//获得鼠标的输入行为
CRect rcWindow;
GetWindowRect(rcWindow);
int count = m_aTabPage.GetSize();
for (int i = 0; i < count; i++)
{
CRect rect = m_aTabPage.GetAt(i)->m_rcLabel;
rect.OffsetRect(rcWindow.TopLeft());
if (rect.PtInRect(point))
{
m_nHotItem = i;
m_aTabPage.GetAt(i)->m_dwState = 1;
SendMessage(WM_NCPAINT);
break;
}
}
PlayResource(IDR_CLICK);//播放声音
}
BOOL CCoolTabCtrl::PlayResource(WORD wResourceID)
{
// Get the handle to the current instance of the application
HINSTANCE hInstance = AfxGetInstanceHandle();
ASSERT (hInstance != NULL);
// Find the WAVE resource
HRSRC hResInfo =
FindResource(hInstance, MAKEINTRESOURCE(wResourceID), _T("WAVE"));
if(hResInfo == NULL)
return FALSE;
// Load the WAVE resource
HANDLE hRes = LoadResource(hInstance, hResInfo);
if (hRes == NULL)
return FALSE;
// Lock the WAVE resource and play it
LPSTR lpRes = (LPSTR) LockResource(hRes);
if(lpRes==NULL)
return FALSE;
if (sndPlaySound(lpRes, SND_MEMORY | SND_ASYNC) == NULL)
return FALSE;
// Free the WAVE resource and return success or failure.
FreeResource(hRes);
return TRUE;
}
void CCoolTabCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
ClientToScreen(&point);
int count = m_aTabPage.GetSize();
if ((nFlags & VK_LBUTTON) && m_nHotItem >= 0 && m_nHotItem < count)
{
CRect rcWindow;
GetWindowRect(rcWindow);
CRect rect = m_aTabPage.GetAt(m_nHotItem)->m_rcLabel;
rect.OffsetRect(rcWindow.TopLeft());
UINT state = rect.PtInRect(point) ? 1 : 0;
if (m_aTabPage.GetAt(m_nHotItem)->m_dwState != state)
{
m_aTabPage.GetAt(m_nHotItem)->m_dwState = state;
SendMessage(WM_NCPAINT);
}
}
CWnd::OnMouseMove(nFlags, point);
}
void CCoolTabCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
ReleaseCapture();
int count = m_aTabPage.GetSize();
if (m_nHotItem >= 0 && m_nHotItem < count)
{
ClientToScreen(&point);
CRect rcWindow;
GetWindowRect(rcWindow);
CRect rect = m_aTabPage.GetAt(m_nHotItem)->m_rcLabel;
rect.OffsetRect(rcWindow.TopLeft());
m_aTabPage.GetAt(m_nHotItem)->m_dwState = 0;
if (rect.PtInRect(point) && m_nHotItem != m_nActivePage)
{
SetActivePage(m_nHotItem);
AutoSize();
}
SendMessage(WM_NCPAINT);
}
CWnd::OnLButtonUp(nFlags, point);
}
/*#################################################################
-------------------------------
控件尺寸处理函数
CCoolTabCtrl size handlers
-------------------------------
#################################################################*/
void CCoolTabCtrl::AutoSize()
{
int count = m_aTabPage.GetSize();
if (count == 0) return;
CTabPageItem* page = NULL;
if (m_nMode == TABMODE_GROUP && GetSafeHwnd() != NULL)
{
//强迫窗口重新计算非客户区大小-----------------------------
SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOREDRAW | SWP_NOACTIVATE);
}
CRect rcWindow, rcClient;
GetWindowRect(rcWindow);
GetClientRect(rcClient);
rcWindow.OffsetRect(-rcWindow.TopLeft());
switch (m_nMode)
{
case TABMODE_NONE:
{
for (int i = 0; i < count; i++)
{
page = m_aTabPage.GetAt(i);
if (i != m_nActivePage)
{
page->Hide();
}
else
{
GetClientRect(rcWindow);
page->SetRect(rcWindow);
page->Expend();
}
}
}
break;
case TABMODE_GROUP:
{
rcWindow.DeflateRect(1, 1);
for (int i = 0; i < count; i++)
{
page = m_aTabPage.GetAt(i);
if (i != m_nActivePage)
{
page->m_rcLabel = rcWindow;
if (m_nActivePage > i)
{
page->m_rcLabel.top += (i * 18);
page->m_rcLabel.bottom = page->m_rcLabel.top + 18;
}
else
{
page->m_rcLabel.bottom -= 18 * (count - i - 1);
page->m_rcLabel.top = page->m_rcLabel.bottom - 18;
}
page->m_rect = rcClient;
page->Hide();
}
else
{
page->m_rcLabel = rcWindow;
page->m_rcLabel.top += (i * 18);
page->m_rcLabel.bottom = page->m_rcLabel.top + 18;
page->m_rect = rcClient;
page->Expend();
}
}
}
break;
case TABMODE_BOTTOMTAB:
{
CRect rc(rcWindow);
rc.right = 1;
for (int i = 0; i < count; i++)
{
page = m_aTabPage.GetAt(i);
if (i != m_nActivePage)
{
page->Hide();
}
else
{
page->SetRect(rcClient);
page->Expend();
}
rc.top = rc.bottom - 18;
rc.left = rc.right;
rc.right = rc.left + 6 * page->m_strText.GetLength() + 10;
if (page->m_hIcon != NULL) rc.right += 20;
page->m_rcLabel = rc;
}
}
break;
case TABMODE_TOPTAB:
{
CRect rc(rcWindow);
rc.right = 1;
for (int i = 0; i < count; i++)
{
page = m_aTabPage.GetAt(i);
if (i != m_nActivePage)
{
page->Hide();
}
else
{
page->SetRect(rcClient);
page->Expend();
}
rc.bottom = rc.top + 18;
rc.left = rc.right;
rc.right = rc.left + 6 * page->m_strText.GetLength() + 10;
if (page->m_hIcon != NULL) rc.right += 20;
page->m_rcLabel = rc;
}
}
break;
default:
ASSERT(FALSE);
break;
}
}
/*#################################################################
-------------------------------
控件页面处理函数
CCoolTabCtrl page handlers
-------------------------------
#################################################################*/
BOOL CCoolTabCtrl::AddPage(CRuntimeClass *pClass, UINT nIDTemplate, LPCTSTR strText, UINT IconID)
{
CDialog *pDlg = (CDialog*)pClass->CreateObject();
if (pDlg != NULL && pDlg->Create(nIDTemplate, this))
{
CTabPageItem *pItem;
pItem = new CTabPageItem(this, (CWnd*)pDlg, strText, m_aTabPage.GetSize());
if(IconID != NULL)
{
pItem->SetIcon(AfxGetApp()->LoadIcon(IconID));
}
m_aTabPage.Add(pItem);
AutoSize();
return TRUE;
}
return FALSE;
}
BOOL CCoolTabCtrl::AddPage(CWnd *pWnd, LPCTSTR strText, UINT IconID)
{
if (pWnd != NULL)
{
CTabPageItem *pItem;
pItem = new CTabPageItem(this, pWnd, strText, m_aTabPage.GetSize());
if(IconID != NULL)
{
pItem->SetIcon(AfxGetApp()->LoadIcon(IconID));
}
m_aTabPage.Add(pItem);
AutoSize();
return TRUE;
}
return FALSE;
}
void CCoolTabCtrl::SetCtrlStyle(DWORD dwStyle)
{
m_dwStyle = dwStyle;
}
void CCoolTabCtrl::SetBorderStyle(DWORD dwStyle)
{
m_dwBorderStyle = dwStyle;
}
void CCoolTabCtrl::SetActivePage(int nindex)
{
if (m_nActivePage >= 0 && m_nActivePage < m_aTabPage.GetSize())
{
m_nActivePage = nindex;
AutoSize();
}
}
void CCoolTabCtrl::SetMode(int nMode)
{
if (nMode >= 0 && nMode <= TABMODE_BOTTOMTAB)
{
m_nMode = nMode;
if (GetSafeHwnd() != NULL)
{
AutoSize();
}
}
}
CWnd* CCoolTabCtrl::GetPage(int number)
{
if (number >= 0 && number < m_aTabPage.GetSize())
{
return m_aTabPage.GetAt(number)->m_pWnd;
}
return NULL;
}
void CCoolTabCtrl::DrawBoder(CDC *pDC, CRect rect)
{
COLORREF backcolor = ::GetSysColor(COLOR_3DFACE);
rect.InflateRect(1, 1);
pDC->Draw3dRect(rect, RGB(255, 255, 255), RGB(255, 255, 255));
rect.InflateRect(1, 1);
pDC->Draw3dRect(rect, AlphaBlendColor(backcolor, 180), AlphaBlendColor(backcolor, 180));
CPen pen(0, 1, AlphaBlendColor(backcolor, 220));
CPen *oldpen = pDC->SelectObject(&pen);
pDC->MoveTo(rect.left,rect.bottom);
pDC->LineTo(rect.right, rect.bottom);
pDC->MoveTo(rect.right, rect.top);
pDC->LineTo(rect.right, rect.bottom);
pen.DeleteObject();
pen.CreatePen(0, 1, AlphaBlendColor(backcolor, 245));
pDC->SelectObject(&pen);
pDC->MoveTo(rect.left + 1,rect.bottom + 1);
pDC->LineTo(rect.right - 1, rect.bottom + 1);
pDC->MoveTo(rect.right + 1, rect.top + 1);
pDC->LineTo(rect.right + 1, rect.bottom);
pDC->SelectObject(oldpen);
}
void CCoolTabCtrl::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
if (GetSafeHwnd() != NULL)
{
AutoSize();
}
}
void CCoolTabCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd::OnLButtonDown(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -