按钮禁用求解

northcan 2011-12-15 12:25:14
// 写入数据
void CAccessDlg::OnBnClickedBtnWrite()
{
// 禁用写数据按钮
GetDlgItem(IDC_BTN_WRITE)->EnableWindow(FALSE);

// 比较耗时的向某存储器写入数据的过程

// 恢复写数据按钮
GetDlgItem(IDC_BTN_WRITE)->EnableWindow(TRUE);
}

VC/MFC 对话框程序

上面是一个按钮的单击响应函数,由于函数中间的写入操作很费时间。所以想防止用户连续单击很多次。
我的想法是,用户点击一下按钮,然后先禁用该按钮,待写入操作完成,按钮单击响应函数结束之前,再恢复它。
代码如上。

但是这样有问题,界面上看起来,并没有禁用该按钮。我想可能是因为EnableWindow(FALSE);也是通过给该按钮窗口发送消息的方式禁用它。而这个过程完成的比较慢,可能按钮刚要响应这个消息的时候,后面的EnableWindow(TRUE);便执行了。
不知道是不是这样。

请VC板块的朋友们指点一下该怎么办。谢谢。
...全文
168 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2011-12-15
  • 打赏
  • 举报
回复
一般比较费时的操作放到工作线程中去做,线程完成以后发送自定义消息到UI,在UI的响应函数中EnableWindow(TRUE)按钮即可
猿创日记 2011-12-15
  • 打赏
  • 举报
回复
sleep(2000);试试。
绿领巾童鞋 2011-12-15
  • 打赏
  • 举报
回复
开一个线程,定义一个布鲁型 标记变量,线程监听变量的变化情况,按钮禁用时修改这个标记。
northcan 2011-12-15
  • 打赏
  • 举报
回复
有没有一种阻塞式的方法呢。

知道按钮禁用了,函数才返回,继续进行下面的操作。
northcan 2011-12-15
  • 打赏
  • 举报
回复
回1楼,还是不行的。补充一下,我的平台是ARM11 + Windows CE 7.0操作系统。

速度上没有PC那么快。
wtbike 2011-12-15
  • 打赏
  • 举报
回复
我试了一下,你原来的方式是可行的
qhyhaiyang 2011-12-15
  • 打赏
  • 举报
回复
这样试试:
m_btnStop.EnableWindow(FALSE);
m_btnStop为按钮变量名
老猿的春天 2011-12-15
  • 打赏
  • 举报
回复
我也遇到过,写完数据你直接开一个10ms的定时器,在定时器里使按钮有效,就可以了
northcan 2011-12-15
  • 打赏
  • 举报
回复
回7楼,其实也不是非常耗时,本来不想再Create一个work thread。
不过不这样,怎么弄都不行。最后还是创建了一个work thread,在这里面写数据,写完之后再恢复按钮。

结贴给分。

15,979

社区成员

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

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