⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cooltabctrl.cpp

📁 (VC)又一个酒店管理系统, (VC)又一个酒店管理系统,(VC)又一个酒店管理系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -