📄 flatbutton.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 + -