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

📄 imtab.cpp

📁 模拟popo的一个程序
💻 CPP
字号:
// IMTab.cpp : implementation file
//

#include "stdafx.h"
#include "CNIcq.h"
#include "IMTab.h"
#include "CNIcq.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CIMTab

CIMTab::CIMTab()
{
	m_pMainPanel = new CIMainPanel;
	m_nTabIndex = 0;
	m_nMyStatus = CN_USER_STATUS_ONLINE;
	m_nMouseOnTabNo = -1;
	m_nTabWidth = 40; //3
	m_bShowTab = TRUE;
}

CIMTab::~CIMTab()
{
	delete m_pMainPanel;
}


BEGIN_MESSAGE_MAP(CIMTab, CTabCtrl)
	//{{AFX_MSG_MAP(CIMTab)
	ON_WM_PAINT()
	ON_WM_SIZE()
	ON_WM_CREATE()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CIMTab message handlers
int CIMTab::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CTabCtrl::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	//取应用程序的Skin对象
	m_pSkin = &(((CCNIcqApp *)AfxGetApp())->m_IMSkin);
	
	InitGraphics();

	m_pMainPanel->Create(NULL,NULL,WS_CHILD | WS_VISIBLE,
			CRect(0,0,0,0), this,1010);
	return 0;
}

void CIMTab::InitGraphics()
{
}

void CIMTab::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	DrawAll(&dc);
}

void CIMTab::DrawAll(CDC *pDC)
{
	CDC memDC;

	memDC.CreateCompatibleDC(pDC);

	CRect rc;
	GetClientRect(rc);

	CBitmap bm;
	bm.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());

	CBitmap *oldBitmap = memDC.SelectObject(&bm);

	DrawBackGroud(&memDC,rc);

	//画TAB标签
	if( m_bShowTab )
	{
		DrawTabButton(&memDC);
	}
	//memDC.FillSolidRect(CRect(rc.left+2,0,rc.right-2,4), m_pSkin->MainBk);

	memDC.FillSolidRect(CRect(m_nTabWidth, 3, rc.Width()-3, rc.Height()-3),RGB(255,255,255));
//	memDC.FillSolidRect(CRect(m_nTabWidth, rc.Height()-8, rc.Width()-3, rc.Height()-3),m_pSkin->ShortCutBkColor);

	DrawCorner(&memDC);

	//画主边框
	CPen MyPen;
	MyPen.CreatePen(PS_SOLID,5,m_pSkin->MainBorder);
	CPen *OldPen = memDC.SelectObject(&MyPen);
	memDC.MoveTo(0,0);
	memDC.LineTo(rc.right,0);
	memDC.LineTo(rc.right,rc.bottom);
	memDC.LineTo(0,rc.bottom);
	memDC.LineTo(0,0);
	memDC.SelectObject(OldPen);

	//显示
	pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY);
	memDC.SelectObject(oldBitmap);
	DeleteObject(bm);
	memDC.DeleteDC();
}

void CIMTab::DrawBackGroud(CDC *pDC, CRect &rc)
{
	pDC->FillSolidRect(rc, m_pSkin->MainBk);
}

void CIMTab::OnSize(UINT nType, int cx, int cy) 
{
	CTabCtrl::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	m_pMainPanel->MoveWindow(CRect(m_nTabWidth, 8, cx-3, cy-8),TRUE);
}


BOOL CIMTab::DrawTabButton(CDC *pDC)
{
	int nTabVSpace;
	int nTabTop;
	int nTabLeft;
	int nTabIconTop;
	int nTabIconLeft;

	COLORREF clrMaskColor = RGB(255,0,0);
	CSize csButtonBkSize(39,69);
	CSize csButtonSize(32,32);

	nTabLeft = 4;//m_pSkin->IMTabTopEdge;
	nTabTop = -5;
	nTabVSpace = 69-m_pSkin->IMTabSpace;//46

	nTabIconLeft= nTabTop  + m_pSkin->TabIconLeft + 4;
	nTabIconTop = nTabLeft + m_pSkin->TabIconTop - 4;

	//画标签上的图象
	int Index0,Index1,Index2;	

	//计算图象索引
	Index0 = (m_nTabIndex == 0)? m_nMyStatus : ((m_nMouseOnTabNo == 0)? m_nMyStatus + 14:m_nMyStatus + 7);
	Index1 = (m_nTabIndex == 1)? 0 : ((m_nMouseOnTabNo == 1)? 2:1);
	Index2 = (m_nTabIndex == 2)? 3 : ((m_nMouseOnTabNo == 2)? 5:4);

	CBitmap& m_bmpTabBk = m_pSkin->TabBmp;		//Tab标签背景图片
	CBitmap& m_bmpTabIcon = m_pSkin->TabStatusBmp;	//Tab标签状态图标
	CBitmap& m_bmpStatusIcon = m_pSkin->MainStatusBmp;//我的状态图片

	//画Tab标签的背景
	switch(m_nTabIndex)
	{
	case 0:
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft,nTabTop + nTabVSpace * 2),m_bmpTabBk,CPoint(csButtonBkSize.cx,0),csButtonBkSize,clrMaskColor);
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft,nTabTop + nTabVSpace),m_bmpTabBk,CPoint(csButtonBkSize.cx,0),csButtonBkSize,clrMaskColor);

		//画状态图片
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft + nTabIconLeft,nTabTop + nTabIconTop + nTabVSpace *1),m_bmpTabIcon,CPoint(32*Index1,0),csButtonSize,clrMaskColor);
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft + nTabIconLeft,nTabTop + nTabIconTop + nTabVSpace *2),m_bmpTabIcon,CPoint(32*Index2,0),csButtonSize,clrMaskColor);
		//激活页最后画出
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft,nTabTop),m_bmpTabBk,CPoint(0,0),csButtonBkSize,clrMaskColor);
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft + nTabIconLeft,nTabTop + nTabIconTop + nTabVSpace *0),m_bmpStatusIcon,CPoint(32*Index0,0),csButtonSize,clrMaskColor);
		break;
	case 1:
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft,nTabTop + nTabVSpace * 2),m_bmpTabBk,CPoint(csButtonBkSize.cx,0),csButtonBkSize,clrMaskColor);
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft,nTabTop),m_bmpTabBk,CPoint(csButtonBkSize.cx,0),csButtonBkSize,clrMaskColor);
		
		//画状态图片
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft + nTabIconLeft,nTabTop + nTabIconTop + nTabVSpace *0),m_bmpStatusIcon,CPoint(32*Index0,0),csButtonSize,clrMaskColor);
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft + nTabIconLeft,nTabTop + nTabIconTop + nTabVSpace *2),m_bmpTabIcon,CPoint(32*Index2,0),csButtonSize,clrMaskColor);
		//激活页最后画出
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft,nTabTop + nTabVSpace),m_bmpTabBk,CPoint(0,0),csButtonBkSize,clrMaskColor);
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft + nTabIconLeft,nTabTop + nTabIconTop + nTabVSpace *1),m_bmpTabIcon,CPoint(32*Index1,0),csButtonSize,clrMaskColor);
		break;
	case 2:
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft,nTabTop + nTabVSpace),m_bmpTabBk,CPoint(csButtonBkSize.cx,0),csButtonBkSize,clrMaskColor);
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft,nTabTop),m_bmpTabBk,CPoint(csButtonBkSize.cx,0),csButtonBkSize,clrMaskColor);

		//画状态图片
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft + nTabIconLeft,nTabTop + nTabIconTop + nTabVSpace *0),m_bmpStatusIcon,CPoint(32*Index0,0),csButtonSize,clrMaskColor);
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft + nTabIconLeft,nTabTop + nTabIconTop + nTabVSpace *1),m_bmpTabIcon,CPoint(32*Index1,0),csButtonSize,clrMaskColor);
		//激活页最后画出
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft,nTabTop + nTabVSpace * 2),m_bmpTabBk,CPoint(0,0),csButtonBkSize,clrMaskColor);
		m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft + nTabIconLeft,nTabTop + nTabIconTop + nTabVSpace *2),m_bmpTabIcon,CPoint(32*Index2,0),csButtonSize,clrMaskColor);

		break;
	}
/*
	//画状态图片,最后输出效果不太好
	m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft + nTabIconLeft,nTabTop + nTabIconTop + nTabVSpace *0),m_bmpStatusIcon,CPoint(32*Index0,0),csButtonSize,clrMaskColor);
	m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft + nTabIconLeft,nTabTop + nTabIconTop + nTabVSpace *1),m_bmpTabIcon,CPoint(32*Index1,0),csButtonSize,clrMaskColor);
	m_pSkin->DrawTransparent(pDC,CPoint(nTabLeft + nTabIconLeft,nTabTop + nTabIconTop + nTabVSpace *2),m_bmpTabIcon,CPoint(32*Index2,0),csButtonSize,clrMaskColor);
*/	
	return TRUE;
}
void CIMTab::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CWnd*			wndUnderMouse = NULL;
	TRACKMOUSEEVENT		csTME;
	int			CurOnTabNo = -1;

	CTabCtrl::OnMouseMove(nFlags, point);

	if( !m_bShowTab ) 
		return;

	// If the mouse enter the button with the left button pressed then do nothing
	if( PtInRect(CRect(4,4,40,48),point)) {
		CurOnTabNo = 0;
	}
	else if( PtInRect(CRect(4,47,40,48*2),point)) {
		CurOnTabNo = 1;
	}
	else if( PtInRect(CRect(4,91,40,48*3),point)) {
		CurOnTabNo = 2;
	}
	else	{
		m_nMouseOnTabNo = -1;
		UpdateTab();
		return;
	}

	ClientToScreen(&point);
	wndUnderMouse = WindowFromPoint(point);

	if (wndUnderMouse && wndUnderMouse->m_hWnd == m_hWnd )
	{
		if (CurOnTabNo != m_nMouseOnTabNo)
		{
			m_nMouseOnTabNo = CurOnTabNo;

			UpdateTab();

			csTME.cbSize = sizeof(csTME);
			csTME.dwFlags = TME_LEAVE;
			csTME.hwndTrack = m_hWnd;
			::_TrackMouseEvent(&csTME);
		}
	}
}

void CIMTab::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CTabCtrl::OnLButtonDown(nFlags, point);

	if( !m_bShowTab ) 
		return;

	if( PtInRect(CRect(4,4,40,48),point))
	{
		m_nTabIndex = 0;
	}
	else if( PtInRect(CRect(4,47,40,48*2),point))
	{
		m_nTabIndex = 1;
	}
	else if( PtInRect(CRect(4,91,40,48*3),point))
	{
		m_nTabIndex = 2;
	}
	UpdateTab();
	
	PageChanged(m_nTabIndex);

}

LRESULT CIMTab::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
	if( m_nMouseOnTabNo != -1)
	{
		m_nMouseOnTabNo = -1;
		UpdateTab();
	}

	return 0;
} // End of OnMouseLeave

void CIMTab::UpdateTab()
{
	CRect rc;
	GetClientRect(&rc);
	InvalidateRect(CRect(rc.left,rc.top,rc.left + m_nTabWidth,rc.bottom));
}


void CIMTab::DrawCorner(CDC *pDC)
{
	CRect rc;
	GetClientRect(&rc);
	COLORREF clrMaskColor = RGB(255,0,0);
	CSize czImgSize(8,8);
	
	CBitmap& m_pCornerBmp = m_pSkin->CornerBmp;

	pDC->FillSolidRect(CRect(m_nTabWidth, rc.Height()-8, rc.Width()-3, rc.Height()-3),m_pSkin->ShortCutBkColor);

	//显示标签页时不显示左上角的图片
	if(!m_bShowTab)
		m_pSkin->DrawTransparent(pDC,CPoint(0,0),m_pCornerBmp,CPoint(czImgSize.cx * 0,0),czImgSize,clrMaskColor); //左上角

	m_pSkin->DrawTransparent(pDC,CPoint(rc.right-8,0),m_pCornerBmp,CPoint(czImgSize.cx*1,0),czImgSize,clrMaskColor); //右上角
	m_pSkin->DrawTransparent(pDC,CPoint(rc.right-9,rc.bottom-8),m_pCornerBmp,CPoint(czImgSize.cx*3,0),czImgSize,clrMaskColor); //右下角
	m_pSkin->DrawTransparent(pDC,CPoint(m_nTabWidth-3,rc.bottom-8),m_pCornerBmp,CPoint(czImgSize.cx*2,0),czImgSize,clrMaskColor); //左下角
}

void CIMTab::PageChanged(int NewPage)
{
	m_pMainPanel->ShowWindow((NewPage==0));
}

void CIMTab::SetShowTab(BOOL Show)
{
	m_bShowTab = Show;

	m_nTabWidth =(m_bShowTab)? MAX_TAB_WIDTH : MIN_TAB_WIDTH;
}

void CIMTab::SetActivePage(int NewPage)
{
	if( NewPage < 0 || NewPage > MAX_TAB)
		return;
	m_nTabIndex = NewPage;

	UpdateTab();
	
	PageChanged(m_nTabIndex);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -