⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ledctrl.cpp

📁 AGV小车上位机控制程序,通过TCP/IP协议来进行数据的传送
💻 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 + -