例程图片
继承类H文件
#pragma once
class CRoundButton : public CButton
{
DECLARE_DYNAMIC(CRoundButton)
public:
CRoundButton();
virtual ~CRoundButton();
protected:
DECLARE_MESSAGE_MAP()
public:
virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
virtual void PreSubclassWindow();
void RefreshWindow(BOOL mButtoned);
BOOL m_ButtonSignal;
private:
CBrush m_normalBrush;
CPen m_pen;
CPen m_CheckedPen;
CBrush m_activeBrush;
};
继承类CPP文件
#include "pch.h"
#include "CRoundButton.h"
IMPLEMENT_DYNAMIC(CRoundButton, CButton)
CRoundButton::CRoundButton()
{
m_pen.CreatePen(PS_SOLID, 1, RGB(100, 130, 0));
m_CheckedPen.CreatePen(PS_SOLID,1,RGB(0,130,100));
m_normalBrush.CreateSolidBrush(RGB(255, 50, 0));
m_activeBrush.CreateSolidBrush(RGB(50,255,0));
m_ButtonSignal = FALSE;
}
CRoundButton::~CRoundButton()
{
m_pen.DeleteObject();
m_normalBrush.DeleteObject();
m_activeBrush.DeleteObject();
m_CheckedPen.DeleteObject();
}
BEGIN_MESSAGE_MAP(CRoundButton, CButton)
END_MESSAGE_MAP()
void CRoundButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CString strText{};
CPen* oldPen;
CBrush* oldBrush;
if (m_ButtonSignal)
{
strText = _T("ON");
}
if (!m_ButtonSignal)
{
strText = _T("OFF");
}
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
int nSaveDc = pDC->SaveDC();
if (!m_ButtonSignal)
{
oldBrush=pDC->SelectObject(&m_normalBrush);
oldPen=pDC->SelectObject(&m_pen);
pDC->SetTextColor(RGB(0, 0, 255));
}
else if (m_ButtonSignal)
{
oldBrush = pDC->SelectObject(&m_activeBrush);
oldPen = pDC->SelectObject(&m_CheckedPen);
pDC->SetTextColor(RGB(255, 255, 255));
}
CRect rct = lpDrawItemStruct->rcItem;
pDC->Ellipse(&rct);
pDC->SetBkMode(TRANSPARENT);
CRect textRect;
textRect.CopyRect(&rct);
CSize sz = pDC->GetTextExtent(strText);
textRect.top += (textRect.Height() - sz.cy)/8 ;
pDC->DrawText(strText, textRect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
pDC->RestoreDC(nSaveDc);
pDC->SelectObject(&oldBrush);
pDC->SelectObject(&oldPen);
}
void CRoundButton::PreSubclassWindow()
{
ModifyStyle(0,BS_OWNERDRAW);
CRgn rgn;
CRect rct;
GetClientRect(&rct);
rgn.CreateEllipticRgnIndirect(&rct);
::SetWindowRgn(GetSafeHwnd(),(HRGN)rgn,FALSE);
CButton::PreSubclassWindow();
}
void CRoundButton::RefreshWindow(BOOL mButtoned)
{
m_ButtonSignal = mButtoned;
RedrawWindow();
}
字体颜色设置和按钮状态颜色设置没用做专用接口,实际应用中为每个按钮添加颜色会使得工作亮变大。因此颜色在继承类中提前完成。
应用方法
// 第一步:将类增加到工程文件,在工程文件头文件中增加继承类头文件:
#include "CRoundButton.h"
//第二步:为建立好的按钮增加变量,并将变量类型改为CRoundButton类型,如下所示
CRoundButton m_PathWayA_UpSensor;
//第三步:将按钮设置为禁用,禁用后只做指示灯用途。
//第四步:在工程中设置按钮的状态,如下所示
m_PathWayA_UpSensor.RefreshWindow(TRUE);//打开指示灯
m_PathWayA_UpSensor.RefreshWindow(FALSE);//关闭指示灯