如题
我在CSDN中搜到一个同样的问题,但是解决的办法却没有看懂,还请各位帮忙,给出一个详细的教程
http://topic.csdn.net/t/20030121/16/1380024.html

解决方案 »

  1.   

    搂主你可以用 showwindow把这个button WM_HIDE起来不就可以了!
      

  2.   

    我找到一个同样问题的,他是用Application.ProcessMessages 解决的,我没看懂是怎样用的,哪位大哥大姐指导指导??http://topic.csdn.net/t/20060330/11/4650809.html回shaojun1314:这样隐藏不是个办法呀~~有没有更好的办法?
      

  3.   

    这里有说关于 UPDATE_COMMAND_UI 的例子,但只是针对菜单项的,我查看了按钮的,没有 ON_UPDATE _COMMAND_UI 这个消息啊……
    http://www.impcas.ac.cn/usr/yuanyj/vcpptutorial/chap3_7.htm
      

  4.   

    自定义添加一个CButton类为基类的按钮类,比如命名为CMyButton,用此类关联那个按钮,然后
    在ClassWizard中重载BN_CLICKED消息响应函数,代码为空就不响应了。
      

  5.   

    菜单项和ToolBar是关联的,ID一致的那个的UPDATE_COMMAND_UI消息中调用pCmdUI->Enable(FALSE);
      

  6.   

    回 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);
    }以上代码只能实现按键的变灰,但是对鼠标的点击还是会响应,请各位大哥指点迷津,不胜感激!!!!
      

  7.   

    控件的UPDATE事件里SetEnable(false);就变暗不能点了
      

  8.   

    写错了
    void CMainFrame::OnUpdateBotton(CCmdUI* pCmdUI) 
    {
    pCmdUI->Enable(m_bCmpEnable);
    }m_bCmpEnable是类布尔变量
    在这里的话MAIN类的函数里把m_bCmpEnable = false;
    就能实现按钮变暗
    TRUE变亮
      

  9.   

    我再说一下我想要实现的功能,就是按键A被CLICK以后,程序需要一定的时间来处理数据,在这期间,按键A、按键B、按键C都变灰并且都不能响应CLICK动作,============================
    ========
    MFC中的控件在"变灰"后,是不能再响应点击的了.这和你的要求相同"按键A、按键B、按键C都变灰并且都不能响应CLICK动作",先前你说要变灰后还要响应click函数,基本上是不可能实现的了.等到程序将数据处理完成以后,按键A、按键B、按键C重新恢复可响应状态。=========================================================
    数据处理完后,再直接用函数EnableWindow(TRUE);就可以的了.
      

  10.   

    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的响应。◎##◎¥
    你自己方法注意一下细节应该可以的。
      

  11.   

    回firein大哥:我现在用的是MFC的CDialog上的Button,您说的办法我没有看懂要怎样用??直接添加这个函数吗??要怎样调用或是关联按键???回wsb_8224大哥:不好意思,我的帖子标题意思让您误会了,我想要的功能就是让MFC Dialog上面的按键能够变灰并且不能响应点击(默认情况下MFC的按键能使用EnableWindow变灰,但这个时候还是能够响应点击的,这样变灰就只是一个形式了,没有起到实质作用)回langcat大哥:您说的我没有看明白,在同一个函数体内顺序执行的语句,为什么还要增加一个标志位来判断呢??且经实验,没有效果!感谢各位大哥的热心帮忙,小弟不胜感激!!~~
      

  12.   

    按钮控件变灰后是不能操作的了,即不能响应"点击"了.
    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!",点击"确定",执行完后面的代码后,三个按钮又恢复正常!
      

  13.   

    但是我这边的情况是这样的:
    首先我点击了ButtonA,执行ONButtonA函数,此时按键A、B、C都变灰了。在ONButtonA函数的执行过程中,我点击了一次ButtonB(打开通用对话框,输入文件用),在ONButtonA执行完之前,以前都是正常的。但在ONButtonA执行完:
             m_ButtonA.EnableWindow(TRUE);
             m_ButtonB.EnableWindow(TRUE);
             m_ButtonC.EnableWindow(TRUE);
    之后,原来的那一次点击ButtonB就会生效。(打开文件的通用对话框就出来了)请问是不是我的思路上出了差错??我在网上搜索了一下,有些文章说MFC中控件不能直接用EnableWindow来禁用??
      

  14.   

    我没有遇到过这种情况,我想可能是这个原因:你在响应按钮A的过程中,是在处理消息函数,你再次点击了B按钮,消息列表中可能加入了这个新的消息,但是正在响应A,所以B还在消息列表中等待,等A处理完后,几个按钮又变正常了,于是能够处理消息列表中的消息了.只是我个人意见
      

  15.   

    看你EnableWindow(FALSE)添加在什么地方??
      

  16.   

    回wsb_8224:我也觉得应该是这样,但我对C++和MFC都不熟,所以知道原因但不知道怎么解决,这不,来CSDN求助来了……  -_-!!!会xyh2007:添加在了ButtonA的函数体内~~
      

  17.   

    就对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没有弹出对话框啊?
      

  18.   

    回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灰色时不能响应点击,也不能在恢复之后响应在灰色时的点击。
      

  19.   

    终于解决了~~解决办法:应用Application.ProcessMessages分析真正原因所在:
    循环占用系统资源比较严重(操作硬件端口),导致消息不能立即响应,因此EnableWindow没有起到真正的作用等到循环结束之后,EnableWindow已经释放,但消息还在列表中,控件就响应事件了……再此感谢各位大侠的热心帮助!!~~
    晚上,没有什么补充就结帖了,(分少的可怜,20是我的全部家当了,随便分了吧,相信各位大款们也不在乎这一点点  ^-^)