vc下禁止按钮连续点击的方法

 最近接手的项目需要(其实就是一个桌面小软件),需要通过MFC上的上一页和下一页按钮,控制CHTMLCTRL的显示。但CHTMLCTRL显示是有延迟的,一旦按钮点击过快,该控件会无法及时响应。所以,需要做一个禁止按钮连续点击的功能。

 

该过程主要使用ontimer来实现的。

1. 先点击对话框,找到可添加的事件(属性里面)WM_TIMER,添加ontimer事件。

  注意,ontimer事件,在vc 6.0 和vs2008中的声明是有区别的。

  vc 6中是:

afx_msg void OnTimer(UINT nIDEvent);

  vs2008中:

afx_msg void OnTimer(UINT_PTR nIDEvent);

当然,通过系统生成的方式是最方便的而且不会出错。

 

2. 在按钮的点击时间函数里面,先要禁用该按钮,然后执行所要处理的过程,之后设置时钟。这里需要注意的是时钟的启动与该函数的执行仍然是线性的,即当当前函数执行完成之后,才会执行Ontimer。

GetDlgItem(IDC_NEXTPAGE)->EnableWindow(FALSE); m_bButtonEnable_pre = FALSE; m_pre.EnableWindow(FALSE); 。。。//your process SetTimer(1, 100, NULL);

这样就设置好了一个时钟,一旦点击该按钮,就会执行该时钟,间隔100ms执行。

 

3. 在ontimer里面进行按钮的失效和有效设置:

if (m_bButtonEnable_pre) { GetDlgItem(IDC_PREPAGE)->EnableWindow(TRUE); KillTimer(1); } else { GetDlgItem(IDC_PREPAGE)->EnableWindow(FALSE); } CDialog::OnTimer(nIDEvent);

 

这样每次按了上一页的按钮,就会执行一次Ontimer()函数,并且判断其状态,如果有效状态,就kill掉该timer。其中的m_bButtonEnable_pre可以在按钮的处理程序中动态改变。

 

以上是本人执行成功的例子。下面介绍一个网上给的另外的解决方案。

 

=============================传说中的分割线=============================

 

 可以重新设置按钮的焦点,也就是转移焦点的做法。

 void CTestDlg::OnBtnStart() { m_btnStart.EnableWindow(FALSE);//m_btnStart在头文件中定义CButton m_btnStart; GetDlgItem(IDOK)->SetFocus(); aa();//子函数 Sleep(1000); bb(); Sleep(2000); //..... m_btnStart.EnableWindow(TRUE); } IDOK也可以是其他

 

 这个未经试验,可能会奏效吧。

 

 

你可能感兴趣的:(vc下禁止按钮连续点击的方法)