📄 ledctrl.cpp
字号:
// LEDCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "LEDCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLEDCtrl
CLEDCtrl::CLEDCtrl()
{
m_nLedSize = 13;
m_bCheck = FALSE;
// set default color to green on ON and dark-green on OFF
m_colLedOn = RGB(0, 255, 0);
m_colLedOff = RGB(127, 127, 127);
}
CLEDCtrl::~CLEDCtrl()
{
}
BEGIN_MESSAGE_MAP(CLEDCtrl, CButton)
//{{AFX_MSG_MAP(CLEDCtrl)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLEDCtrl message handlers
void CLEDCtrl::PreSubclassWindow()
{
UINT nBS = GetButtonStyle();
// the button should not be owner draw
ASSERT((nBS & SS_TYPEMASK) != BS_OWNERDRAW);
// This class supports only check boxes
ASSERT(nBS & BS_CHECKBOX);
// Switch to owner-draw
ModifyStyle(SS_TYPEMASK, BS_OWNERDRAW, SWP_FRAMECHANGED);
m_nStyle = GetWindowLong(GetSafeHwnd(), GWL_STYLE);
CButton::PreSubclassWindow();
}
void CLEDCtrl::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
// this class works only for push buttons
ASSERT (lpDIS->CtlType == ODT_BUTTON);
// get the device context pointer to draw into
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
// create brush and pen
CBrush brushLed;
CPen penLed(PS_SOLID,1,RGB(0,0,0));
// .......................................................................
// GET THE BOUNDARY RECTANGLE OF THE BUTTON CONTROL
// .......................................................................
CRect rectItem = lpDIS->rcItem;
CPen* pOldPen;
CBrush* pOldBrush;
pDC->SetBkMode(TRANSPARENT);
// .......................................................................
// GIVE COLOR TO CHECK BOX BASED ON WHETHER THE MOUSE IS OVER IT
// .......................................................................
CBrush brushForeGnd;
CPen pen;
{
brushForeGnd.CreateSolidBrush (::GetSysColor(COLOR_3DFACE));
//brushForeGnd.CreateSolidBrush (RGB(255,255,255));
pen.CreatePen (PS_SOLID, 1, ::GetSysColor(COLOR_3DFACE));
//pen.CreatePen (PS_SOLID, 1, RGB(255,255,255));
pOldBrush = pDC->SelectObject (&brushForeGnd);
pOldPen = pDC->SelectObject(&pen);
pDC->Rectangle(&rectItem);
rectItem.DeflateRect (2,2);
}
rectItem.DeflateRect(1,1);
// .......................................................................
// DRAW THE ON/OFF LED
// .......................................................................
// calculate LED's and text's rectangle
CRect rectLed;
// for text right of led
rectLed.left = rectItem.left;
rectLed.right = rectLed.left + m_nLedSize;
rectItem.left = rectLed.right + 3; // keep a gap of 3 px between text and LED
rectLed.top = (rectItem.Height() - m_nLedSize)/2 + 2;
rectLed.bottom = rectLed.top + m_nLedSize;
if (m_bCheck)
brushLed.CreateSolidBrush (m_colLedOn);
else
brushLed.CreateSolidBrush (m_colLedOff);
pDC->SelectObject(&brushLed);
pDC->SelectObject(&penLed);
// draw the led
pDC->Ellipse(&rectLed);
CPen penLeadAntiAliase (PS_SOLID, 1, m_colLedOff);
pDC->SelectObject(&penLeadAntiAliase);
rectLed.DeflateRect(1,1);
pDC->Ellipse(&rectLed);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
brushLed.DeleteObject();
penLed.DeleteObject();
// .......................................................................
// GET & DISPLAY THE BUTTON TEXT
// .......................................................................
// get the text on the check box
CString sTitle;
GetWindowText(sTitle);
if ( !sTitle.IsEmpty())
{
// ...................................................................
// ALIGN TEXT HORIZONTALLY BASED ON THE STYLE
// ...................................................................
CRect centerRect = rectItem;
UINT uFormat;
// center align
if ((m_nStyle & 0x00000F00) == 0x300)
{
uFormat = DT_WORDBREAK | DT_CENTER | DT_VCENTER;
pDC->DrawText(sTitle, -1, &rectItem, uFormat | DT_CALCRECT);
rectItem.OffsetRect((centerRect.Width() - rectItem.Width())/2,
(centerRect.Height() - rectItem.Height())/2);
}
// right align
else if ((m_nStyle & 0x00000F00) == 0x200)
{
uFormat = DT_WORDBREAK | DT_RIGHT | DT_VCENTER;
pDC->DrawText(sTitle, -1, &rectItem, uFormat | DT_CALCRECT);
rectItem.OffsetRect(centerRect.Width() - rectItem.Width(),
(centerRect.Height() - rectItem.Height())/2);
}
// by default left-align
else // if ((m_nStyle & 0x00000F00) == 0x100)
{
uFormat = DT_WORDBREAK | DT_LEFT | DT_VCENTER;
pDC->DrawText(sTitle, -1, &rectItem, uFormat | DT_CALCRECT);
rectItem.OffsetRect(0, (centerRect.Height() - rectItem.Height())/2);
}
pDC->SetBkMode(TRANSPARENT);
// ...................................................................
// Draw the text
// ...................................................................
pDC->SetTextColor(::GetSysColor(COLOR_BTNTEXT));
pDC->SetBkColor(::GetSysColor(COLOR_BTNFACE));
// draw the text
pDC->DrawText(sTitle, -1, &rectItem, uFormat);
}
// .......................................................................
// Release resources
// .......................................................................
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
penLed.DeleteObject();
brushForeGnd.DeleteObject();
pen.DeleteObject();
brushLed.DeleteObject();
}
BOOL CLEDCtrl::SetLedSize(int nSize)
{
if (nSize < 0)
return FALSE;
else
{
m_nLedSize = nSize;
Invalidate();
return TRUE;
}
}
BOOL CLEDCtrl::SetLedColor(COLORREF colLedOn, COLORREF colLedOff)
{
m_colLedOn = colLedOn;
m_colLedOff = colLedOff;
Invalidate();
return TRUE;
}
void CLEDCtrl::TurnOn(BOOL bOn)
{
m_bCheck=bOn;
Invalidate();
}
BOOL CLEDCtrl::IsLEDOn()
{
return m_bCheck;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -