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

📄 flatbutton.cpp

📁 对c++中的各种ui对象进行封装
💻 CPP
字号:
// FlatButton.cpp : implementation file
//////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "FlatButton.h"

// DLL Instance
extern HINSTANCE  m_hInst;
extern HCURSOR    m_hHandCur;

/////////////////////////////////////////////////////////////
// CFlatButton

CFlatButton::CFlatButton()
{
	// 鼠标不在上面
	m_bMouseHover = FALSE;

	// 两种画笔颜色
//	m_rgbText = RGB(0, 0, 128);
	m_rgbText = RGB(0, 0, 0);
	m_rgbDown = RGB(255, 255, 255);

	// 三种画刷颜色
	m_bkHover = RGB(170, 213, 255);
	m_bkActive = RGB(100, 100, 200);
	m_bkColor = GetSysColor(COLOR_3DFACE);
}

CFlatButton::~CFlatButton()
{
}


BEGIN_MESSAGE_MAP(CFlatButton, CButton)
	//{{AFX_MSG_MAP(CFlatButton)
	ON_WM_MOUSEMOVE()
	ON_WM_TIMER()
	ON_WM_SETCURSOR()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFlatButton message handlers

void CFlatButton::DrawItem(LPDRAWITEMSTRUCT lpStruct) 
{
	// 获取文字
	TCHAR  lpText[32];
	GetWindowText(lpText, 32);

	// 获取句柄边界
	HDC  hdc = lpStruct->hDC;
	CRect  rtRect(lpStruct->rcItem);

	// 两种颜色
	COLORREF  rgbPen;
	COLORREF  rgbBrush;

	// 绘制各种状态下的按钮
	if( (lpStruct->itemState & ODS_DISABLED) || 
		(!m_bMouseHover && !(lpStruct->itemState & ODS_SELECTED)) ) 
	{
		rgbBrush = m_bkColor;
		SetTextColor(hdc, m_rgbText);
        rgbPen = GetSysColor(COLOR_3DSHADOW);
	}
	else 
	{
		rgbPen = GetSysColor(COLOR_HIGHLIGHT);
		if( (lpStruct->itemState & ODS_SELECTED) )
		{ 
			rgbBrush = m_bkActive;
			SetTextColor(hdc, m_rgbDown);
		}
		else 
		{
			rgbBrush = m_bkHover;
			SetTextColor(hdc, m_rgbText);
		}
	}

	// Pen and Brush
	HGDIOBJ  hOldPen, hOldBrush;
	HPEN  hNewPen = CreatePen(PS_SOLID, 1, rgbPen);
	HBRUSH  hNewBrush = CreateSolidBrush(rgbBrush);

	hOldPen = SelectObject(hdc, hNewPen);
	hOldBrush = SelectObject(hdc, hNewBrush);

	// 画出Button的效果
	if( (lpStruct->itemState & ODS_FOCUS) )
		Rectangle(hdc, rtRect.left + 1, rtRect.top + 1, 
			rtRect.right - 1, rtRect.bottom - 1);
	else 
		Rectangle(hdc, rtRect.left, rtRect.top, 
			rtRect.right, rtRect.bottom);

	// Button的文字
	if((rtRect.bottom - rtRect.top) & 0x0001) 
		rtRect.top ++;

	SetBkMode(hdc, TRANSPARENT);
	if( !IsWindowEnabled() ) 
		SetTextColor(hdc, RGB(128, 128, 128));

	DrawText( hdc, lpText, -1, rtRect, 
	   DT_SINGLELINE | DT_CENTER | DT_VCENTER);

	if( (lpStruct->itemState & ODS_FOCUS) )
	{
		FrameRect( hdc, rtRect, (HBRUSH) 
		  GetStockObject(BLACK_BRUSH));

         rtRect.DeflateRect(3, 3);
		 DrawFocusRect(hdc, &rtRect);
	}

	// 释放画笔句柄
	SelectObject(hdc, hOldPen);
	DeleteObject(hNewPen);

	// 释放画刷句柄
	SelectObject(hdc, hOldBrush);
	DeleteObject(hNewBrush);
}

void CFlatButton::OnMouseMove(UINT nFlags, CPoint point) 
{
	// 调用Button默认入口
	CButton::OnMouseMove(nFlags, point);

	// 调用Timer,来跟踪Hover事件
	if( !m_bMouseHover ) 
	{
		SetTimer(0x0001, 50, NULL);
		m_bMouseHover = TRUE;
		Invalidate(TRUE);
	}
}

void CFlatButton::OnTimer(UINT nIDEvent) 
{
	if( m_bMouseHover ) 
	{
		POINT  myPos;
		GetCursorPos(&myPos);

		RECT  rtRect;
		GetWindowRect(&rtRect);

		if( !PtInRect(&rtRect, myPos) ) 
		{
			KillTimer(0x0001);
			m_bMouseHover = FALSE;
			Invalidate(TRUE);
		}
	}
}

BOOL CFlatButton::OnSetCursor(CWnd* lpWnd, UINT nHitTest, UINT message) 
{
	// 设置光标
	::SetCursor(m_hHandCur);
	return TRUE;
}

⌨️ 快捷键说明

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