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

📄 cchecksk.cpp

📁 这是一个比较好的实现较理想的界面的例子
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 OVER IT
    //  .......................................................................
    CBrush brushForeGnd;
    CPen pen;
    if ( m_bMouseOver )
    {
        brushForeGnd.CreateSolidBrush (::GetSysColor(COLOR_BTNHILIGHT));
        pen.CreatePen (PS_SOLID, 1, RGB(0,0,0));
        pOldBrush = pDC->SelectObject (&brushForeGnd);
        pOldPen = pDC->SelectObject(&pen);

        CPoint pt (4,4);
        pDC->RoundRect (&rectItem, pt);
        rectItem.DeflateRect (2,2);
    }
    else
    {
        brushForeGnd.CreateSolidBrush (::GetSysColor(COLOR_3DFACE));
        pen.CreatePen (PS_SOLID, 1, ::GetSysColor(COLOR_3DFACE));
        pOldBrush = pDC->SelectObject (&brushForeGnd);
        pOldPen = pDC->SelectObject(&pen);

        pDC->Rectangle(&rectItem);
        rectItem.DeflateRect (2,2);
    }

    //  .......................................................................
    //  IF CHECK BOX HAS FOCUS DRAW THE FOCUS BOX
    //  .......................................................................
    if (m_bIsFocussed)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -