| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2206 人关注过本帖
标题:[原创]VC按钮绘制——互联型按钮
只看楼主 加入收藏
赵博闻
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2007-9-20
收藏
 问题点数:0 回复次数:0 
[原创]VC按钮绘制——互联型按钮

*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: 赵博闻
*/ 时间: 2007-11-5 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------

按钮互联型,一种简单处理图标按钮的方法,总结如下

在工程中常常用到这样的按钮,即:第一次点击时按钮呈现一种状态,第二次点击时呈现另一种状态。如图:

有时候甚至要用到几个按钮之间关联着呈现这种状态。所以下面介绍一种相对简单的方法。
功能:开始时按钮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

搜索更多相关主题的帖子: 按钮 绘制 原创 
2007-11-05 14:31
快速回复:[原创]VC按钮绘制——互联型按钮
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039137 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved