图片按钮

本文介绍了一种使用C++及MFC实现自定义图片按钮的方法。该按钮可以根据鼠标的不同状态显示不同的图片区域,并通过消息映射处理鼠标事件,实现按钮的交互效果。
// MyButton.cpp : 实现文件
//

#include "stdafx.h"
#include "03 图片按钮.h"
#include "MyButton.h"


// CMyButton

IMPLEMENT_DYNAMIC(CMyButton, CButton)

CMyButton::CMyButton()
{

}

CMyButton::~CMyButton()
{
}


BEGIN_MESSAGE_MAP(CMyButton, CButton)
    ON_WM_LBUTTONUP()
    ON_WM_LBUTTONDOWN()
    ON_WM_MOUSEMOVE()
    ON_WM_MOUSEHOVER()
    ON_WM_MOUSELEAVE()
END_MESSAGE_MAP()



// CMyButton 消息处理程序


void CMyButton::LoadPicture(
    int nId,
    CRect  rtLeave,
    CRect   rtHover,
    CRect  rtPush)
{
    m_BitMap.LoadBitmap(nId);
    m_rtLeave = rtLeave;
    m_rtHover = rtHover;
    m_rtPush = rtPush;

}

void CMyButton::DrawItem(LPDRAWITEMSTRUCT  lpDrawItemStruct)
{
    
    //FromHandle可以把一个句柄转化为一个对象
    CDC* dc = CDC::FromHandle(lpDrawItemStruct->hDC);
    //dc->TextOut(0,0,TEXT("我是按钮"));
    m_MemDc.CreateCompatibleDC(dc);
    m_MemDc.SelectObject(m_BitMap);

    CRect ButtonRt;
    GetClientRect(ButtonRt);
    if (bIsHover)
    {
        //鼠标按下
        if (bIsPush)
        {
            //dc->TextOut(0, 0, TEXT("鼠标按下"));
            dc->StretchBlt(ButtonRt.left, ButtonRt.top,
                ButtonRt.right, ButtonRt.bottom,
                &m_MemDc,
                m_rtPush.left, m_rtPush.top,
                m_rtPush.Width(), m_rtPush.Height(),
                SRCCOPY);
        }
        //鼠标弹起
        else
        {
            //dc->TextOut(0, 0, TEXT("鼠标弹起"));
            dc->StretchBlt(ButtonRt.left, ButtonRt.top,
                ButtonRt.right, ButtonRt.bottom,
                &m_MemDc,
                m_rtHover.left, m_rtHover.top, m_rtHover.Width(),m_rtHover.Height(),
                SRCCOPY);
        }
    }
    else
    {
        //鼠标没有在按钮上
        //dc->TextOut(0, 0, TEXT("鼠标离开"));
        dc->StretchBlt(ButtonRt.left, ButtonRt.top,
            ButtonRt.right, ButtonRt.bottom,
            &m_MemDc,
            m_rtLeave.left, m_rtLeave.top, m_rtLeave.Width(), m_rtLeave.Height(),
            SRCCOPY);
    }

    m_MemDc.DeleteDC();

    // TODO:  添加您的代码以绘制指定项
}


void CMyButton::OnLButtonUp(UINT nFlags, CPoint point)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    bIsPush = FALSE;
    InvalidateRect(NULL, TRUE);
    CButton::OnLButtonUp(nFlags, point);
}


void CMyButton::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    bIsPush = TRUE;
    InvalidateRect(NULL, TRUE);
    CButton::OnLButtonDown(nFlags, point);
}


void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值

    //捕获鼠标停留以及鼠标离开的消息

    TRACKMOUSEEVENT  tms = {};
    tms.cbSize = sizeof(TRACKMOUSEEVENT);
    tms.dwFlags = TME_HOVER | TME_LEAVE;
    tms.dwHoverTime = 1;
    tms.hwndTrack = this->m_hWnd;
    TrackMouseEvent(&tms);
    CButton::OnMouseMove(nFlags, point);
}


void CMyButton::OnMouseHover(UINT nFlags, CPoint point)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    bIsHover = TRUE;
    InvalidateRect(NULL, TRUE);
    CButton::OnMouseHover(nFlags, point);
}


void CMyButton::OnMouseLeave()
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    bIsHover = FALSE;
    InvalidateRect(NULL, TRUE);
    CButton::OnMouseLeave();
}

 

转载于:https://www.cnblogs.com/Alyoyojie/p/5317198.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值