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