用于报警功能的STATIC类

2025-12-10 0 501

跟江川一起学习制作用于报警功能的STATIC类 作者 戚高

介绍
报警控制在各种工业控制系统中是经常见到的,一般用于报警的方法有很多,有用文本标示,有用图形表示的,其原理不外乎构造CDC类对象然后利用提供的各种基本图元属性进行图形绘制就可以了.这里我们来制作一个能够显示报警文本,当出现某个报警的时候我们然背景进行闪烁就可以实现功能了.

正文
一般进行此类处理的方法我们常用派生的方法去实现.
首先利用VC向导建立一个基于对话框的工程.
然后在对话框界面上我们放置一个STATIC控件,并设置好位置.
为我们的STATIC控件派生一个命名为CStaticRectangle的基于CStatic的类
基本准备工作完成了,我们下一步的任务就是相新派生类里面添加内容达到我们预想的报警的画面的效果.
根据我上一遍文章所叙,采用双缓冲的方法,我们要将MemDC.h,AutoFont.h,AutoFont.cpp三个文件加入工程.AutoFont 类是现在网络上面的关于CFont类的比较好的封装,使用者在创建CFont对象时不用考虑复杂的创建API函数,只需要进行几个简单的参数设置就可以完成功能,所以我们这里用这个类来实现报警文本的字体控制.

定义对象
//颜色的定义各位可以根据实际情况进行增减
#define COLOR_RED RGB(255,0,0)
#define COLOR_GREEN RGB(0,255,0)

protected:
CBitmap *m_pBitmapOldBackground ;//这三个用于双缓冲绘制
CBitmap m_bitmapBackground ;
CDC m_dcBackground;

CRect m_rectCtrl; // 控件区域
short nMillSec; //定时器
CAutoFont *m_pFnt; //构造报警文本字体

public:
COLORREF m_BkColor;//背景颜色
COLORREF m_TextColor;//文字颜色
CString strText;//显示的报警文本
BOOL bGleam;//是否闪烁

在构造函数里面进行变量的初始化:
CStaticRectangle::CStaticRectangle()
{
m_BkColor = COLOR_RED;
m_TextColor = RGB(255,128,64);
nMillSec = 10;
bGleam = FALSE;

m_pFnt = new CAutoFont("隶书");
m_pFnt->SetHeight(28);
m_pFnt->SetWidth(12);
m_pFnt->SetBold(TRUE);
}
析构函数里面进行内存的释放
CStaticRectangle::~CStaticRectangle()
{
if(m_pFnt)
delete m_pFnt;
}

要进行STATIC报警功能的绘制,我们只需要映射WM_PAINT消息,然后进行界面的重新绘制和文本的显示就可以了
void CStaticRectangle::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
// 获得控件区域
GetClientRect (&m_rectCtrl);

CMemDC memDC(&dc, &m_rectCtrl);

if(m_dcBackground.GetSafeHdc()== NULL|| (m_bitmapBackground.m_hObject == NULL))
{
m_dcBackground.CreateCompatibleDC(&dc);
m_bitmapBackground.CreateCompatibleBitmap(&dc, m_rectCtrl.Width(), m_rectCtrl.Height()) ;
m_pBitmapOldBackground = m_dcBackground.SelectObject(&m_bitmapBackground) ;
}

DrawRectangleBackground(&m_dcBackground, m_rectCtrl);
memDC.BitBlt(0, 0, m_rectCtrl.Width(), m_rectCtrl.Height(),
&m_dcBackground, 0, 0, SRCCOPY) ;
// Do not call CStatic::OnPaint() for painting messages
}

下面时控制相关的信息显示,这里要注意的是我们的文本的显示,这里要计算文本显示的位置.
我们可以通过pDC->GetTextExtent();获得文本的CSize,然后利用控件的rect就可以得到文本的显示位置了.
这里采用的是居中显示的方法.
void CStaticRectangle::DrawRectangleBackground(CDC *pDC, CRect &rect)
{
CBrush brushFill, *pBrushOld;
int nXSize,nYSize;
CSize szText;
CFont *fOldFont;
nXSize = rect.Width();
nYSize = rect.Height();
brushFill.DeleteObject();
brushFill.CreateSolidBrush(m_BkColor);
pBrushOld = pDC->SelectObject(&brushFill);
pDC->Rectangle(rect);
pDC->SetBkColor(m_BkColor);
pDC->SetTextColor(m_TextColor);
fOldFont = (CFont *)pDC->SelectObject(m_pFnt);
szText = pDC->GetTextExtent(strText);
nXSize = (nXSize – szText.cx)/2;
nYSize = (nYSize – szText.cy)/2;
pDC->TextOut(nXSize,nYSize,strText);
pDC->SelectObject(pBrushOld);
pDC->SelectObject(&fOldFont);
brushFill.DeleteObject();
}
如果要实现报警功能,我们就要利用定时器的功能进行定时的背景颜色的更换然后刷新显示.

到此基本工作已经完成了,下面要做的是提供一个用户可以动态修改的接口.
void CStaticRectangle::SetRectangleText(CString strVal)
{
this->strText = strVal;
}

void CStaticRectangle::SetBackColor(UINT nStyle)//设置背景颜色
{
this->m_BkColor = nStyle;
}

void CStaticRectangle::SetBkGleam(BOOL bShow)
{
if(this->bGleam)
{
if(!bShow)
KillTimer(nMillSec);
}
else
{
if(bShow)
SetTimer(nMillSec,750,NULL);
}
this->bGleam = bShow;
}

好现在我们的功能类已经完成,下面要做的是和界面上的CSTATIC联系起来.
通过CLASSWIZARD建立STATIC控件关联变量(Control类型),然后将派生类型修改成我们的CStaticRectangle,加上设置闪烁效果,我们就可以看到效果了

下载源码

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 用于报警功能的STATIC类 https://www.zuozi.net/32326.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务