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

📄 cebtnst.cpp

📁 EVC6下非常好的按钮贴图
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"
#include "CeBtnST.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif 

// Mask for control's type
#define BS_TYPEMASK     0x0000001FL		// SS_TYPEMASK
#ifndef WM_MOUSELEAVE
#define WM_MOUSELEAVE   0x02A3
#endif 

#ifndef DestroyCursor
#define DestroyCursor	DestroyIcon
#endif 

CCeButtonST::CCeButtonST()             
{
    m_bIsPressed = FALSE;
    m_bIsFocused = FALSE;
    m_bIsDisabled = FALSE;
    m_bMouseOnButton = FALSE;

    FreeResources(FALSE);

    // Default type is "flat" button
    m_bIsFlat = TRUE;
    // Button will be tracked also if when the window is inactive (like Internet Explorer)
    m_bAlwaysTrack = TRUE;

    // By default draw border in "flat" button 
    m_bDrawBorder = TRUE;

    // By default icon is aligned horizontally
    m_byAlign = ST_ALIGN_HORIZ;

    // By default, for "flat" button, don't draw the focus rect
    m_bDrawFlatFocus = FALSE;

    // By default the button is not the default button
    m_bIsDefault = FALSE;
    // Invalid value, since type still unknown
    m_nTypeStyle = BS_TYPEMASK;

    // By default the button is not a checkbox
    m_bIsCheckBox = FALSE;
    m_nCheck = 0;

    // Set default colors
    SetDefaultColors(FALSE);

    // No URL defined
    SetURL(NULL);

    // No cursor defined
    m_hCursor = NULL;
    m_hOldCursor = NULL;
	

    // No timer defined
    m_nTimerId = 0;

    // No associated menu
    m_hMenu = NULL;
    m_hParentWndMenu = NULL;
    m_bMenuDisplayed = FALSE;
}

CCeButtonST::~CCeButtonST()
{
    FreeResources();

    // Restore old cursor (if any)
    if (m_hOldCursor)
        ::SetCursor(m_hOldCursor);
    // Destroy the cursor (if any)
    if (m_hCursor)
        ::DestroyCursor(m_hCursor);
    // Destroy the menu (if any)
    if (m_hMenu)
        ::DestroyMenu(m_hMenu);
}

BEGIN_MESSAGE_MAP(CCeButtonST, CButton)
//{{AFX_MSG_MAP(CCeButtonST)
ON_WM_MOUSEMOVE()ON_CONTROL_REFLECT_EX(BN_CLICKED, OnClicked)ON_WM_ENABLE()
    ON_WM_GETDLGCODE()ON_WM_CTLCOLOR()ON_WM_DESTROY()ON_WM_KILLFOCUS()
    ON_WM_ACTIVATE()ON_WM_CANCELMODE()ON_WM_DRAWITEM()ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
//ON_WM_CAPTURECHANGED()
ON_WM_SETCURSOR()ON_MESSAGE(BM_SETSTYLE, OnSetStyle)ON_MESSAGE(WM_MOUSELEAVE,
    OnMouseLeave)END_MESSAGE_MAP()

void CCeButtonST::FreeResources(BOOL bCheckForNULL)
{
    if (bCheckForNULL)
    {
        // Destroy icons
        // Note: the following lines MUST be here! even if
        // BoundChecker says they are unnecessary!
        if (m_csIcons[0].hIcon)
            ::DestroyIcon(m_csIcons[0].hIcon);
        if (m_csIcons[1].hIcon)
            ::DestroyIcon(m_csIcons[1].hIcon);
        if (m_csIcons[2].hIcon)
            ::DestroyIcon(m_csIcons[2].hIcon);
    } // if

    memset(&m_csIcons, 0, sizeof(m_csIcons));
} // End of FreeResources

void CCeButtonST::PreSubclassWindow()
{
    UINT nBS;

    nBS = GetButtonStyle();

    // Set initial control type
    m_nTypeStyle = nBS &BS_TYPEMASK;

    // Check if this is a checkbox
    if (nBS &BS_CHECKBOX)
        m_bIsCheckBox = TRUE;

    // Set initial default state flag
    if (m_nTypeStyle == BS_DEFPUSHBUTTON)
    {
        // Set default state for a default button
        m_bIsDefault = TRUE;

        // Adjust style for default button
        m_nTypeStyle = BS_PUSHBUTTON;
    } // If

    // You should not set the Owner Draw before this call
    // (don't use the resource editor "Owner Draw" or
    // ModifyStyle(0, BS_OWNERDRAW) before calling PreSubclassWindow() )
    ASSERT(m_nTypeStyle != BS_OWNERDRAW);

    // Switch to owner-draw
    ModifyStyle(BS_TYPEMASK, BS_OWNERDRAW, SWP_FRAMECHANGED);

    CButton::PreSubclassWindow();
} // End of PreSubclassWindow

void CCeButtonST::OnDestroy()
{
    // Kill timer
    if (m_nTimerId)
        KillTimer(m_nTimerId);
    m_nTimerId = 0;

    CButton::OnDestroy();
} // End of OnDestroy

UINT CCeButtonST::OnGetDlgCode()
{
    UINT nCode = CButton::OnGetDlgCode();

    // tell the system if we want default state handling
    // (losing default state always allowed)
    nCode |= (m_bIsDefault ? DLGC_DEFPUSHBUTTON : DLGC_UNDEFPUSHBUTTON);

    return nCode;
} // End of OnGetDlgCode

LRESULT CCeButtonST::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    if (message == WM_LBUTTONDBLCLK)
    {
        message = WM_LBUTTONDOWN;
    } // if
    return CButton::DefWindowProc(message, wParam, lParam);
} // End of DefWindowProc

HBRUSH CCeButtonST::OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor)
{
    return (HBRUSH)::GetStockObject(NULL_BRUSH);
} // End of CtlColor

LRESULT CCeButtonST::OnSetStyle(WPARAM wParam, LPARAM lParam)
{
    UINT nNewType = (wParam &BS_TYPEMASK);

    // Update default state flag
    if (nNewType == BS_DEFPUSHBUTTON)
    {
        m_bIsDefault = TRUE;
    } // if
    else if (nNewType == BS_PUSHBUTTON)
    {
        // Losing default state always allowed
        m_bIsDefault = FALSE;
    } // if

    // Can't change control type after owner-draw is set.
    // Let the system process changes to other style bits
    // and redrawing, while keeping owner-draw style
    return DefWindowProc(BM_SETSTYLE, (wParam &~BS_TYPEMASK) | BS_OWNERDRAW,
        lParam);
} // End of OnSetStyle

void CCeButtonST::OnEnable(BOOL bEnable)
{
    CButton::OnEnable(bEnable);

    if (bEnable == FALSE)
    {
        CWnd *pWnd = GetParent()->GetNextDlgTabItem(this);
        if (pWnd)
            pWnd->SetFocus();
        else
            GetParent()->SetFocus();

        CancelHover();
    } // if
} // End of OnEnable

void CCeButtonST::OnKillFocus(CWnd *pNewWnd)
{
    CButton::OnKillFocus(pNewWnd);
    CancelHover();
} // End of OnKillFocus

void CCeButtonST::OnActivate(UINT nState, CWnd *pWndOther, BOOL bMinimized)
{
    CButton::OnActivate(nState, pWndOther, bMinimized);
    if (nState == WA_INACTIVE)
        CancelHover();
} // End of OnActivate

void CCeButtonST::OnCancelMode()
{
    CButton::OnCancelMode();
    CancelHover();
} // End of OnCancelMode

void CCeButtonST::OnLButtonDown(UINT nFlags, CPoint point)
{
    SetState(TRUE);
#if defined(_WIN32_WCE_PSPC) && (_WIN32_WCE >= 300)
    SHRecognizeGesture(point);
#endif // _WIN32_WCE_PSPC
    Default();

    CButton::OnLButtonDown(nFlags, point);
} // End of OnLButtonDown

void CCeButtonST::CancelHover()
{
    // Only for flat buttons
    if (m_bIsFlat)
    {
        // Kill timer (if active)
        if (m_nTimerId)
            KillTimer(m_nTimerId);
        m_nTimerId = 0;

        if (m_bMouseOnButton)
        {
            // Restore old cursor (if any)
            if (m_hOldCursor)
            {
                ::SetCursor(m_hOldCursor);
                m_hOldCursor = NULL;
            } // if

            m_bMouseOnButton = FALSE;
            Invalidate();
        } // if
    } // if
} // End of CancelHover

void CCeButtonST::OnMouseMove(UINT nFlags, CPoint point)
{
    CWnd *wndUnderMouse = NULL;
    CWnd *wndActive = this;

    CButton::OnMouseMove(nFlags, point);

    ClientToScreen(&point);
    wndUnderMouse = WindowFromPoint(point);

    // If the mouse enter the button with the left button pressed then do nothing
    if (nFlags &MK_LBUTTON && m_bMouseOnButton == FALSE)
        return ;

    // If our button is not flat then do nothing   
    if (m_bIsFlat == FALSE)
        return ;

    if (m_bAlwaysTrack == FALSE)
        wndActive = GetActiveWindow();

    if (wndUnderMouse && wndUnderMouse->m_hWnd == m_hWnd && wndActive)
    {
        if (!m_bMouseOnButton)
        {
            m_bMouseOnButton = TRUE;

            Invalidate();

            ASSERT(m_nTimerId == 0);
            m_nTimerId = SetTimer(1, 50, TimerProc);
        } // if
    } //else CancelHover();
} // End of OnMouseMove

// Handler for WM_MOUSELEAVE
LRESULT CCeButtonST::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
    CancelHover();
    return 0;
} // End of OnMouseLeave

BOOL CCeButtonST::OnClicked()
{
    if (m_bIsCheckBox)
    {
        m_nCheck = !m_nCheck;
        Invalidate();
    } // if
    else
    {
        // Handle the menu (if any)
        if (m_hMenu)
        {
            HMENU hSubMenu = NULL;
            CRect rWnd;

            hSubMenu = ::GetSubMenu(m_hMenu, 0);

            GetWindowRect(rWnd);

            m_bMenuDisplayed = TRUE;
            Invalidate();

            ::TrackPopupMenuEx(hSubMenu, 
#ifdef UNDER_CE
            TPM_LEFTALIGN, 
#else 
            TPM_LEFTALIGN,  | TPM_LEFTBUTTON, 
#endif 
            rWnd.left, rWnd.bottom, m_hParentWndMenu, NULL);

            m_bMenuDisplayed = FALSE;
            Invalidate();
        } // if
        else
        {
            // Handle the URL (if any)
            if (_tcslen(m_szURL) > 0)
            {
                SHELLEXECUTEINFO csSEI;

                memset(&csSEI, 0, sizeof(csSEI));
                csSEI.cbSize = sizeof(SHELLEXECUTEINFO);
                csSEI.fMask = SEE_MASK_FLAG_NO_UI;
                csSEI.lpVerb = _T("open");
                csSEI.lpFile = m_szURL;
                csSEI.nShow = SW_SHOWMAXIMIZED;
                ::ShellExecuteEx(&csSEI);
            } // if
        } // else
    } // else

    return FALSE;
} // End of OnClicked

void CCeButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
    CDC *pDC = CDC::FromHandle(lpDIS->hDC);

    // Checkbox?
    if (m_bIsCheckBox)
    {
        m_bIsPressed = (lpDIS->itemState &ODS_SELECTED) || (m_nCheck != 0);
    } // if
    else
    // Normal button OR other button style ...
    {
        m_bIsPressed = (lpDIS->itemState &ODS_SELECTED);

        // If there is a menu and it's displayed, draw the button as pressed
        if (m_hMenu && m_bMenuDisplayed)
            m_bIsPressed = TRUE;
    } // else

    m_bIsFocused = (lpDIS->itemState &ODS_FOCUS);
    m_bIsDisabled = (lpDIS->itemState &ODS_DISABLED);

    CRect itemRect = lpDIS->rcItem;

    pDC->SetBkMode(TRANSPARENT);

    if (m_bIsFlat == FALSE)
    {
        if (m_bIsFocused || m_bIsDefault)
        {
            CBrush br(RGB(0, 0, 0));
            pDC->FrameRect(&itemRect, &br);
            itemRect.DeflateRect(1, 1);
        } // if
    } // if

⌨️ 快捷键说明

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