VC图标区分故障

首先看看效果



然后看如何实现的

自定义类CSignalStatic

头文件

#define SSTC_STATUS_YES 0
#define SSTC_STATUS_NO  1
#define SSTC_STATUS_DEFAULT 2

class CSignalStatic : public CStatic
{
// Construction
public:
	CSignalStatic();

// Attributes
public:

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CSignalStatic)
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CSignalStatic();

	// Generated message map functions
protected:
	//{{AFX_MSG(CSignalStatic)
	afx_msg void OnPaint();
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()

public:
	CString m_sSignalName;
	CString m_sSignalValue;
	CString m_sSignalUnit;
	int     m_nSignalStatus;
	
	int m_nNameWidth;
	int m_nValueWidth;
	int m_nUnitWidth;
	int m_nStatusWidth;
	int m_nHeight;
	
	DWORD m_dwSignalBgColor;
	DWORD m_dwSignalTxtColor;
	DWORD m_dwNameColor;

	DWORD m_dwStatusColorYes;
	DWORD m_dwStatusColorNo;
	
	LOGFONT m_LogFont;

	void UpdateSignalStatus(int flag);
	void UpdateSignalValue(CString sValue);
};

源文件

CSignalStatic::CSignalStatic()
{
	m_sSignalName = "--";
	m_sSignalValue = "--";
	m_sSignalUnit = "--";
	m_nSignalStatus = SSTC_STATUS_DEFAULT;
	
	m_nStatusWidth = 40;
	m_nHeight = 30;
	
	m_nNameWidth = 80;
	m_nValueWidth = 100;
	m_nUnitWidth = 80;
	
	m_dwSignalBgColor = RGB(0,0,0);
	m_dwSignalTxtColor = RGB(0,255,0);
	m_dwNameColor = RGB(0,0,255);

	m_dwStatusColorYes = RGB(0,0,255);
	m_dwStatusColorNo = RGB(255,0,0);
	
	
	m_LogFont.lfHeight = 20;
	m_LogFont.lfWeight = 400;
	m_LogFont.lfOrientation= 0;
	m_LogFont.lfEscapement = 0;
	m_LogFont.lfWidth = 10;
	m_LogFont.lfItalic = false;
	m_LogFont.lfUnderline = false;
	m_LogFont.lfStrikeOut = false;
	m_LogFont.lfCharSet = GB2312_CHARSET;
	m_LogFont.lfOutPrecision = PROOF_QUALITY;
	m_LogFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
	m_LogFont.lfQuality = PROOF_QUALITY;
	m_LogFont.lfPitchAndFamily = DEFAULT_PITCH;
	strcpy(m_LogFont.lfFaceName,"黑体");
}

CSignalStatic::~CSignalStatic()
{
}


BEGIN_MESSAGE_MAP(CSignalStatic, CStatic)
	//{{AFX_MSG_MAP(CSignalStatic)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CSignalStatic message handlers

void CSignalStatic::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	RECT rect;
	GetClientRect(&rect);

	RECT rt = rect;	
	

	UINT  nFormat;
	HFONT hFont = ::CreateFontIndirect(&m_LogFont);
	HFONT hOldFont = (HFONT)::SelectObject(dc.m_hDC,hFont);
	dc.SetBkMode(TRANSPARENT);

	//name 
	nFormat = DT_SINGLELINE|DT_LEFT|DT_VCENTER|DT_END_ELLIPSIS;
	dc.SetTextColor(m_dwNameColor);//画文字

	rt.right = rt.left + m_nNameWidth;
	rt.bottom  = rt.top + m_nHeight;
	dc.DrawText(m_sSignalName,&rt,nFormat);

	//value
	nFormat = DT_SINGLELINE|DT_LEFT|DT_VCENTER|DT_END_ELLIPSIS;
	rt.left  = rt.right;
	rt.right = rt.left + m_nValueWidth;
	dc.FillSolidRect(&rt,m_dwSignalBgColor);
	dc.SetTextColor(m_dwSignalTxtColor);
	dc.DrawText(m_sSignalValue,&rt,nFormat);

	//unit
	rt.left = rt.right;
	rt.right = rt.left + m_nUnitWidth;
	dc.SetTextColor(m_dwNameColor);
	dc.DrawText(m_sSignalUnit,&rt,nFormat);

	if(SSTC_STATUS_YES == m_nSignalStatus)//画勾
	{
		rt.left = rt.right+ 20;
		rt.right = rt.left + 100;

		int x = 0;
		int y = 0;
		int j = 0;

		CPen pen(PS_SOLID,1,m_dwStatusColorYes);
		dc.SelectObject(&pen);
		x = rt.left + 30;
		y = rt.top + 4;
		j = 0;
		for(j=0;j<16;j++)
		{
			dc.MoveTo(x,y);
			dc.LineTo(x,y+5);
			x--;
			y++;
		}
		for(j=0;j<8;j++)
		{
			dc.MoveTo(x,y);
			dc.LineTo(x,y+5);
			x--;
			y--;
		}
	}
	else if(SSTC_STATUS_NO == m_nSignalStatus)//画叉
	{
		rt.left = rt.right+ 20;
		rt.right = rt.left + 100;

		int x = 0;
		int y = 0;
		int j = 0;
		
		CPen pen(PS_SOLID,3,m_dwStatusColorNo);
		dc.SelectObject(&pen);
		x = rt.left + 25;
		y = rt.top + 4;
		j = 0;
		for(j=0;j<17;j++)
		{
			dc.MoveTo(x,y);
			dc.LineTo(x,y+1);
			x--;
			y++;
		}
		x = rt.left + 25;
		y--;
		for(j=0;j<17;j++)
		{
			dc.MoveTo(x,y);
			dc.LineTo(x,y+1);
			x--;
			y--;
		}
	}
	else//什么都不画
	{
	}
	hFont = (HFONT)::SelectObject(dc.m_hDC,hOldFont);
	::DeleteObject(hFont);
	
	// Do not call CStatic::OnPaint() for painting messages
}

void CSignalStatic::UpdateSignalValue(CString sValue)
{
	m_sSignalValue = sValue;
	
	RECT rect;
	GetClientRect(&rect);
	InvalidateRect(&rect,TRUE);
	
}

void CSignalStatic::UpdateSignalStatus(int flag)
{
	m_nSignalStatus = flag;
	
	RECT rect;
	GetClientRect(&rect);
	InvalidateRect(&rect,TRUE);
}

对话框

头文件

#include "SignalStatic.h"

class CFaultShowBySymbolDlg : public CDialog
{
// Construction
public:
	CFaultShowBySymbolDlg(CWnd* pParent = NULL);	// standard constructor

// Dialog Data
	//{{AFX_DATA(CFaultShowBySymbolDlg)
	enum { IDD = IDD_FAULTSHOWBYSYMBOL_DIALOG };
	CSignalStatic	m_stc5;
	CSignalStatic	m_stc4;
	CSignalStatic	m_stc3;
	CSignalStatic	m_stc2;
	CSignalStatic	m_stc1;
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CFaultShowBySymbolDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	HICON m_hIcon;

	// Generated message map functions
	//{{AFX_MSG(CFaultShowBySymbolDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
private:
	void InitUi();
	CSignalStatic *arrayTest[5];
};

源文件

void CFaultShowBySymbolDlg::InitUi()
{
	m_stc1.m_sSignalName = "名称1";
	m_stc1.m_sSignalUnit = "unit1";

	m_stc2.m_sSignalName = "名称2";
	m_stc2.m_sSignalUnit = "unit2";

	m_stc3.m_sSignalName = "名称3";
	m_stc3.m_sSignalUnit = "unit3";

	m_stc4.m_sSignalName = "名称4";
	m_stc4.m_sSignalUnit = "unit4";

	m_stc5.m_sSignalName = "名称5";
	m_stc5.m_sSignalUnit = "unit5";

	arrayTest[0] = &m_stc1;
	arrayTest[1] = &m_stc2;
	arrayTest[2] = &m_stc3;
	arrayTest[3] = &m_stc4;
	arrayTest[4] = &m_stc5;

	m_stc1.UpdateSignalStatus(SSTC_STATUS_NO);
	m_stc2.UpdateSignalStatus(SSTC_STATUS_NO);
	m_stc3.UpdateSignalStatus(SSTC_STATUS_NO);
	m_stc4.UpdateSignalStatus(SSTC_STATUS_NO);
	m_stc5.UpdateSignalStatus(SSTC_STATUS_NO);
	
	BYTE test_value = 11;
	
	CRect rect;
	
	for (int i=0; i<5; i++)
	{
		if (test_value%2 == 1)
		{
			arrayTest[i]->UpdateSignalStatus(SSTC_STATUS_NO);
		}
		else
		{
			arrayTest[i]->UpdateSignalStatus(SSTC_STATUS_YES);
		}
		arrayTest[i]->GetWindowRect(&rect);
		ScreenToClient(&rect);
		InvalidateRect(&rect,TRUE);
		UpdateWindow();
		
		test_value = test_value/2;
	}
}


源码下载


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值