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

📄 msnbutton.cpp

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

// this class is for ONE LOUSEY BUTTON. GRRRRRR...
//yep.. you got it... the SEND button.

#include "stdafx.h"
#include "MSNButton.h"

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

#define RGB_BUTTON_WHITE    (GetSysColor(COLOR_BTNHIGHLIGHT))

#define COL_OVER 	GetColor(COL_BTNOVER)
#define COL_LIGHT 	(m_bDisabled ? GetColor(COL_DISABLED) : GetColor(COL_BTNBACK))
#define COL_ACTIVE 	GetColor(COL_BTNACTIVE)
#define COL_EDGE 	GetColor(COL_LINEFRAMES)
#define COL_BLACK 	RGB(0, 0, 0)

/////////////////////////////////////////////////////////////////////////////
// CMSNButton
COLORREF GetColor(int nIndex)
{
	COLORREF crColor;

	switch(nIndex)
	{
	case COL_DISABLED:	crColor = RGB(247,247,231);break;
	case COL_LIGHTITEMS:	crColor = 16244694;break;
	case COL_LINEFRAMES:	crColor = 11880704;break;
	case COL_NOTIFYTEXT:	crColor = 15715253;break;
	case COL_NORMALTEXT:	crColor = RGB(0,0,0);break;
	case COL_DISABLEDTEXT:	crColor = RGB(127,127,127);break;
	case COL_BTNOVER:	crColor = 2927840;break;
	case COL_BTNACTIVE:	crColor = 16711680;break;
	case COL_BTNBACK:	crColor = 15793151;break;
	default: crColor=RGB(255,255,255);break;
	}
	return crColor;
}


CMSNButton::CMSNButton()
{
	m_bDrawFocus = true;
	m_bMouseCaptured = false;
	m_bLButtonDown = false;
	m_bHasFocus = false;
	m_bDisabled = false;
	m_bClickedIn = false;
	m_bKeyDown = false;
	m_TextAlign = AlignCenter;
	m_bRaised = false;
	m_crCornerColor = GetSysColor(COLOR_BTNFACE);
}

CMSNButton::~CMSNButton()
{

}


BEGIN_MESSAGE_MAP(CMSNButton, CButton)
	//{{AFX_MSG_MAP(CMSNButton)
	ON_WM_MOUSEMOVE()
	ON_WM_KILLFOCUS()
	ON_WM_SETFOCUS()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_CREATE()
	ON_WM_ENABLE()
	ON_WM_KEYDOWN()
	ON_WM_KEYUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMSNButton message handlers

void CMSNButton::OnMouseMove(UINT nFlags, CPoint point) 
{
	CButton::OnMouseMove(nFlags, point);
	if (m_bKeyDown) return;
	CRect rc;
	GetClientRect(&rc);
	if (!rc.PtInRect(point))
	{
		if (!m_bMouseCaptured) return;
		OnMouseLeave(nFlags, point); 
		m_bMouseCaptured = false;
		if (!m_bClickedIn) 
		{
			ReleaseCapture();
		}
	}
	else
	{
		if (m_bMouseCaptured) return;
		SetCapture();
		m_bMouseCaptured = true;
		OnMouseEnter(nFlags, point);
	} 
}

void CMSNButton::OnKillFocus(CWnd* pNewWnd) 
{
	if (m_bKeyDown) 
		return;
	m_bHasFocus = false;
	if (!m_bMouseCaptured) m_bRaised = false;
	m_bMouseCaptured = false;
	CButton::OnKillFocus(pNewWnd);
	Invalidate();
	UpdateWindow();
}

void CMSNButton::OnSetFocus(CWnd* pOldWnd) 
{
	if (m_bKeyDown) 
		return;
	m_bHasFocus = true;
	
	if(!m_bDrawFocus) m_bHasFocus = false;

	CButton::OnSetFocus(pOldWnd);
	Invalidate();
	UpdateWindow();
}

void CMSNButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	int	 iSaveDC;
	CDC* pDC;
	CRect rc;
	CString	strTitle;
	UINT nFormat;
	UINT nFlags;
	CBitmap* pBitmap = NULL;
	
	pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	VERIFY(pDC);
	rc.CopyRect(&lpDrawItemStruct->rcItem);
	GetWindowText(strTitle);
	nFormat = DT_SINGLELINE;
	iSaveDC = pDC->SaveDC();
	
	switch (m_TextAlign)
	{
		case AlignAbove: nFormat |= DT_CENTER | DT_TOP; break;	
		case AlignBelow: nFormat |= DT_CENTER | DT_BOTTOM; break;
		case AlignLeft:
		case AlignRight: nFormat |= DT_LEFT | DT_VCENTER; break;
		case AlignCenter: nFormat |= DT_CENTER | DT_VCENTER; break;
		default: ASSERT(false);
	}
	
	pDC->SetBkMode(TRANSPARENT);
	if (!m_bDisabled)
	{
		if (!m_bLButtonDown)
		{
			pDC->FillSolidRect(1, rc.bottom - 3, rc.right - 2, 1, m_bRaised ? COL_OVER : COL_ACTIVE);
			pDC->FillSolidRect(2, rc.bottom - 2, rc.right - 4, 1, m_bRaised ? COL_OVER : COL_ACTIVE);
		}
		else
		{
			pDC->FillSolidRect(1, rc.bottom - 3, rc.right - 2, 1, COL_LIGHT);
			pDC->FillSolidRect(2, rc.bottom - 2, rc.right - 4, 1, COL_LIGHT);
		}
	}
	else
	{
		pDC->FillSolidRect(1, rc.bottom - 3, rc.right - 2, 1, COL_LIGHT);
		pDC->FillSolidRect(2, rc.bottom - 2, rc.right - 4, 1, COL_LIGHT);
	}

	pDC->FillSolidRect(2, rc.bottom - 1, rc.right - 4, 1, COL_EDGE);
	pDC->FillSolidRect(0, 2, 1, rc.bottom - 4, COL_EDGE);
	pDC->FillSolidRect(2, 0, rc.right - 4, 1, COL_EDGE);
	pDC->FillSolidRect(rc.right - 1, 2, 1, rc.bottom - 4, COL_EDGE);
	pDC->FillSolidRect(0, 1, 2, 1, COL_EDGE);
	pDC->FillSolidRect(1, 0, 1, 2, COL_EDGE);
	pDC->FillSolidRect(0, rc.bottom - 2, 2, 1, COL_EDGE);
	pDC->FillSolidRect(1, rc.bottom - 2, 1, 2, COL_EDGE);
	pDC->FillSolidRect(rc.right - 2, 0, 1, 2, COL_EDGE);
	pDC->FillSolidRect(rc.right - 2, 1, 2, 1, COL_EDGE);
	pDC->FillSolidRect(rc.right - 2, rc.bottom - 2, 2, 1, COL_EDGE);
	pDC->FillSolidRect(rc.right - 2, rc.bottom - 2, 1, 2, COL_EDGE);

	DrawDot(pDC, 0, 0, m_crCornerColor);
	DrawDot(pDC, 0, rc.bottom - 1, m_crCornerColor);
	DrawDot(pDC, rc.right - 1, rc.bottom - 1, m_crCornerColor);
	DrawDot(pDC, rc.right - 1, 0, m_crCornerColor);

	if (!m_bDisabled)
	{
		DrawDot(pDC, 2, 1, COL_LIGHT);
		DrawDot(pDC, 1, 2, COL_LIGHT);
		DrawDot(pDC, rc.right - 3, 1, COL_LIGHT);
		DrawDot(pDC, rc.right - 2, 2, COL_LIGHT);
	}

	pDC->FillSolidRect(1, 3, rc.right - 2, rc.bottom - 6, COL_LIGHT);
	if (!m_bDisabled)
	{
		pDC->FillSolidRect(3, 1, rc.right - 6, 1, COL_LIGHT);
		pDC->FillSolidRect(2, 2, rc.right - 4, 1, COL_LIGHT);
	}
	else
	{
		pDC->FillSolidRect(2, 1, rc.right - 4, 1, COL_LIGHT);
		pDC->FillSolidRect(1, 2, rc.right - 2, 1, COL_LIGHT);
	}
	if (m_bHasFocus)
	{
		DrawDottedLine(pDC, 1, 2, rc.bottom - 4, true, COL_BLACK);
		DrawDottedLine(pDC, 2, 1, rc.right - 4, false, COL_BLACK);
		DrawDottedLine(pDC, 2, rc.bottom - 2, rc.right - 4, false, COL_BLACK);
		DrawDottedLine(pDC, rc.right - 2, 2, rc.bottom - 4, true, COL_BLACK);
	}
	
	rc.InflateRect(-5, -5);
	
	if (m_bHasFocus)
	{
		pBitmap = &m_bitmapFocus;
		if (!pBitmap->m_hObject) 
			pBitmap = &m_bitmap;
	}
	else
	{
		pBitmap = &m_bitmap;
	}
	
	if (m_bRaised)
	{
		pBitmap = &m_bitmapFocus;
		if (!pBitmap->m_hObject) pBitmap = &m_bitmap;
	} 
	
	if (m_bDisabled = (::GetWindowLong(m_hWnd, GWL_STYLE) & WS_DISABLED) ? true : false)
	{
		pBitmap = &m_bitmapDisabled;
	}
	else if (m_bLButtonDown) rc.OffsetRect(1, 1);
	
	CRect rcText(rc);

	if (pBitmap->m_hObject)
	{
		CRect rcBitmap(rc);
		BITMAP	bmpInfo;			
		CSize	size;

		switch (m_TextAlign)
		{
			case AlignLeft:
			{
				size = pDC->GetTextExtent(strTitle);
				rcBitmap.OffsetRect(size.cx + 5, 0);
				nFlags = DB_VCENTER;
				break;
			}
			case AlignAbove:
			{
				size = pDC->GetTextExtent(strTitle);
				rcBitmap.OffsetRect(0,size.cy + 5);
				nFlags = DB_HCENTER;
				break;
			}
			case AlignRight:
			{
				pBitmap->GetBitmap(&bmpInfo);	
				rcText.OffsetRect(bmpInfo.bmWidth + 5, 0);
				nFlags = DB_VCENTER;
				break;
			}
			case AlignBelow:
			{
				nFlags = DB_HCENTER;
				break;
			}
			default: ASSERT(false); break;
		}
		DrawBitmap(pDC, rcBitmap, nFlags, pBitmap);
	}
	
	if (m_bDisabled)
	{
		rcText.OffsetRect(1, 1);
		pDC->SetTextColor(RGB_BUTTON_WHITE);
		pDC->DrawText(strTitle, rcText, nFormat);
		rcText.OffsetRect(-1, -1);
		pDC->SetTextColor(GetColor(COL_DISABLEDTEXT));
		pDC->DrawText(strTitle, rcText, nFormat);
	} 
	else
	{
		pDC->SetTextColor(GetColor(COL_NORMALTEXT));
		pDC->DrawText(strTitle, rcText, nFormat);
	}

	pDC->RestoreDC(iSaveDC);
}

void CMSNButton::OnMouseEnter(UINT nFlags, CPoint point)
{
	if (m_bClickedIn) m_bLButtonDown = true;
	m_bRaised = true;
	Invalidate();
	UpdateWindow();
}

void CMSNButton::OnMouseLeave(UINT nFlags, CPoint point)
{
	if (m_bClickedIn) m_bLButtonDown = false;
	m_bRaised = false;
	Invalidate();
	UpdateWindow();
}

void CMSNButton::DrawDot(CDC *pDC, int x, int y, COLORREF col)
{
	pDC->FillSolidRect(x, y, 1, 1, col);
}

void CMSNButton::DrawDottedLine(CDC *pDC, int x, int y, int len, bool vertical, COLORREF col)
{
	int pos = 0;
	while (pos < len)
	{
		pDC->FillSolidRect(x + (vertical ? 0 : pos), y + (vertical ? pos : 0), 1, 1, col);
		pos += 2;
	}
}

void CMSNButton::SetCornerColor(COLORREF col)
{
	m_crCornerColor = col;
	Invalidate();
	UpdateWindow();
}

void CMSNButton::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if (m_bKeyDown) 
		return;
	
	m_bLButtonDown = true;
	m_bClickedIn = true;
	m_bRaised = false;
	if (GetFocus() != this)
	{
		SetFocus();
		return;
	}
	CButton::OnLButtonDown(nFlags, point);
	Invalidate();
	UpdateWindow();
}


void CMSNButton::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if (m_bKeyDown) 
		return;

	if (!m_bClickedIn) 
		return;

	if (!m_bMouseCaptured)
	{
		ReleaseCapture();
		m_bClickedIn = false;
		m_bRaised = false;
		return;
	}

	m_bClickedIn = false;

	m_bLButtonDown = false;
	m_bRaised = true;

	if (GetFocus() != this)
	SetFocus();

	else
	{
		Invalidate();
		UpdateWindow();
	}

	GetParent()->SendMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM) m_hWnd);
}

int CMSNButton::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CButton::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	m_bDisabled = (lpCreateStruct->style & WS_DISABLED) ? true : false;
	return 0;
}

void CMSNButton::OnEnable(bool bEnable) 
{
	m_bDisabled =! bEnable;
	
	if (!bEnable)
	{
		m_bMouseCaptured = false;
		m_bRaised = false;
		m_bKeyDown = false;
		m_bLButtonDown = false;
		m_bClickedIn = false;
	}

	CButton::OnEnable(bEnable);
}

bool CMSNButton::LoadBitmaps(UINT nBitmap, UINT nBitmapFocus, UINT nBitmapDisabled)
{
	return LoadBitmaps(MAKEINTRESOURCE(nBitmap),
						MAKEINTRESOURCE(nBitmapFocus),
						MAKEINTRESOURCE(nBitmapDisabled));
}

CMSNButton::TextAlign CMSNButton::GetTextAlignment() const
{
	return m_TextAlign;
}

void CMSNButton::SetTextAlignment(TextAlign nTextAlign)
{
	m_TextAlign = nTextAlign;
}

void CMSNButton::DrawBitmap(CDC * pDC, CRect rc, UINT nFlags, CBitmap *pBitmap)
{
	CDC memDC;
	CBitmap* pOld = NULL;
	memDC.CreateCompatibleDC(pDC);
	BITMAP bmpInfo;
	int Width;
	int Height;
	int xSrc = 0;
	int ySrc = 0;
	int xDesired;
	int yDesired;

	ASSERT(pBitmap->m_hObject != NULL);
	pBitmap->GetBitmap(&bmpInfo);
	
	pOld = memDC.SelectObject((CBitmap*) pBitmap);
	if (pOld == NULL) return;
	
	Width = (bmpInfo.bmWidth - rc.Width()) / 2;
	Height = (bmpInfo.bmHeight - rc.Height()) / 2;
	
	if ((nFlags & DB_HCENTER))
	{
		if (Width > 0)
		{
			xDesired = rc.left;
			xSrc = abs(Width);
		}
		else xDesired = rc.left+ abs(Width);
	}
		else xDesired = rc.left;
	
	if ((nFlags & DB_VCENTER))
	{
		if (Height > 0)
		{
			yDesired = rc.top;
			ySrc = abs(Height);
		}
		else yDesired = rc.top + abs(Height);
	} else
		yDesired = rc.top;
	
	pDC->BitBlt(xDesired, yDesired, rc.Width(), rc.Height(), &memDC, xSrc, ySrc, SRCCOPY);
	
	memDC.SelectObject(pOld);	
}

bool CMSNButton::LoadBitmaps(LPCSTR lpszBitmap, LPCSTR lpszBitmapFocus, LPCSTR lpszBitmapDisabled)
{
	m_bitmap.DeleteObject();
	m_bitmapFocus.DeleteObject();
	m_bitmapDisabled.DeleteObject();
	m_bitmapRaised.DeleteObject();
	
	m_bitmap.LoadBitmap(lpszBitmap);

	BOOL bAllLoaded = true;
	if (lpszBitmapFocus)
	{
		if (!m_bitmapFocus.LoadBitmap(lpszBitmapFocus))
			return bAllLoaded = false;
	}
	
	if (lpszBitmapDisabled != NULL)
	{
		if (!m_bitmapDisabled.LoadBitmap(lpszBitmapDisabled))
			return bAllLoaded = false;
	}

	return bAllLoaded ? true : false;
}

void CMSNButton::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{	
	if (nChar == 32)
	{
		if (m_bKeyDown) return;

		m_bKeyDown = true;
		m_bLButtonDown = true;
		m_bRaised = false;
		if (GetFocus() != this)
		{
			SetFocus();
			return;
		}
		Invalidate();
		UpdateWindow();
	}
   	CButton::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CMSNButton::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{	
	if (nChar == 32)
	{
		if (!m_bKeyDown) return;

		m_bKeyDown = false;
		m_bLButtonDown = false;
		m_bRaised = true;
		if (GetFocus() != this)
			SetFocus();
		else
		{
			Invalidate();
			UpdateWindow();
		}
	}
	CButton::OnKeyUp(nChar, nRepCnt, nFlags);
}

void CMSNButton::DrawFocus(BOOL bDrawFocus)
{
	m_bDrawFocus = bDrawFocus;
}

⌨️ 快捷键说明

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