如何实现点击按钮后按钮无效,按钮中程序执行完后自动恢复,再此过程中再此点击按钮不响应


我设置一个按钮,点击之后使按钮无效,程序执行完后自动恢复。 
程序代码如下,点击后按钮的确变灰,直到程序执行完成才恢复,但是在程序执行过程中,我再次点击按钮,程序会自动执行第二次,即按钮使变灰了,但仍然响应事件,怎么才能使按钮做到真正的无效? 
  
void CMy888Dlg::OnButton1() 

    GetDlgItem(IDC_BUTTON1)->EnableWindow(false); 
。 
        。 
        。 
        。 
    GetDlgItem(IDC_BUTTON1)->EnableWindow(true); 
}

6 个解决方案

#1


在函数中添加一句:
CWaitCursor cursor;

#2


这不应该啊,你怎么确认程序执行了第二次?如果你连线程都没有开,而且中间代码需要一段时间的话,界面在这段时间内是会被卡死的。

#3


XP的默认机制下,确实如LZ所述一般,即CPU在执行按钮响应函数时,单击按钮(即使按钮禁掉),在响应函数返回后仍将再次执行一遍或几遍(其实单击了按钮多次的话)。

解决办法是在按钮响应函数退出、按钮在Enable之前,清空消息队列中的所有鼠标消息:

// 忽略期间的所有鼠标消息,以防止按钮在Enable后仍有响应
MSG msg;
while(PeekMessage(&msg, m_hWnd, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE));

#4


引用 3 楼 flyoxs 的回复:
XP的默认机制下,确实如LZ所述一般,即CPU在执行按钮响应函数时,单击按钮(即使按钮禁掉),在响应函数返回后仍将再次执行一遍或几遍(其实单击了按钮多次的话)。

解决办法是在按钮响应函数退出、按钮在Enable之前,清空消息队列中的所有鼠标消息:
C/C++ code// 忽略期间的所有鼠标消息,以防止按钮在Enable后仍有响应MSG msg;while(PeekMessage(&msg, m_hWnd, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE));


还真是这样,学习了。俺错误理解了LZ意思,抱歉。
以前没发现这种事情,耗时的操作都弄线程里了。

#5


引用 3 楼 flyoxs 的回复:
XP的默认机制下,确实如LZ所述一般,即CPU在执行按钮响应函数时,单击按钮(即使按钮禁掉),在响应函数返回后仍将再次执行一遍或几遍(其实单击了按钮多次的话)。

 解决办法是在按钮响应函数退出、按钮在Enable之前,清空消息队列中的所有鼠标消息:
C/C++ code// 忽略期间的所有鼠标消息,以防止按钮在Enable后仍有响应MSG msg;while(PeekMessage(&msg, m_hWnd, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE));

学习了,原来是这个样子

#6


谢谢各位了,尤其是大头蜂,问题已经解决了。
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告