首先看看效果
然后看如何实现的
自定义类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;
}
}