1.在工具箱拉一个 Control控件
2.右键属性更改ID为xxxStatus
3.右键解决方案—添加资源—点击Bitmap选择导入—选中准备好并放在项目res文件夹中的位图:red.bmp、green.bmp 分别命名为IDB_RED_BITMAP ,IDB_GREEN_BITMAP(文件类型选择所有文件不然可能显示不出来准备的位图)
5.添加一个继承于CButton的类CRoundButton
类的.h文件如下:
#pragma once
#include <afxwin.h>
class CRoundButton :
public CButton
{
DECLARE_DYNAMIC(CRoundButton)
public:
CRoundButton();
virtual ~CRoundButton();
protected:
DECLARE_MESSAGE_MAP()
virtual void PreSubclassWindow();
public:
virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
void colorChange(bool sign);
bool colChangeSign = false;
};
类的.cpp文件如下:
#include "pch.h"
#include "CRoundButton.h"
#include"Page1.h"
#include"Resource.h"
// CRoundButton
IMPLEMENT_DYNAMIC(CRoundButton, CButton)
CRoundButton::CRoundButton()
{
}
CRoundButton::~CRoundButton()
{
}
BEGIN_MESSAGE_MAP(CRoundButton, CButton)
END_MESSAGE_MAP()
// CRoundButton 消息处理程序
//该函数可以初始化子类窗口,做一些绘制子类窗口之前要做的事情,如按钮风格的修改,按钮形状的修改。
void CRoundButton::PreSubclassWindow() //框架调用这个成员函数以允许在窗口被子类化之前进行其它必要的子类化。重载这个函数以允许控件的动态子类化。
{
// TODO: 在此添加专用代码和/或调用基类
this->ModifyStyle(0, BS_OWNERDRAW); //改为自绘风格 也可再按钮控件属性中将Owner Draw 设置为True
CButton::PreSubclassWindow();
}
void CRoundButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) //当自定义按钮的可视属性发生变化时,由框架调用本函数(改为了自绘风格)。
{
// TODO: 添加您的代码以绘制指定项
CRect rect;
GetClientRect(rect);//用于接收客户区坐标,left和top成员将被设为0。right和bottom成员将包含了窗口的宽度和高度
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);// Attach(HDC hDC);hDC Windows设备上下文,使用这个函数把hDC附加到CDC对象,CDC就是设备上下文
//设置背景透明
dc.SetBkMode(TRANSPARENT);
//创建一个位图画刷
CBitmap m_Bitmap;
if (!colChangeSign)
m_Bitmap.LoadBitmap(IDB_RED_BITMAP); //使用的是多字节字符集,因此使用LoadBitmapA()函数,UNICODES使用LoadBitmapW
else
m_Bitmap.LoadBitmap(IDB_GREEN_BITMAP);
CBrush m_Brush(&m_Bitmap);//声明画刷对象
dc.SelectObject(&m_Brush);
//根据位图大小设置按钮显示区域
HRGN h_rgn = CreateEllipticRgn(0, 0, rect.Width(), rect.Height()); //计算按钮的显示区域
SetWindowRgn(h_rgn, true);//设置按钮的显示区域
dc.Ellipse(0, 0, rect.Width(), rect.Height());//绘制按钮
}
void CRoundButton::colorChange(bool sign)
{
colChangeSign = sign;
}
4.右键控件添加类型为CRoundButton的变量m_xxxStatus
5.在控件所在对话框的.cpp文件中包含头文件CRoundButton.h
#include"CRoundButton.h"
6.然后在你想要根据判断标志位进行状态显示的位置添加如下代码
if (bIsCom1start)
{
m_NetworkStatus.colorChange(true); //true 绿 false 红
m_NetworkStatus.Invalidate(); //按钮更新
}
else
{
m_NetworkStatus.colorChange(false); //true 绿 false 红
m_NetworkStatus.Invalidate(); //按钮更新
}
7.由于本文章基于自己所写的程序,所以请对应删改响应语句实现自己的程序内容
8.位图资源下面的百度云链接获取
链接:https://pan.baidu.com/s/1Pyg2M8BI8n_3FomM0yxs_w
提取码:jkwd