「C++ & MFC」状态信号灯显示实现

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

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值