rtbutton.cpp
来自「vc++编写的界面源代码,对C++爱好者是很发的帮助。」· C++ 代码 · 共 253 行
CPP
253 行
// RTButton.cpp : 实现文件
//
#include "stdafx.h"
#include "RTButton.h"
#include "RTDraw.h"
// CRTButton
IMPLEMENT_DYNAMIC(CRTButton, CButton)
CRTButton::CRTButton()
{
m_ButtonState = StateNormal;
m_MouseState = MouseStateNormal;
}
CRTButton::~CRTButton()
{
}
CBitmap* CRTButton::m_ButtonBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
UINT CRTButton::m_ButtonDrawMode[5] = {0,0,0,0,0};
BOOL CRTButton::m_IsEnableSkin = TRUE;
BEGIN_MESSAGE_MAP(CRTButton, CButton)
ON_WM_PAINT()
ON_MESSAGE(WM_MOUSEMOVE,OnRTMouseMove)
ON_MESSAGE(WM_LBUTTONDOWN,OnRTLButtonDown)
ON_MESSAGE(WM_LBUTTONUP,OnRTLButtonUp)
ON_MESSAGE(WM_LBUTTONDBLCLK,OnRTLButtonDBClick)
END_MESSAGE_MAP()
// CRTButton 消息处理程序
void CRTButton::EnableSkin(BOOL IsEnable)
{
m_IsEnableSkin = IsEnable;
}
void CRTButton::OnPaint()
{
if(!m_IsEnableSkin)CButton::OnPaint();
DWORD style = GetStyle();
if((style & BS_PUSHBUTTON) != BS_PUSHBUTTON)
return CButton::OnPaint();
CPaintDC dc(this);
RTDrawButton(&dc);
}
LRESULT CRTButton::OnRTLButtonDown(WPARAM wParam,LPARAM lParam)
{
if(!m_IsEnableSkin)return DefWindowProc(WM_LBUTTONDOWN,wParam,lParam);
m_ButtonState = StateDown;
m_MouseState = MouseStateDown;
CClientDC dc(this);
RTDrawButton(&dc);
return 0;
}
LRESULT CRTButton::OnRTLButtonUp(WPARAM wParam,LPARAM lParam)
{
if(!m_IsEnableSkin)return DefWindowProc(WM_LBUTTONUP,wParam,lParam);
ReleaseCapture();
m_ButtonState = StateNormal;
m_MouseState = MouseStateNormal;
CClientDC dc(this);
RTDrawButton(&dc);
CRect rtButton;
GetWindowRect(&rtButton);
rtButton.SetRect(0,0,rtButton.Width(),rtButton.Height());
CPoint point(lParam);
if(rtButton.PtInRect(point))
{
CWnd *Parent = GetParent();
if(Parent != NULL)Parent->SendMessage(WM_COMMAND,MAKEWPARAM(GetDlgCtrlID(),BN_CLICKED),(LPARAM)m_hWnd);
}
return 0;
}
LRESULT CRTButton::OnRTMouseMove(WPARAM wParam,LPARAM lParam)
{
if(!m_IsEnableSkin)return DefWindowProc(WM_MOUSEMOVE,wParam,lParam);
CRect rtButton;
GetWindowRect(&rtButton);
rtButton.SetRect(0,0,rtButton.Width(),rtButton.Height());
CPoint point(lParam);
if(wParam == MK_LBUTTON)
{
if(rtButton.PtInRect(point))
{
if(m_ButtonState != StateDown)
{
m_ButtonState = StateDown;
CClientDC dc(this);
RTDrawButton(&dc);
}
}
else
{
if(m_ButtonState == StateDown)
{
m_ButtonState = StateNormal;
CClientDC dc(this);
RTDrawButton(&dc);
}
}
}
else
{
if(rtButton.PtInRect(point))
{
if(m_ButtonState != StateFocus)
{
SetCapture();
m_ButtonState = StateFocus;
CClientDC dc(this);
RTDrawButton(&dc);
}
}
else
{
if(m_ButtonState == StateFocus)
{
m_ButtonState = StateNormal;
CClientDC dc(this);
RTDrawButton(&dc);
ReleaseCapture();
}
}
}
return 0;
}
LRESULT CRTButton::OnRTLButtonDBClick(WPARAM wParam,LPARAM lParam)
{
if(!m_IsEnableSkin)return DefWindowProc(WM_MBUTTONDBLCLK,wParam,lParam);
return 0;
}
void CRTButton::RTDrawButton(CDC *pDC)
{
CRect rtText;
CRect rtWnd;
GetClientRect(&rtText);
CString ItemText;
GetWindowText(ItemText);
int OldBack = pDC->SetBkMode(TRANSPARENT);
COLORREF OldText = pDC->SetTextColor(0xFFFF);
CFont* pFont = GetFont();
CFont* pOldFont = pDC->SelectObject(pFont);
DWORD style = GetStyle();//GetButtonStyle();
UINT uFormat = 0;
if((style & BS_MULTILINE) != BS_MULTILINE)
uFormat |= DT_SINGLELINE;
if((style & BS_TOP) == BS_TOP)
uFormat |= DT_TOP;
else if((style & BS_BOTTOM) == BS_BOTTOM)
uFormat |= DT_BOTTOM;
else
uFormat |= DT_VCENTER | DT_SINGLELINE;
if((style & BS_LEFT) == BS_LEFT)
uFormat |= DT_LEFT;
else if((style & BS_RIGHT) == BS_RIGHT)
uFormat |= DT_RIGHT;
else
uFormat |= DT_CENTER;
uFormat |= DT_END_ELLIPSIS;
if(style & WS_DISABLED)
{
m_ButtonState = StateDisable;
if(!CRTDraw::RTDrawBitmap(pDC,&rtText,m_ButtonBitmap[BMP_DISABLE],m_ButtonDrawMode[BMP_DISABLE]))
{
pDC->DrawEdge(&rtText,BDR_RAISEDINNER,BF_RECT);
}
COLORREF ColorWhite = GetSysColor(COLOR_BTNTEXT);
COLORREF ColorGray = GetSysColor(COLOR_BTNSHADOW);
pDC->SetTextColor(ColorWhite);
pDC->DrawText(ItemText,&rtText,uFormat);
rtText.top += 1;
rtText.left += 1;
pDC->SetTextColor(ColorGray);
pDC->DrawText(ItemText,&rtText,uFormat);
return;
}
if(m_ButtonState == StateNormal)
{
if(!CRTDraw::RTDrawBitmap(pDC,&rtText,m_ButtonBitmap[BMP_NORMAL],m_ButtonDrawMode[BMP_NORMAL]))
{
pDC->DrawEdge(&rtText,BDR_RAISEDINNER,BF_RECT);
}
}
else if(m_ButtonState == StateFocus)
{
if(!CRTDraw::RTDrawBitmap(pDC,&rtText,m_ButtonBitmap[BMP_FOCUS],m_ButtonDrawMode[BMP_FOCUS]))
{
pDC->DrawEdge(&rtText,BDR_RAISEDINNER,BF_RECT);
}
}
else
{
if(!CRTDraw::RTDrawBitmap(pDC,&rtText,m_ButtonBitmap[BMP_DOWN],m_ButtonDrawMode[BMP_DOWN]))
{
pDC->DrawEdge(&rtText,BDR_SUNKENOUTER,BF_RECT);
}
}
COLORREF ColorWhite = GetSysColor(COLOR_BTNTEXT);
pDC->SetTextColor(ColorWhite);
pDC->DrawText(ItemText,&rtText,uFormat);
pDC->SelectObject(pOldFont);
pDC->SetBkMode(OldBack);
pDC->SetTextColor(OldText);
}
void CRTButton::SetButtonBitmap(CBitmap* ButtonBitmap[],UINT DrawMode[])
{
for(int i = 0; i < 5; i ++)
{
m_ButtonBitmap[i] = ButtonBitmap[i];
m_ButtonDrawMode[i] = DrawMode[i];
}
}
LRESULT CRTButton::OnRTMouseLeave(WPARAM wParam,LPARAM lParam)
{
if(!m_IsEnableSkin)return DefWindowProc(WM_MOUSELEAVE,wParam,lParam);
return 0;
}
LRESULT CRTButton::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
return CButton::WindowProc(message, wParam, lParam);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?