VC++ 自定义控件
在项目中需要用到信号灯后,于是就自己定义了一个控件,这个控件继承自CStatic.
代码如下:
#pragma once
#include<afxwin.h>
// CCircleStatic
class CCircleStatic : public CStatic
{
DECLARE_DYNAMIC(CCircleStatic)
public:
CCircleStatic();
virtual ~CCircleStatic();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnPaint();
void SetBKColor(COLORREF color);
void SetRect(CRect rect);
private:
ULONG_PTR m_nToken;
// 背景颜色
COLORREF m_BkColor;
// 圆形区域大小
CRect m_Rect;
};
#include "stdafx.h"
#include "HL.h"
#include "CircleStatic.h"
#include <Gdiplus.h>
#pragma comment(lib,"Gdiplus.lib")
using namespace Gdiplus;
// CCircleStatic
IMPLEMENT_DYNAMIC(CCircleStatic, CStatic)
CCircleStatic::CCircleStatic()
{
Gdiplus::GdiplusStartupInput Gdiplus;
Gdiplus::GdiplusStartup(&m_nToken,&Gdiplus,NULL);
m_BkColor = RGB(255,0,0);
m_Rect = CRect(0,0,20,20);
}
CCircleStatic::~CCircleStatic()
{
if(m_nToken)
Gdiplus::GdiplusShutdown(m_nToken);
}
BEGIN_MESSAGE_MAP(CCircleStatic, CStatic)
ON_WM_PAINT()
END_MESSAGE_MAP()
// CCircleStatic 消息处理程序
void CCircleStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CStatic::OnPaint()
Graphics graphics(dc.m_hDC);
Color color;
color.SetFromCOLORREF(m_BkColor);
SolidBrush brush(color);
Rect rect(m_Rect.left,m_Rect.top,m_Rect.Width(),m_Rect.Height());
Color penColor;
penColor.SetFromCOLORREF(RGB(0,0,0));
Pen pen(penColor,2.0);
graphics.DrawEllipse(&pen,rect);
graphics.FillEllipse(&brush,rect);
}
void CCircleStatic::SetBKColor(COLORREF color)
{
m_BkColor = color;
Invalidate(TRUE);
}
void CCircleStatic::SetRect(CRect rect)
{
m_Rect = rect;
}
项目使用效果:
在项目中可以指示一下位机的状态。好了,介绍就到这里了,后续如果有需要还可以扩展。