CDialog 上的button 用EnableWindow(FALSE)让它变灰,但是还是能响应点击,怎么办? 如题我在CSDN中搜到一个同样的问题,但是解决的办法却没有看懂,还请各位帮忙,给出一个详细的教程http://topic.csdn.net/t/20030121/16/1380024.html 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 搂主你可以用 showwindow把这个button WM_HIDE起来不就可以了! 我找到一个同样问题的,他是用Application.ProcessMessages 解决的,我没看懂是怎样用的,哪位大哥大姐指导指导??http://topic.csdn.net/t/20060330/11/4650809.html回shaojun1314:这样隐藏不是个办法呀~~有没有更好的办法? 这里有说关于 UPDATE_COMMAND_UI 的例子,但只是针对菜单项的,我查看了按钮的,没有 ON_UPDATE _COMMAND_UI 这个消息啊……http://www.impcas.ac.cn/usr/yuanyj/vcpptutorial/chap3_7.htm 自定义添加一个CButton类为基类的按钮类,比如命名为CMyButton,用此类关联那个按钮,然后在ClassWizard中重载BN_CLICKED消息响应函数,代码为空就不响应了。 菜单项和ToolBar是关联的,ID一致的那个的UPDATE_COMMAND_UI消息中调用pCmdUI->Enable(FALSE); 回 langcat 大哥:我对C++不熟悉,是个小菜鸟,这次纯属应急式地做一个调试用的软件…… -_-!!!!您说:“自定义添加一个CButton类为基类的按钮类,比如命名为CMyButton,用此类关联那个按钮,然后在ClassWizard中重载BN_CLICKED消息响应函数,代码为空就不响应了。”我的理解是这样的:打开ClassWizrad,在Member Variables里面找到对应的按键ID,添加一个CButton的Member,然后我就没有看明白了,怎样重载BN_CLICKED消息响应函数呢??另外,我再说一下我想要实现的功能,就是按键A被CLICK以后,程序需要一定的时间来处理数据,在这期间,按键A、按键B、按键C都变灰并且都不能响应CLICK动作,等到程序将数据处理完成以后,按键A、按键B、按键C重新恢复可响应状态。我现在是这样写的:void CMFCDlg::OnButtonA() { // TODO: Add your control notification handler code here m_ButtonA.EnableWindow(FALSE); m_ButtonB.EnableWindow(FALSE); m_ButtonC.EnableWindow(FALSE); UpdateData (FALSE); //process Data m_ButtonA.EnableWindow(TRUE); m_ButtonB.EnableWindow(TRUE); m_ButtonC.EnableWindow(TRUE); UpdateData (FALSE);}以上代码只能实现按键的变灰,但是对鼠标的点击还是会响应,请各位大哥指点迷津,不胜感激!!!! 控件的UPDATE事件里SetEnable(false);就变暗不能点了 写错了void CMainFrame::OnUpdateBotton(CCmdUI* pCmdUI) { pCmdUI->Enable(m_bCmpEnable);}m_bCmpEnable是类布尔变量在这里的话MAIN类的函数里把m_bCmpEnable = false;就能实现按钮变暗TRUE变亮 我再说一下我想要实现的功能,就是按键A被CLICK以后,程序需要一定的时间来处理数据,在这期间,按键A、按键B、按键C都变灰并且都不能响应CLICK动作,====================================MFC中的控件在"变灰"后,是不能再响应点击的了.这和你的要求相同"按键A、按键B、按键C都变灰并且都不能响应CLICK动作",先前你说要变灰后还要响应click函数,基本上是不可能实现的了.等到程序将数据处理完成以后,按键A、按键B、按键C重新恢复可响应状态。=========================================================数据处理完后,再直接用函数EnableWindow(TRUE);就可以的了. to dvhome:void CMFCDlg::OnButtonA() { // TODO: Add your control notification handler code here m_ButtonA.EnableWindow(FALSE); m_ButtonB.EnableWindow(FALSE); m_ButtonC.EnableWindow(FALSE); UpdateData (FALSE); //process Data //数据处理结束处给一个结束标志 //这里判断一个结束标志,再恢复按钮Enable if(Process Data End) { m_ButtonA.EnableWindow(TRUE); m_ButtonB.EnableWindow(TRUE); m_ButtonC.EnableWindow(TRUE); UpdateData (FALSE); } }我说的BN_CLICKED响应函数重载是屏蔽掉按钮响应消息是这样的:(1)在classview右键菜单New Class 新增一个以CButton类为基类的CMyButton类(2)在CMyButton类右键菜单 Add Windows Message handler添加BN_CLICKED的处理函数就是重载了(3)当然CMyButton类所在的头文件CMyButton.h必须包含在CDialog窗口 CMFCDlg.h头文件中。(4)关联:CMFCDlg类添加一个CMyButton对象比如 CMyButton m_ButtonA; CMFCDlg::OnInitDialog()初始化函数中添加 m_ButtonA.SubclassDlgItem(IDC_BUTTONA,this); IDC_BUTTONA:关联按钮ID this:这里指向CMFCDlg窗口句柄不过此方法跟你实现的功能不沾边,我以为你要简单屏蔽Click的响应。◎##◎¥你自己方法注意一下细节应该可以的。 回firein大哥:我现在用的是MFC的CDialog上的Button,您说的办法我没有看懂要怎样用??直接添加这个函数吗??要怎样调用或是关联按键???回wsb_8224大哥:不好意思,我的帖子标题意思让您误会了,我想要的功能就是让MFC Dialog上面的按键能够变灰并且不能响应点击(默认情况下MFC的按键能使用EnableWindow变灰,但这个时候还是能够响应点击的,这样变灰就只是一个形式了,没有起到实质作用)回langcat大哥:您说的我没有看明白,在同一个函数体内顺序执行的语句,为什么还要增加一个标志位来判断呢??且经实验,没有效果!感谢各位大哥的热心帮忙,小弟不胜感激!!~~ 按钮控件变灰后是不能操作的了,即不能响应"点击"了.void CMFCDlg::OnButtonA() { // TODO: Add your control notification handler code here m_ButtonA.EnableWindow(FALSE); m_ButtonB.EnableWindow(FALSE); m_ButtonC.EnableWindow(FALSE); UpdateData (FALSE); AfxMessageBox("test!"); //process Data m_ButtonA.EnableWindow(TRUE); m_ButtonB.EnableWindow(TRUE); m_ButtonC.EnableWindow(TRUE); UpdateData (FALSE);}这是你的函数,我加了一句AfxMessageBox("test!")用来测试,当你点击按钮A时响应执行这个函数后,首先是ABC三个按钮变灰,再弹出"test!",点击"确定",执行完后面的代码后,三个按钮又恢复正常! 但是我这边的情况是这样的:首先我点击了ButtonA,执行ONButtonA函数,此时按键A、B、C都变灰了。在ONButtonA函数的执行过程中,我点击了一次ButtonB(打开通用对话框,输入文件用),在ONButtonA执行完之前,以前都是正常的。但在ONButtonA执行完: m_ButtonA.EnableWindow(TRUE); m_ButtonB.EnableWindow(TRUE); m_ButtonC.EnableWindow(TRUE);之后,原来的那一次点击ButtonB就会生效。(打开文件的通用对话框就出来了)请问是不是我的思路上出了差错??我在网上搜索了一下,有些文章说MFC中控件不能直接用EnableWindow来禁用?? 我没有遇到过这种情况,我想可能是这个原因:你在响应按钮A的过程中,是在处理消息函数,你再次点击了B按钮,消息列表中可能加入了这个新的消息,但是正在响应A,所以B还在消息列表中等待,等A处理完后,几个按钮又变正常了,于是能够处理消息列表中的消息了.只是我个人意见 看你EnableWindow(FALSE)添加在什么地方?? 回wsb_8224:我也觉得应该是这样,但我对C++和MFC都不熟,所以知道原因但不知道怎么解决,这不,来CSDN求助来了…… -_-!!!会xyh2007:添加在了ButtonA的函数体内~~ 就对IDOK 与IDCANCEL做个简单测试void CSendMessageDlg::OnOK() { // TODO: Add extra validation here ((CButton*)GetDlgItem(IDOK))->EnableWindow(FALSE); ((CButton*)GetDlgItem(IDCANCEL))->EnableWindow(FALSE); // CDialog::OnOK();}void CSendMessageDlg::OnCancel() { // TODO: Add extra cleanup here AfxMessageBox( "CANCEL按钮被按下"); CDialog::OnCancel();}点击IDOK后,再点IDCANCLE没有弹出对话框啊? 回stefine:我这里是这样测试的:建立一个默认的MFC Dialog工程,添加两个按钮Button1和Button2,按钮代码如下:void CMFCTestDlg::OnButton1() { int i=1000,j=5000,k=100; // TODO: Add your control notification handler code here ((CButton*)GetDlgItem(IDC_BUTTON2))->EnableWindow(FALSE); SetDlgItemText(IDC_STATIC,"abababab"); while(i) { j--; if(j==0) { k--; j = 5000; } if(k==0) { i--; k = 100; } } SetDlgItemText(IDC_STATIC,"123456789"); /*IDC_STATIC为MFC Dialog默认生成的文本框*/ ((CButton*)GetDlgItem(IDC_BUTTON2))->EnableWindow(TRUE); }void CMFCTestDlg::OnButton2() { // TODO: Add your control notification handler code here // TODO: Add your control notification handler code here CFileDialog BMPFileDlg(TRUE); BMPFileDlg.m_ofn.lpstrTitle = "打开BMP文件"; BMPFileDlg.m_ofn.lpstrFilter = "BMP 文件(*.bmp)\0*.bmp"; if(IDOK == BMPFileDlg.DoModal()) { SetDlgItemText(IDC_STATIC,BMPFileDlg.GetPathName()); } }编译,运行点击Button1,此时Button2变灰,文本框显示 abababab,这个时候点击Button2(灰色状态)等到Button1的过程运算完之后,即文本框显示 123456789 ,这个时候“打开BMP文件”的通用对话框就出来了。即Button2在Button1过程结束之后响应了在Button2灰色状态时的点击。我想要的就是在Button2灰色时不能响应点击,也不能在恢复之后响应在灰色时的点击。 终于解决了~~解决办法:应用Application.ProcessMessages分析真正原因所在:循环占用系统资源比较严重(操作硬件端口),导致消息不能立即响应,因此EnableWindow没有起到真正的作用等到循环结束之后,EnableWindow已经释放,但消息还在列表中,控件就响应事件了……再此感谢各位大侠的热心帮助!!~~晚上,没有什么补充就结帖了,(分少的可怜,20是我的全部家当了,随便分了吧,相信各位大款们也不在乎这一点点 ^-^) vc编写mp3播放器关于slideButton的问题 MCIWndSeek怎么使用 请问下,怎样修改tab页的选中标签的字体颜色,和背景颜色?谢谢回答 问一个有关send函数的问题 再问个难点的问题~ 怎样得到文件得完整路径? 急,有没有好用的excel控件! 高分求教design-time license问题! 这样的代码能用GPU来加速计算吗? CString strtemp 如何转化为char *,以及获取char *的长度 调试程序时出现如下内容,是什么意思? 如何避免执行大量计算时的界面锁死? VC+++如何备份与还原Access数据库?
http://www.impcas.ac.cn/usr/yuanyj/vcpptutorial/chap3_7.htm
在ClassWizard中重载BN_CLICKED消息响应函数,代码为空就不响应了。
我对C++不熟悉,是个小菜鸟,这次纯属应急式地做一个调试用的软件…… -_-!!!!您说:“自定义添加一个CButton类为基类的按钮类,比如命名为CMyButton,用此类关联那个按钮,然后在ClassWizard中重载BN_CLICKED消息响应函数,代码为空就不响应了。”我的理解是这样的:打开ClassWizrad,在Member Variables里面找到对应的按键ID,添加一个CButton的Member,然后我就没有看明白了,怎样重载BN_CLICKED消息响应函数呢??另外,我再说一下我想要实现的功能,就是按键A被CLICK以后,程序需要一定的时间来处理数据,在这期间,按键A、按键B、按键C都变灰并且都不能响应CLICK动作,等到程序将数据处理完成以后,按键A、按键B、按键C重新恢复可响应状态。我现在是这样写的:void CMFCDlg::OnButtonA()
{
// TODO: Add your control notification handler code here
m_ButtonA.EnableWindow(FALSE);
m_ButtonB.EnableWindow(FALSE);
m_ButtonC.EnableWindow(FALSE);
UpdateData (FALSE); //process Data m_ButtonA.EnableWindow(TRUE);
m_ButtonB.EnableWindow(TRUE);
m_ButtonC.EnableWindow(TRUE);
UpdateData (FALSE);
}以上代码只能实现按键的变灰,但是对鼠标的点击还是会响应,请各位大哥指点迷津,不胜感激!!!!
void CMainFrame::OnUpdateBotton(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bCmpEnable);
}m_bCmpEnable是类布尔变量
在这里的话MAIN类的函数里把m_bCmpEnable = false;
就能实现按钮变暗
TRUE变亮
========
MFC中的控件在"变灰"后,是不能再响应点击的了.这和你的要求相同"按键A、按键B、按键C都变灰并且都不能响应CLICK动作",先前你说要变灰后还要响应click函数,基本上是不可能实现的了.等到程序将数据处理完成以后,按键A、按键B、按键C重新恢复可响应状态。=========================================================
数据处理完后,再直接用函数EnableWindow(TRUE);就可以的了.
void CMFCDlg::OnButtonA()
{
// TODO: Add your control notification handler code here
m_ButtonA.EnableWindow(FALSE);
m_ButtonB.EnableWindow(FALSE);
m_ButtonC.EnableWindow(FALSE);
UpdateData (FALSE); //process Data //数据处理结束处给一个结束标志
//这里判断一个结束标志,再恢复按钮Enable
if(Process Data End)
{
m_ButtonA.EnableWindow(TRUE);
m_ButtonB.EnableWindow(TRUE);
m_ButtonC.EnableWindow(TRUE);
UpdateData (FALSE);
}
}我说的BN_CLICKED响应函数重载是屏蔽掉按钮响应消息是这样的:
(1)在classview右键菜单New Class 新增一个以CButton类为基类的CMyButton类
(2)在CMyButton类右键菜单 Add Windows Message handler添加BN_CLICKED的处理函数就是重载了
(3)当然CMyButton类所在的头文件CMyButton.h必须包含在CDialog窗口 CMFCDlg.h头文件中。
(4)关联:CMFCDlg类添加一个CMyButton对象比如 CMyButton m_ButtonA;
CMFCDlg::OnInitDialog()初始化函数中添加
m_ButtonA.SubclassDlgItem(IDC_BUTTONA,this);
IDC_BUTTONA:关联按钮ID this:这里指向CMFCDlg窗口句柄不过此方法跟你实现的功能不沾边,我以为你要简单屏蔽Click的响应。◎##◎¥
你自己方法注意一下细节应该可以的。
void CMFCDlg::OnButtonA()
{
// TODO: Add your control notification handler code here
m_ButtonA.EnableWindow(FALSE);
m_ButtonB.EnableWindow(FALSE);
m_ButtonC.EnableWindow(FALSE);
UpdateData (FALSE); AfxMessageBox("test!");
//process Data m_ButtonA.EnableWindow(TRUE);
m_ButtonB.EnableWindow(TRUE);
m_ButtonC.EnableWindow(TRUE);
UpdateData (FALSE);
}
这是你的函数,我加了一句AfxMessageBox("test!")用来测试,当你点击按钮A时响应执行这个函数后,首先是ABC三个按钮变灰,再弹出"test!",点击"确定",执行完后面的代码后,三个按钮又恢复正常!
首先我点击了ButtonA,执行ONButtonA函数,此时按键A、B、C都变灰了。在ONButtonA函数的执行过程中,我点击了一次ButtonB(打开通用对话框,输入文件用),在ONButtonA执行完之前,以前都是正常的。但在ONButtonA执行完:
m_ButtonA.EnableWindow(TRUE);
m_ButtonB.EnableWindow(TRUE);
m_ButtonC.EnableWindow(TRUE);
之后,原来的那一次点击ButtonB就会生效。(打开文件的通用对话框就出来了)请问是不是我的思路上出了差错??我在网上搜索了一下,有些文章说MFC中控件不能直接用EnableWindow来禁用??
{
// TODO: Add extra validation here
((CButton*)GetDlgItem(IDOK))->EnableWindow(FALSE);
((CButton*)GetDlgItem(IDCANCEL))->EnableWindow(FALSE);
// CDialog::OnOK();
}void CSendMessageDlg::OnCancel()
{
// TODO: Add extra cleanup here
AfxMessageBox( "CANCEL按钮被按下");
CDialog::OnCancel();
}点击IDOK后,再点IDCANCLE没有弹出对话框啊?
void CMFCTestDlg::OnButton1()
{
int i=1000,j=5000,k=100;
// TODO: Add your control notification handler code here
((CButton*)GetDlgItem(IDC_BUTTON2))->EnableWindow(FALSE);
SetDlgItemText(IDC_STATIC,"abababab");
while(i)
{
j--;
if(j==0)
{
k--;
j = 5000;
}
if(k==0)
{
i--;
k = 100;
} }
SetDlgItemText(IDC_STATIC,"123456789"); /*IDC_STATIC为MFC Dialog默认生成的文本框*/
((CButton*)GetDlgItem(IDC_BUTTON2))->EnableWindow(TRUE);
}void CMFCTestDlg::OnButton2()
{
// TODO: Add your control notification handler code here
// TODO: Add your control notification handler code here
CFileDialog BMPFileDlg(TRUE);
BMPFileDlg.m_ofn.lpstrTitle = "打开BMP文件";
BMPFileDlg.m_ofn.lpstrFilter = "BMP 文件(*.bmp)\0*.bmp"; if(IDOK == BMPFileDlg.DoModal())
{
SetDlgItemText(IDC_STATIC,BMPFileDlg.GetPathName());
}
}
编译,运行点击Button1,此时Button2变灰,文本框显示 abababab,这个时候点击Button2(灰色状态)等到Button1的过程运算完之后,即文本框显示 123456789 ,这个时候“打开BMP文件”的通用对话框就出来了。即Button2在Button1过程结束之后响应了在Button2灰色状态时的点击。我想要的就是在Button2灰色时不能响应点击,也不能在恢复之后响应在灰色时的点击。
循环占用系统资源比较严重(操作硬件端口),导致消息不能立即响应,因此EnableWindow没有起到真正的作用等到循环结束之后,EnableWindow已经释放,但消息还在列表中,控件就响应事件了……再此感谢各位大侠的热心帮助!!~~
晚上,没有什么补充就结帖了,(分少的可怜,20是我的全部家当了,随便分了吧,相信各位大款们也不在乎这一点点 ^-^)