在界面上有一个按钮,当界面加载时按钮上已经load上了一个图标,当鼠标进入按钮时 如何换成换成另一个图标

解决方案 »

  1.   

    你的按钮可以使用CBitmapButton类CBitmapButton* pmyButton = new CBitmapButton();// Create the bitmap button (must include the BS_OWNERDRAW style).
    pmyButton->Create(NULL, WS_CHILD|WS_VISIBLE|BS_OWNERDRAW, 
       CRect(10,10,100,100), pParentWnd, 1);// Load the bitmaps for this button.
    pmyButton->LoadBitmaps(IDB_UP, IDB_DOWN, IDB_FOCUS, IDB_DISABLE); 
      

  2.   

    或者你在父窗口PreTranslateMessage中判断WM_MOUSEMOVE消息的时候,CRect.PtInRect()也是可以的
      

  3.   


    //======================================================================//
    //自定义MyImageButton类
    //======================================================================//#define BTN_STATE_NORMAL 0
    #define BTN_STATE_HOVER 1
    #define BTN_STATE_PRESS 2
    #define BTN_STATE_UNABLE 3#define WM_MY_MESSAGE_LBUTTON_DOWN WM_USER+1001class MyImageButton : public CButton
    {
    protected:
    CImage* m_pImage; //CImage指针
    int m_nFrameNum; //按键图片有几帧,最少3帧
    BOOL m_bTracking;
    public:
    int m_nState;
    COLORREF m_clrTransparent;
    CRect m_rtImageRect; //图片显示大小 MyImageButton();
    ~MyImageButton(); DECLARE_MESSAGE_MAP()
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    afx_msg void OnMouseLeave();
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);public:
    virtual BOOL CreateMIB(CWnd * pcwnd, CString strImagePath, int nFrameNum, CRect rtShow, UINT nID); void SetButtonState(int nState);
    };
      

  4.   


    //======================================================================//
    //自定义MyImageButton类
    //======================================================================//
    MyImageButton::MyImageButton()
    {
    m_pImage = new CImage();
    }MyImageButton::~MyImageButton()
    {
    if (NULL != m_pImage)
    {
    m_pImage->Destroy();
    }
    delete m_pImage;
    }BEGIN_MESSAGE_MAP(MyImageButton, CButton)
    ON_WM_MOUSEMOVE()
    ON_WM_LBUTTONDOWN()
    ON_WM_LBUTTONUP()
    ON_WM_MOUSELEAVE()
    ON_WM_ERASEBKGND()
    END_MESSAGE_MAP()BOOL MyImageButton::CreateMIB(CWnd * pcwnd, CString strImagePath, int nFrameNum, CRect rtShow, UINT nID)
    {
    m_pImage->Load(strImagePath);//载入资源
    if (m_pImage->IsNull())
    {
    AfxMessageBox("加载图片失败\r\n" + strImagePath);
    return FALSE;
    }
    m_nFrameNum = nFrameNum;
    m_nState = BTN_STATE_NORMAL;
    m_bTracking = FALSE;
    m_clrTransparent = RGB(255,0,255);
    m_rtImageRect.left = 0;
    m_rtImageRect.top = 0;
    m_rtImageRect.right= rtShow.right;
    m_rtImageRect.bottom = rtShow.bottom; CRect _rt;
    _rt.left = rtShow.left;
    _rt.right = rtShow.left + rtShow.right;
    _rt.top = rtShow.top;
    _rt.bottom = rtShow.top + rtShow.bottom; return this->Create("", WS_CHILD|WS_VISIBLE|BS_OWNERDRAW|WS_TABSTOP|BS_PUSHBUTTON, _rt, pcwnd, nID);
    }void MyImageButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
    {
    CDC* pDC = CDC::FromHandle(lpDIS->hDC);
    CRect _rt;
    this->GetClientRect(_rt); UINT _nState = lpDIS->itemState; //获取状态
    if (_nState&ODS_DISABLED)
    {
    if (m_nFrameNum >= 4)
    {
    m_nState = BTN_STATE_UNABLE;
    }
    }
    else
    {
    if (BTN_STATE_UNABLE == m_nState)
    {
    m_nState = BTN_STATE_NORMAL;
    }
    } CDC dcBuffer;//后台缓存
    dcBuffer.CreateCompatibleDC(pDC);
    CBitmap dfbmp;//设置后台缓存大小
    dfbmp.CreateCompatibleBitmap(pDC,_rt.right,_rt.bottom);
    dcBuffer.SelectObject(&dfbmp);
    dcBuffer.FillRect(&_rt, &CBrush(m_clrTransparent));
    dcBuffer.SetBkMode(TRANSPARENT); if (!m_pImage->IsNull())
    {
    m_pImage->Draw(dcBuffer.m_hDC, _rt.left, _rt.top, _rt.right, _rt.bottom,
    m_nState * m_rtImageRect.right, 0, m_rtImageRect.right, m_rtImageRect.bottom);
    } pDC->TransparentBlt(0,0,_rt.right,_rt.bottom,&dcBuffer,0,0,_rt.right,_rt.bottom,m_clrTransparent);//将后台缓冲COPY到前台
    }void MyImageButton::OnMouseMove(UINT nFlags, CPoint point)
    {
    // TODO: Add your message handler code here and/or call default if(!m_bTracking) 
    {
    TRACKMOUSEEVENT tme; 
    tme.cbSize = sizeof(tme); 
    tme.hwndTrack = m_hWnd; 
    tme.dwFlags = TME_LEAVE; 
    tme.dwHoverTime = 0; 
    m_bTracking = _TrackMouseEvent(&tme); 
    } if (BTN_STATE_NORMAL == m_nState)
    {
    m_nState = BTN_STATE_HOVER;
    this->Invalidate();
    } CButton::OnMouseMove(nFlags, point);
    }void MyImageButton::OnMouseLeave()
    {
    // TODO: Add your message handler code here and/or call default
    m_bTracking = FALSE;
    m_nState = BTN_STATE_NORMAL;
    this->Invalidate();
    CButton::OnMouseLeave();
    }void MyImageButton::OnLButtonDown(UINT nFlags, CPoint point)
    {
    // TODO: Add your message handler code here and/or call default
    m_nState = BTN_STATE_PRESS;
    this->Invalidate();
    CWnd *pcwnd = this->GetParent();
    pcwnd->PostMessage(WM_MY_MESSAGE_LBUTTON_DOWN,0,this->GetDlgCtrlID());
    CButton::OnLButtonDown(nFlags, point);
    }void MyImageButton::OnLButtonUp(UINT nFlags, CPoint point)
    {
    // TODO: Add your message handler code here and/or call default
    if (BTN_STATE_PRESS == m_nState)
    {
    m_nState = BTN_STATE_HOVER;
    this->Invalidate();
    } CButton::OnLButtonUp(nFlags, point);
    }BOOL MyImageButton::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: Add your message handler code here and/or call default
    return TRUE;
    //return CButton::OnEraseBkgnd(pDC);
    }void MyImageButton::SetButtonState(int nState)
    {
    if (nState != m_nState)
    {
    m_nState = nState;
    this->Invalidate();
    }
    }
      

  5.   

    CBitmapButton类只能加载BMP,CImage可以加载PNG,JPG等格式图片
      

  6.   

    处理WM_MOUSEHOVER,不过你的要求象2L那样使用CBitmapButton最佳。
      

  7.   


    CBitmapButton能不能用路径 加载多个位图啊
      

  8.   

    我写的类,整个BUTTON就是图片,按键的字也在图片上,图片有要求,必须是几个状态连在一起的(普通,悬浮,按下,不可用)头文件
    MyImageButton   m_mibMin;
    afx_msg void OnBnClickedMin();
    CPP文件
    #define IDC_BTN_MIN WM_USER + 5
    BEGIN_MESSAGE_MAP(MyLogonDlg, CDialogEx)
    ON_BN_CLICKED(IDC_BTN_MIN, &MyLogonDlg::OnBnClickedMin)
    END_MESSAGE_MAP()
    m_mibMin.CreateMIB(this,theApp.m_strPath + "\\res\\logon_btn_min.png",3,CRect(187,0,23,20),IDC_BTN_MIN);这是使用方法,路径那你自己改吧。
    CreateMIB(父窗口指针,图片路径,图片帧数(最少3),CRect前两个值是坐标 后两个是一帧图片的长宽,最后一个是空间ID)