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

📄 advbutton.cpp

📁 一个用VC写的计算器
💻 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 + -