各位,如果实现当鼠标移动到按钮时顔色改变,移走时又恢复原来的样子,这要用到按钮重绘,就是OWER_DRAW,是不是每一个按钮都要关联变量?但如果有几十个按钮都要实现这种功能,那不是要关联几十个变量?各位有什么解决方法,或者有更好的方法,麻烦说一下,谢谢了

解决方案 »

  1.   

    网上有已写好的类CButtonST,符合LZ的要求,去搜一下下载使用即可
      

  2.   

    仿照QQ登陆时的登陆按钮。
    楼主说按钮很多,可以这么做,关联还是要的。
    UINT butt_id[20];  //记录按钮ID
    CButtonEx butt[20]; //用作关联
    在DDX中写循环for(int i=0; i<20; i++)  DDX...
    重写有两种方式,一是ownerdraw,响应DrawItem消息,重写DrawItem。而是响应PAINT消息,重写OnPaint。
    代码:
    ButtonEx.h#pragma once// CButtonExclass CButtonEx : public CButton
    {
    private:
    bool down;
    int on;
    CString cap;
    public:
    CButtonEx();
    void SetText(CString);
    protected:
    DECLARE_MESSAGE_MAP()
    public:
    afx_msg LRESULT OnMouseHover(WPARAM,LPARAM);
    afx_msg LRESULT OnMouseLeave(WPARAM,LPARAM);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg void OnTimer(UINT_PTR nIDEvent);
    afx_msg void OnPaint();
    };
    ButtonEx.cpp#include "ButtonEx.h"
    #include <atlimage.h>CButtonEx::CButtonEx()
    {
    down = false;
    on = 0;
    }void CButtonEx::SetText(CString text)
    {
    cap = text;
    Invalidate();
    }BEGIN_MESSAGE_MAP(CButtonEx, CButton)
    ON_WM_LBUTTONDOWN()
    ON_WM_LBUTTONUP()
    ON_WM_MOUSEMOVE()
    ON_WM_TIMER()
    ON_WM_PAINT()
    ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)
    ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
    END_MESSAGE_MAP()// CButtonEx 消息处理程序void CButtonEx::OnPaint()
    {
    CPaintDC dc(this);
    CString path;
    if( down )
    path = L"res\\down.png";
    else
    {
    if( on==0 )
    path = L"res\\normal.png";
    else
    path = L"res\\light.png";
    }
    CImage im;
    HRESULT rs = im.Load(path);
    if( FAILED(rs) )
    return;
    RECT rc;
    GetClientRect(&rc);
    im.Draw(dc.GetSafeHdc(),rc);
    if( cap.IsEmpty() )
    return;
    dc.SetBkMode(TRANSPARENT);
    dc.DrawText(cap,&rc,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    }void CButtonEx::OnLButtonDown(UINT nFlags, CPoint point)
    {
    CButton::OnLButtonDown(nFlags, point);
    down = true;
    Invalidate();
    }void CButtonEx::OnLButtonUp(UINT nFlags, CPoint point)
    {
    CButton::OnLButtonUp(nFlags, point);
    down = false;
    on = 1;
    Invalidate();
    }void CButtonEx::OnMouseMove(UINT nFlags, CPoint point)
    {
    CButton::OnMouseMove(nFlags, point);
    if( on==0 )
    {
    on = 1;
    SetTimer(1212,50,NULL);
    }
    }void CButtonEx::OnTimer(UINT_PTR nIDEvent)
    {
    CButton::OnTimer(nIDEvent);
    if( down )
    return;
    CPoint p;
    ::GetCursorPos(&p);
    ScreenToClient(&p);
    CRect rc;
    GetClientRect(&rc);
    if( rc.PtInRect(p) )
    {
    if( on==2 )
    return;
    on = 2;
    PostMessage(WM_MOUSEHOVER);
    }
    else
    PostMessage(WM_MOUSELEAVE);
    }LRESULT CButtonEx::OnMouseHover(WPARAM,LPARAM)
    {
    Invalidate();
    return 0;
    }LRESULT CButtonEx::OnMouseLeave(WPARAM,LPARAM)
    {
    KillTimer(1212);
    down = false;
    on = 0;
    Invalidate();
    return 0;
    }
      

  3.   

    至于图片可以在qq安装文件里面找,loginpanel
      

  4.   

    如果不想关联那么多变量怎么做,毕竟一个对象里放那么多BUTTON类的变量 ,不太好吧