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

📄 mybtn.cpp

📁 VCsuishu fudai de yixie chengxuyuanma
💻 CPP
字号:
// MyBtn.cpp : implementation file
//

#include "stdafx.h"
#include "MyBtn.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyBtn

CMyBtn::CMyBtn()
{
//	m_shapeClr = ::GetSysColor(COLOR_3DSHADOW);
//	m_frClr = ::GetSysColor(COLOR_3DLIGHT);

	m_shapeClr = RGB(128,128,128);
	m_frClr = RGB(101,225,235);
	
	m_textUpClr = RGB(0,0,0);
//	m_textDownClr = RGB(243,41,82);
	m_textDownClr = RGB(247,49,73);
	
	m_bLButtonDown = FALSE;

	m_nStateNum = 3;//默认为2态 即push button
					//3态,相当与PUSH LIKE属性的复选按钮
	m_nShape = 3;//按钮形状:1---rectangle
						//2---roundRect
					//3---circle
}

CMyBtn::~CMyBtn()
{
}


BEGIN_MESSAGE_MAP(CMyBtn, CWnd)
	//{{AFX_MSG_MAP(CMyBtn)
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_ERASEBKGND()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CMyBtn message handlers

BOOL CMyBtn::Create(CWnd* pParentWnd, UINT ctlID, UINT nID) 
{
	m_ctlID = ctlID;//保存以备后用
	BOOL bResult;
	CRect rect;
	pParentWnd->GetDlgItem(ctlID)->GetWindowRect(&rect);//得到窗口坐标
	pParentWnd->ScreenToClient(&rect);//转换为父窗口内坐标	
	bResult = CWnd::CreateEx( NULL , 
		AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW) ,
		NULL, WS_VISIBLE | WS_CHILD, rect,
		pParentWnd, nID);
	pParentWnd->GetDlgItem(ctlID)->ShowWindow(SW_HIDE);//隐藏基准按钮
	return bResult;
}

void CMyBtn::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	GetParent()->GetDlgItem(m_ctlID)->GetWindowRect(&m_clientRect);
	GetParent()->ScreenToClient(&m_clientRect);
	m_clientRect.DeflateRect(CSize(0,0));//以防止边缘抖动
	MoveWindow(&m_clientRect);//改变自己的位置

	GetClientRect(&m_clientRect);//必须有,因为要得到自己的客户区大小
	//微调大小
	CRect rect1;
	rect1 = m_clientRect;
	if(m_bLButtonDown)
	{
		rect1.DeflateRect(5,5,2,2);
	}
	m_clientRect = rect1;
	if(m_rgn.GetSafeHandle())
	{
		m_rgn.DeleteObject();
	}	
	//确定按钮形状
	switch (m_nShape){
	case 1://rectangle
		break;
	case 2://roundRect
		m_rgn.CreateRoundRectRgn(rect1.left, rect1.top, 
			rect1.right, rect1.bottom, 10, 10 );
		SetWindowRgn(m_rgn, TRUE);//改变自己的形状
		break;
	case 3://circle
		m_rgn.CreateEllipticRgnIndirect(&rect1);
		SetWindowRgn(m_rgn, TRUE);//改变自己的形状
		break;
	}
	
	//自画图---------
	DrawFace(&dc,rect1);//在内存DC中画(内存DC的准备)
	//贴出来
	dc.BitBlt(0,0,m_clientRect.Width(), m_clientRect.Height(),
		&m_memDC,0,0,SRCCOPY );
	// Do not call CWnd::OnPaint() for painting messages
}

void CMyBtn::DrawFace(CDC* pDC,CRect rect)
{
	if(m_memDC.GetSafeHdc())
	{
		m_memDC.DeleteDC();
		m_memBmp.DeleteObject();
	}
	m_memDC.CreateCompatibleDC(pDC);
	m_memBmp.CreateCompatibleBitmap(pDC,rect.Width(),
								rect.Height());		
	m_pOldBmp = m_memDC.SelectObject(&m_memBmp);
	//填充背景----即画阴影
	CBrush shapeBrush(m_shapeClr);
	m_memDC.FillRect(rect, &shapeBrush);
	//画按钮表面
	CBrush frontBrush(m_frClr);
	m_rgn.DeleteObject();
	switch (m_nShape)
	{
	case 1://rectangle
		break;
	case 2://roundRect
		rect.DeflateRect(4,3,8,8);
		m_rgn.CreateRoundRectRgn(rect.left, rect.top, 
			rect.right, rect.bottom, 20, 20 );
		m_memDC.FillRgn(&m_rgn, &frontBrush);
		break;
	case 3://circle
		rect.DeflateRect(3, 3,8,8);
		m_rgn.CreateEllipticRgnIndirect(&rect);	
		m_memDC.FillRgn(&m_rgn, &frontBrush);
		break;
	}
	//处理字**
	CString strText;
	GetParent()->GetDlgItem(m_ctlID)->GetWindowText(strText);//获取按钮标题
	m_memDC.SetBkMode(TRANSPARENT);//字背景透明
	if(m_bLButtonDown)
	{
		m_memDC.SetTextColor(m_textDownClr);
	}
	else
	{
		m_memDC.SetTextColor(m_textUpClr);
	}	
	CSize Extent = m_memDC.GetTextExtent(strText);
	CPoint centerPoint = rect.CenterPoint();
	CPoint pt = CPoint( centerPoint.x - Extent.cx/2, 
						centerPoint.y - Extent.cy/2 );
	m_memDC.TextOut(pt.x, pt.y, strText);
}

void CMyBtn::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	SetCapture();//确保单选

	if(m_nStateNum == 2){//2态
		m_bLButtonDown = TRUE ;
	}
	if(m_nStateNum == 3){//3态
		m_bLButtonDown = !m_bLButtonDown;
	}
//	HWND pHwnd = GetParent()->GetSafeHwnd();
//	::PostMessage(pHwnd,WM_MYBTNLBDOWN,m_ctlID,m_bLButtonDown);

	RedrawWindow();
	CWnd::OnLButtonDown(nFlags, point);
}

void CMyBtn::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_nStateNum == 2){//这里只需要处理2态即可,3态在OnLButtonDown里处理
		m_bLButtonDown = FALSE;	
	}
	
	RedrawWindow();
	
	HWND pHwnd = GetParent()->GetSafeHwnd();
	::PostMessage(pHwnd,WM_MYBTNLBDOWN,m_ctlID,m_bLButtonDown);
	
	ReleaseCapture();

	CWnd::OnLButtonUp(nFlags, point);
}

BOOL CMyBtn::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	return TRUE;
//	return CWnd::OnEraseBkgnd(pDC);
}

void CMyBtn::SetState(int nState)
{
	m_nStateNum = nState;
}

void CMyBtn::SetShape(int nShape)
{
	m_nShape = nShape;
}

void CMyBtn::SetIsSelected(BOOL bSelected)
{
	m_bLButtonDown = bSelected;

	RedrawWindow();
}

void CMyBtn::SetFrontClr(COLORREF frontClr)
{
	m_frClr = frontClr;

	RedrawWindow();
}

void CMyBtn::SetShapeClr(COLORREF shapeClr)
{
	m_shapeClr = shapeClr;

	RedrawWindow();
}

void CMyBtn::SetTextUpClr(COLORREF textUpClr)
{
	m_textUpClr = textUpClr;
}

void CMyBtn::SetTextDownClr(COLORREF textDownClr)
{
	m_textDownClr = textDownClr;
}

⌨️ 快捷键说明

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