如何防止按钮连续点击?

stef3390 2011-08-05 10:47:52
我在一个按钮消息函数里的计算量比较大, 大概需要1秒, 连续点击之后程序会死掉, 想知道如何在计算没有完成的时候点击无效.

已经试过如下两种方式都不行, 连续点击每次还是会执行计算
void OnBnClicked()
{

GetDlgItem(IDC_COMPUTE)->EnableWindow(FALSE);
GetDlgItem(IDC_COMPUTE)->SetWindowText(L"计算中...");

..........计算

GetDlgItem(IDC_COMPUTE)->EnableWindow(TRUE);
GetDlgItem(IDC_COMPUTE)->SetWindowText(L"计算");
}



void OnBnClicked()
{

if (m_bCompute)
return ;

m_bCompute = TRUE;

..........计算

m_bCompute = FALSE;
}

...全文
626 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wh1965 2014-04-27
  • 打赏
  • 举报
回复
我也遇到这个问题...
hmilll 2012-05-26
  • 打赏
  • 举报
回复
怎么登陆了还看不了
iwillbeback008 2011-09-06
  • 打赏
  • 举报
回复
很好,一时也被这个小问题迷糊了
学习了
呔妖怪来嘛 2011-08-05
  • 打赏
  • 举报
回复
函数未返回
会相应消息吗
不二星空 2011-08-05
  • 打赏
  • 举报
回复
第二种方法应该就可以,是不是你自己计算代码哪里出了问题
王大狼山 2011-08-05
  • 打赏
  • 举报
回复
void OnBnClicked()
{
static BOOL bflag = TRUE;
if(bflag)
{
bflag = FALSE;
GetDlgItem(IDC_COMPUTE)->EnableWindow(FALSE);
GetDlgItem(IDC_COMPUTE)->SetWindowText(L"计算中...");

..........计算



GetDlgItem(IDC_COMPUTE)->EnableWindow(TRUE);
GetDlgItem(IDC_COMPUTE)->SetWindowText(L"计算");
bflage = TRUE;
}

}
這樣應該可以
王大狼山 2011-08-05
  • 打赏
  • 举报
回复
void OnBnClicked()
{
static BOOL bflag = TRUE;
if(bflag)
{
bflag = FALSE;
GetDlgItem(IDC_COMPUTE)->EnableWindow(FALSE);
GetDlgItem(IDC_COMPUTE)->SetWindowText(L"计算中...");

..........计算
bflag = TRUE

}
GetDlgItem(IDC_COMPUTE)->EnableWindow(TRUE);
GetDlgItem(IDC_COMPUTE)->SetWindowText(L"计算");
}
xxq123321 2011-08-05
  • 打赏
  • 举报
回复
点击后将按钮置为不可用状态,按钮事件处理函数执行完毕后再置为可用状态
stef3390 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chaoyue0724 的回复:]

在运算的地方 加一个变量 例如BOOL Finish;
初始化的时候 Finish=1;
让响应按钮事件只在Finish==1时 可用, 在运行结束后 设置Finish=0;
在你的运算结束的位置 设置Finish=1;
这样就可以解决你的问题了。
当Finish=0时 不执行按钮事件;
当Finish=1时 执行按钮事件。
[/Quote]

这个和我上面第二种方法没区别啊, 已经试过没用
菜鸟一个 2011-08-05
  • 打赏
  • 举报
回复
BOOL Finish; 定义成全局变量。
菜鸟一个 2011-08-05
  • 打赏
  • 举报
回复
在运算的地方 加一个变量 例如BOOL Finish;
初始化的时候 Finish=1;
让响应按钮事件只在Finish==1时 可用, 在运行结束后 设置Finish=0;
在你的运算结束的位置 设置Finish=1;
这样就可以解决你的问题了。
当Finish=0时 不执行按钮事件;
当Finish=1时 执行按钮事件。
shiyunqiang 2011-08-05
  • 打赏
  • 举报
回复
为按钮添加双击事件(BN_DOUBLECLICKED),直接返回 return;

试试怎么样。
nnull 2011-08-05
  • 打赏
  • 举报
回复


在按钮事件中写 GetDlgItem(IDC_COMPUTE)->EnableWindow(FALSE);

在计算代码最后写 GetDlgItem(IDC_COMPUTE)->EnableWindow(TRUE);
贾囧雷 2011-08-05
  • 打赏
  • 举报
回复
CButton *pButton = (CButton*)GetDlgItem(IDC_BUTTON1);
pButton->EnableWindow(FALSE);
pButton->UpdateData();
Sleep(1000* 10);
pButton->EnableWindow(TRUE);
pButton->UpdateData();
贾囧雷 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 g68743513 的回复:]
点击下去之后,在没有计算之前,把按钮EnableWindow(FALSE),计算完EnableWindow(TRUE)
[/Quote]
上面有人说了。。。更新完UpData没?
贾囧雷 2011-08-05
  • 打赏
  • 举报
回复
点击下去之后,在没有计算之前,把按钮EnableWindow(FALSE),计算完EnableWindow(TRUE)
mudunke775 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 stef3390 的回复:]

引用 15 楼 mudunke775 的回复:

估计是这样的,EnableWindow(FALSE)函数是在你这个函数执行完才有效。
你第一种写法,函数执行完之后,按键的状态已经是TRUE了,所以后面的点击会继续执行。
而这种写法函数执行完后,按键的状态是FALSE,后面的点击会被抛除,直到你的ONTIMER再把按键状态设置为TRUE后才会再调用你的处理函数


这样的话还是会进……
[/Quote]

不是,你设置断点就知道了,你可以把TIMER的时间设长点看看,是系统把你后面的点击消息给抛除了,不是你自己抛除的
stef3390 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mudunke775 的回复:]

估计是这样的,EnableWindow(FALSE)函数是在你这个函数执行完才有效。
你第一种写法,函数执行完之后,按键的状态已经是TRUE了,所以后面的点击会继续执行。
而这种写法函数执行完后,按键的状态是FALSE,后面的点击会被抛除,直到你的ONTIMER再把按键状态设置为TRUE后才会再调用你的处理函数
[/Quote]

这样的话还是会进到OnBnClicked()里的对吧?但是没有执行到函数里去
mudunke775 2011-08-05
  • 打赏
  • 举报
回复
估计是这样的,EnableWindow(FALSE)函数是在你这个函数执行完才有效。
你第一种写法,函数执行完之后,按键的状态已经是TRUE了,所以后面的点击会继续执行。
而这种写法函数执行完后,按键的状态是FALSE,后面的点击会被抛除,直到你的ONTIMER再把按键状态设置为TRUE后才会再调用你的处理函数
stef3390 2011-08-05
  • 打赏
  • 举报
回复
void OnBnClicked()
{
static BOOL bflag = TRUE;
if(bflag)
{
bflag = FALSE;
GetDlgItem(IDC_COMPUTE)->EnableWindow(FALSE);
GetDlgItem(IDC_COMPUTE)->SetWindowText(L"计算中...");

..........计算


SetTimer(1, 100, NULL);


}

void OnTimer(UINT_PTR nIDEvent)
{
bflag = TRUE;
GetDlgItem(IDC_COMPUTE)->EnableWindow(TRUE);
GetDlgItem(IDC_COMPUTE)->SetWindowText(L"计算");
KillTimer(1);
}


同事这样帮忙解决了, 但是不知道为什么这样能行
加载更多回复(5)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧