mfc 多个按钮 禁用 只响应当前按钮

在mfc 里用了3个按钮控件,关联变量mbnt1;mbnt2;mbnt3;每一个按钮按下先使得3个按钮全部disable禁用,执行完相应消息响应代码后在全部enable启用;如disable按钮代码为mbnt1.enablewindow(false);mbnt2.enablewindow(false);mbnt2.enablewindow(false);但是实际上在按钮1的消息响应里只有按钮1被disable,在按钮2的消息响应里只有按钮2被disable,按钮3同样,测试了很多次,比如按钮1的消息相应:

mbnt1.enablewindow(false);//单步执行到这一句按钮1禁用
mbnt2.enablewindow(false);//没反应
mbnt2.enablewindow(false);//没反应

xxxxxxxxxxxxxxxxxxx其他代码

mbnt1.enablewindow(true);//没反应
mbnt2.enablewindow(true);//没反应
mbnt2.enablewindow(true);//没反应
//按f5一次性相应按钮2和按钮3的禁用和按钮1按钮2和按钮3的启用


按钮禁用代码单独建一个对话框没有问题,enablewindow用关联变量或者是ID方法都试过,整个程序里有网络udp实时通信,串口实时通信,teechar实时画图,第一次写好还好,用来几次就出现了这个bug,不知道什么问题,测试很多还没有解决求大神指点!!!

justin_bkdrong 枫舞的季节 回复weixin_35838529: 不知道你如何加的sleep ,按道理应该不影响,比如
xxx.enable(FALSE)
sleep(100);
ddd.enable(FALSE);
sleep(100);
ccc.enable(FALSE);

你的sleep 加到哪里了?

GetDlgItem(ID)->EnableWindow(False)

DDX_Control(pDX,IDC_BTN_LINK, m_btnLink);

enablewindows(false); 这个没有问题,问题可能出在你的逻辑,可能多线程的处理上有逻辑错误~

void CScanSourceSetDlg::OnBnClickedAdd()
{
// TODO: 在此添加控件通知处理程序代码
CUrlSetDlg dlg;
dlg.m_StrWindowText = "添加扫描信源";
if(dlg.DoModal()==IDOK)
{
CString csUrl = dlg.m_Url;
CString csPriority = dlg.m_Priority;
csUrl.TrimLeft();csUrl.TrimRight();
csPriority.TrimLeft();csPriority.TrimRight();
if(csUrl.IsEmpty()||csPriority.IsEmpty())
{
AfxMessageBox("网址或优先级不能为空!!");
return;
}
m_iCurItem = m_WebSiteList.GetItemCount();
ShowListContent(m_iCurItem,csUrl,csPriority,0);
m_State = STATE_ADD;
GetDlgItem(ID_ADD)->EnableWindow(FALSE);
GetDlgItem(ID_DEL)->EnableWindow(FALSE);
GetDlgItem(ID_MODIFY)->EnableWindow(FALSE);
GetDlgItem(ID_SAVE)->EnableWindow(TRUE);
}
}
我的程序:点击添加按钮,打开添加对话框,输入信息,添加后,只让保存按钮能点击,其他的都不能点击。

这个问题,因为并不是必现,因此使用打印log(OutputDebugString) 来检查。
1 检查这些语句是否被执行,在路径上打印些log
2 检查这些函数是否被正确执行,执行后检查返回值。根据 GetLastError 看看什么错误
3 有可能是死锁。你的消息窗口和其他进行消息通讯,可能被死锁。
根据这几个思路试试.

不要用sleep 。可以使用MsgWaitForMultipleObjects 来等待,这个函数既可以等待消息也可以等待多个event,当超时以后就跳出。有消息就转发。

是不是后面的代码 很占用资源,导致界面没有响应?

 ShowListContent(m_iCurItem,csUrl,csPriority,0);  

单步运行看看都在哪里。。。看看这个函数是不是有问题。。。