#include "stdafx.h"
#include "CCheckSK.h"
CCheckSK::CCheckSK()
{
m_bCheck = FALSE;
m_bMouseOver = FALSE;
m_nLedSize = 15;
// set default color to green on ON and dark-green on OFF
m_colLedOn = RGB(0, 255, 0);
m_colLedOff = RGB(0, 127, 0);
m_hIconOn.hIcon = NULL;
m_hIconOff.hIcon = NULL;
m_tooltip.Create (this);
}
CCheckSK::~CCheckSK()
{
}
BEGIN_MESSAGE_MAP(CCheckSK, CButton)
//{{AFX_MSG_MAP(CCheckSK)
ON_WM_MOUSEMOVE()
ON_CONTROL_REFLECT(BN_CLICKED, OnClicked)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(BM_SETCHECK, OnSetCheck)
ON_MESSAGE(BM_GETCHECK, OnGetCheck)
END_MESSAGE_MAP()
// ===========================================================================
// Set check status of control
// ===========================================================================
void
CCheckSK::SetCheck(BOOL bCheck, BOOL bRepaint)
{
m_bCheck = bCheck;
if (bRepaint) Invalidate();
}
// ===========================================================================
// Return check status of control
// ===========================================================================
BOOL
CCheckSK::GetCheck()
{
return m_bCheck;
}
// ===========================================================================
// Set Icon from resource ID
// ===========================================================================
DWORD
CCheckSK::SetIcon(int nIconOn, int nIconOff)
{
HICON hIconOn = NULL;
HICON hIconOff = NULL;
HINSTANCE hInstResource = NULL;
// Find correct resource handle
hInstResource = AfxFindResourceHandle ( MAKEINTRESOURCE(nIconOn),
RT_GROUP_ICON);
// Set icon when the mouse is IN the button
hIconOn = ::LoadIcon(hInstResource, MAKEINTRESOURCE(nIconOn));
hIconOff = ::LoadIcon(hInstResource, MAKEINTRESOURCE(nIconOff));
return SetIcon(hIconOn, hIconOff);
}
// ===========================================================================
// Set Icon from file
// ===========================================================================
DWORD
CCheckSK::SetIcon(LPCTSTR lpszFileNameIn, LPCTSTR lpszFileNameOut)
{
HICON hIconOn = NULL;
HICON hIconOff = NULL;
hIconOn = (HICON)::LoadImage ( 0, lpszFileNameIn, IMAGE_ICON, 0, 0,
LR_LOADFROMFILE);
hIconOff = (HICON)::LoadImage ( 0, lpszFileNameOut, IMAGE_ICON, 0, 0,
LR_LOADFROMFILE);
return SetIcon(hIconOn, hIconOff);
}
// ===========================================================================
// Set bitmap from handle to open bitmap. This is ultimtely called by the
// SetIcon for file and resource ID
// ===========================================================================
DWORD
CCheckSK::SetIcon(HICON hIconOn, HICON hIconOff)
{
BOOL bRetValue;
ICONINFO ii;
// Free any loaded resource
FreeResources();
// =======================================================================
// Load icon for check box ON state
// =======================================================================
if (hIconOn)
{
// set the icon when mouse over button?
m_hIconOn.hIcon = hIconOn;
// Get icon dimension
::ZeroMemory(&ii, sizeof(ICONINFO));
bRetValue = ::GetIconInfo(hIconOn, &ii);
if (bRetValue == FALSE)
{
FreeResources();
return ICNST_INVALIDRESOURCE;
}
// hotspot is always defined to be the center of the icon
m_hIconOn.dwWidth = (DWORD)(ii.xHotspot * 2);
m_hIconOn.dwHeight = (DWORD)(ii.yHotspot * 2);
::DeleteObject(ii.hbmMask);
::DeleteObject(ii.hbmColor);
}
// =======================================================================
// Load icon for check box OFF state
// =======================================================================
if (hIconOff)
{
m_hIconOff.hIcon = hIconOff;
// Get icon dimension
::ZeroMemory(&ii, sizeof(ICONINFO));
bRetValue = ::GetIconInfo(hIconOff, &ii);
if (bRetValue == FALSE)
{
FreeResources();
return ICNST_INVALIDRESOURCE;
}
m_hIconOff.dwWidth = (DWORD)(ii.xHotspot * 2);
m_hIconOff.dwHeight = (DWORD)(ii.yHotspot * 2);
::DeleteObject(ii.hbmMask);
::DeleteObject(ii.hbmColor);
}
Invalidate();
return 1;
}
// ...........................................................................
// This method is called when mouse leaves the control. See _TrackMouseEvent
// ...........................................................................
LRESULT
CCheckSK::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
CancelHover();
return 0;
}
// ...........................................................................
// BM_SETCHECK message handler
// ...........................................................................
LRESULT
CCheckSK::OnSetCheck(WPARAM wParam, LPARAM lParam)
{
switch (wParam)
{
case BST_CHECKED:
case BST_INDETERMINATE: // Indeterminate state is handled like checked state
SetCheck(1);
break;
default:
SetCheck(0);
break;
}
return 0;
}
// ...........................................................................
// BM_GETCHECK message handler
// ...........................................................................
LRESULT
CCheckSK::OnGetCheck(WPARAM wParam, LPARAM lParam)
{
return GetCheck();
}
// ...........................................................................
// Change control style in this function
// ...........................................................................
void
CCheckSK::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();
}
// ...........................................................................
// This function is called when the control needs to be drawn
// ...........................................................................
void
CCheckSK::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);
// .......................................................................
// GET BUTTON CONDITION
// .......................................................................
m_bIsPressed = (lpDIS->itemState & ODS_SELECTED);
m_bIsFocussed = (lpDIS->itemState & ODS_FOCUS);
m_bIsDisabled = (lpDIS->itemState & ODS_DISABLED);
// .......................................................................
// GIVE COLOR TO CHECK BOX BASED ON WHETHER THE MOUSE IS O
- 1
- 2
- 3
- 4
- 5
前往页