| VC按钮绘制互联型按钮 |
|
| 作者:佚名 文章来源:网络 点击数: 更新时间:2008-5-31 |
|
|
按钮互联型,一种简单处理图标按钮的方法,总结如下
在工程中常常用到这样的按钮,即:第一次点击时按钮呈现一种状态,第二次点击时呈现另一种状态. 有时候甚至要用到几个按钮之间关联着呈现这种状态。所以下面介绍一种相对简单的方法。
功能:开始时按钮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 |