📄 advbutton.cpp
字号:
// AdvButton.cpp : implementation file
//
#include "stdafx.h"
#include "Calculator.h"
#include "AdvButton.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#define MAXCAPTIONLEN 100
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAdvButton
CAdvButton::CAdvButton()
{//初始化m_ClientRect
m_ClientRect.left=0;
m_ClientRect.top=0;
m_ClientRect.right=0;
m_ClientRect.bottom=0;
m_ClientRgn.DeleteObject();//删除区域对象
m_ClientRgn.CreateEllipticRgnIndirect(&m_ClientRect);//创建椭圆区域
m_State=0;
m_Point.x=m_Point.y=0;
m_IsTimerOn=FALSE;
}
CAdvButton::~CAdvButton()
{
}
// 重载父类Create函数
BOOL CAdvButton::Create(LPCTSTR lpszCaption,DWORD dwStyle,const RECT &rect,CWnd*pParentWnd,UINT nID)
{
return CButton::Create(lpszCaption,dwStyle,rect,pParentWnd,nID);
}
void CAdvButton::PreSubclassWindow()
{
//修改按钮控件风格
ModifyStyle(0,BS_OWNERDRAW|BS_PUSHBUTTON);
CButton::PreSubclassWindow();
}
//当鼠标在按钮的客户区内按下时,改变按钮状态
void CAdvButton::OnLButtonDown(UINT nFlags,CPoint point)
{
//TODO:Add your message handler code here and/or call default
CRect rect;
GetWindowRect(&rect);//得到按钮客户区域的屏幕坐标位置
GetCursorPos(&m_Point);//得到鼠标的屏幕坐标位置
if((rect.PtInRect(m_Point))&&(m_State!=2))
{
m_State=2;//
Invalidate();//重绘客户区
}
CButton::OnLButtonDown(nFlags,point);
}
//当鼠标在按钮的客户区内弹起时,改变按钮状态
void CAdvButton::OnLButtonUp(UINT nFlags,CPoint point)
{
//TODO:Add your message handler code here and/or call defaulr
CRect rect;
GetWindowRect(&rect);//得到按钮客户区域的屏幕坐标位置
GetCursorPos(&m_Point);//得到鼠标的屏幕坐标位置
if((rect.PtInRect(m_Point))&&(m_State!=1))
{
m_State=1;//
Invalidate();//重绘客户区
}
CButton::OnLButtonDown(nFlags,point);
}
//当鼠标在按钮的客户区内移动时,启动计算器
void CAdvButton::OnMouseMove(UINT nFlags,CPoint point)
{
//TODO:Add your message handler code here and/or call default
if(!m_IsTimerOn)// 如果计算器没有启动
{
SetTimer(1000,100,NULL);//启动计算器
m_IsTimerOn=TRUE;//
}
CButton::OnMouseMove(nFlags,point);
}
//计时器消息的响应函数
void CAdvButton::OnTimer(UINT nIDEvent)
{
//TODO:Add your message handler code here and/or call default
CRect rect;
GetWindowRect(&rect);//得到按钮客户区域的屏幕坐标位置
GetCursorPos(&m_Point);//得到鼠标的屏幕坐标位置
if(rect.PtInRect(m_Point))//如果鼠标在按钮的客户区内
{
if((rect.PtInRect(m_Point))&&(m_State!=2))
{
m_State=1;
Invalidate();//
}
}
else{//如果鼠标已经不在按钮的客户区内了
if(m_State!=0){
m_State=0;
Invalidate();//重绘客户区
}
KillTimer(nIDEvent);//关闭计时器
m_IsTimerOn=FALSE;
}
CButton::OnTimer(nIDEvent);
}
// 在按钮控件客户区的绘置函数
void CAdvButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
GetClientRect(&m_ClientRect);//得到窗口的右小矩形区域
m_ClientRgn.DeleteObject();//
m_ClientRgn.CreateEllipticRgnIndirect(&m_ClientRect);//在矩形区域内创建椭圆
//设置窗口的有效区域为椭圆
SetWindowRgn(m_ClientRgn,FALSE);
CDC* pDC=CDC::FromHandle(lpDrawItemStruct->hDC);//得到按钮控件客户区域的设备环境变量指针
CPen* pPen=NULL;
switch(m_State)//根据按钮不同的状态,创建不同的画笔
{
case 0:
pPen=new CPen(PS_SOLID,1,DefaultColor);
break;
case 1:
pPen=new CPen(PS_SOLID,1,FocusColor);
break;
case 2:
pPen=new CPen(PS_SOLID,1,SelectColor);
break;
case 3:
pPen=new CPen(PS_SOLID,1,DesiableColor);
break;
}
pDC->SetBkMode(TRANSPARENT);//设置背景模式为透明
pPen=pDC->SelectObject(pPen);//
pDC->Ellipse(&m_ClientRect); // 在按钮客户区内绘制椭圆
pPen=pDC->SelectObject(pPen);//
if(pPen)delete pPen;
LPTSTR pCaption=new char[MAXCAPTIONLEN]; //
int iLen=GetWindowText(pCaption,MAXCAPTIONLEN);
pDC->SetTextColor(TextColor); //指定文本颜色
//绘制文本,作为按钮标题
pDC->DrawText(pCaption,iLen,&m_ClientRect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
}
int CAdvButton::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CButton::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
BEGIN_MESSAGE_MAP(CAdvButton, CButton)
//{{AFX_MSG_MAP(CAdvButton)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_TIMER()
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAdvButton message handlers
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -