飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2905|回复: 1

VC按钮绘制 互联型按钮

[复制链接]
  • TA的每日心情
    开心
    2024-6-9 16:20
  • 签到天数: 24 天

    [LV.4]偶尔看看III

    发表于 2007-11-24 17:30:22 | 显示全部楼层 |阅读模式
    按钮互联型,一种简单处理图标按钮的方法,总结如下

    在工程中常常用到这样的按钮,即:第一次点击时按钮呈现一种状态,第二次点击时呈现另一种状态。如图:
       
    有时候甚至要用到几个按钮之间关联着呈现这种状态。所以下面介绍一种相对简单的方法。
    功能:开始时按钮A无效,按钮B有效。点击B,A有效,B有状态1呈现状态2,此时点击A,A有状态1呈现状态2。如此反复。
    重点问题:
    1 按钮之所以呈现不同状态是由于付在按钮上的位图发生变化所致。
    2 位图之所以会变化是由于标志位发生变化所致,标志位是在按钮事件中被重新付值才会发生变化。
    了解了这些就不难了。
    步骤:
    1初始化变量,标志位
    (dlg.h)
    public:
        int     m_nSpeed;//步数标志位
        int  m_nPlayState;//按钮状态标志位
        void ChangeOldPlayBmp();//加载位图函数,可以把这两个写成一个函数,可为了以后扩展方便些了两个,想想看,不会总是只有两个按钮吧
        void ChangeNewPlayBmp();
       
        CButton *m_pBtnPlay;//按钮指针
        CButton *m_pBtnStop; //按钮指针,指针的好处在于可以用他指向很多不同的东西
       
        CBitmap m_BmpPlayb, m_BmpPlayr;    //一个按钮不同的两张状态图
        CBitmap m_BmpStopb,    m_BmpStopr;    //一个按钮不同的两张状态图
        BOOL IsPause;//判断按钮是否被点击,主要用来防止彼此互连时干扰,如果需要复杂的互连,如状态1必须和状态2同步,也可改这里。
    加载需要的位图。
    把按钮上的属性设为:Bitmap
    2初始化
    先定义一组结构,很直观的表现按钮状态,免了很多麻烦。在(.h主体框架类文件继承: public CWinApp的那个)
    typedef enum _tagPlayState{
        PLAY_STOP = 0,
        PLAY_PLAY,
        PLAY_PAUSE,
        PLAY_REVERSE,
    } EPlayState;

    (dlg.cpp)
    初始化Init方法中
        m_nSpeed            = 0;
        IsPause = false;
        m_nPlayState        = PLAY_STOP;
        m_BmpPlayb.LoadBitmap(IDB_BITMAP_Play);//加载位图
        m_BmpStopb.LoadBitmap(IDB_BITMAP2);
        m_BmpPlayr.LoadBitmap(IDB_BITMAP1);
        m_BmpStopr.LoadBitmap(IDB_BITMAP_Pause);
       
        m_pBtnPlay = (CButton*)GetDlgItem(IDC_BtnPlay);//获取按钮指针
        m_pBtnPlay->SetBitmap(m_BmpPlayb);//设置按钮上的图片
        m_pBtnStop = (CButton *)GetDlgItem(IDC_BtnPause);
        m_pBtnStop->SetBitmap(m_BmpStopr);

        m_pBtnPlay->EnableWindow(FALSE);//设置按钮无效
    3编写事件和函数
    (dlg.cpp)
    void CBtnTextDlg::OnBtnPlay()
    {
        if (IsPause) {//下面给出一个入口参数
            m_nPlayState = PLAY_PLAY;
            m_nSpeed = 0;
            IsPause = false;
        }
        if((m_nPlayState == PLAY_PLAY)&&(m_nSpeed==0)){
            
            m_nSpeed = 2;
            m_nPlayState = PLAY_PLAY;
            ChangeNewPlayBmp();
        }else if((m_nPlayState == PLAY_PLAY)&&(m_nSpeed==2)){
            m_nSpeed = 0;
            m_nPlayState = PLAY_PLAY;
            ChangeOldPlayBmp();
        }
    }
    void CBtnTextDlg::ChangeOldPlayBmp()
    {
        if(m_nPlayState == PLAY_PLAY){        
            m_pBtnPlay->SetBitmap(m_BmpPlayb);
        }else if (m_nPlayState == PLAY_STOP) {
            m_pBtnStop->SetBitmap(m_BmpStopb);
        }
        //else if(m_nPlayState == PLAY_REVERSE){//逆再生        
        //    m_pBtnRev->SetBitmap(m_BmpReVB);
    }
    void CBtnTextDlg::ChangeNewPlayBmp()
    {
        if(m_nPlayState == PLAY_PLAY){        
            m_pBtnPlay->SetBitmap(m_BmpPlayr);
        }else if (m_nPlayState == PLAY_STOP) {
            m_pBtnStop->SetBitmap(m_BmpStopr);
        }
    }

    void CBtnTextDlg::OnBtnPause()
    {
        if (IsPause==false) {
            m_nPlayState = PLAY_STOP;
            m_nSpeed = 0;
            IsPause = true;
        }

        if((m_nPlayState == PLAY_STOP)&&(m_nSpeed==0)){
            m_pBtnPlay->EnableWindow(TRUE);
            m_nSpeed = 2;
            m_nPlayState = PLAY_STOP;
            ChangeOldPlayBmp();
        }else if ((m_nPlayState == PLAY_STOP)&&(m_nSpeed==2)) {
        //    ChangeOldPlayBmp();
            m_nSpeed = 0;
            m_nPlayState = PLAY_STOP;
            ChangeNewPlayBmp();   
        }
    }
    成果物:
    1   2   3 点击按钮2
    4 点击按钮1  5 再次点击1
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-2 11:35:09 | 显示全部楼层
    不错  学习了
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表