你如何禁用CBitmapButton?

时间:2009-03-12 17:57:24

标签: c++ visual-c++ button mfc

如何禁用CBitmapButton?我尝试使用m_bitmapbutton.EnableWindow(false);但它不起作用。它仍然会引发一场事件。

我要做的是阻止按钮A在事件B执行时触发事件A(来自按钮B)。所以在事件B中,我想禁用Button A.

2 个答案:

答案 0 :(得分:1)

以下是要检查的事项列表:

  • 您是否为位图按钮的禁用状态定义了图像?
  • 你确定事件被解雇了吗?
  • 事件B不在线程中吗?
  • 您在事件B的开头是m_bitmapbutton.EnableWindow(FALSE)吗?最后是m_bitmapbutton.EnableWindow(TRUE)吗?
  • 你在做BN_CLICKED通知()吗?或者它可能是一个不同的通知,如WM_LBUTTONDOWN Notification()?
  • 您确定变量m_bitmapbutton与按钮A正确关联吗?你可以试试GetDlgItem(IDC_BUTTON_A) - > EnableWindow(FALSE);

您总是可以设置一个布尔成员变量来指示按钮A被禁用,并忽略设置此布尔成员时发送给它的任何事件。

使用this class from CodeProject可能更容易。

答案 1 :(得分:0)

我认为问题在于,当您参加事件B时,不会调度此窗口的消息。因此,在您完成参加活动B并且您再次启用按钮A后,他们将排队并进行调度。这样的事情:

  1. OnBnClickedButtonB
  2. buttonA.EnableWindow(FALSE) (窗口的鼠标事件正在排队但未分派)
  3. buttonA.EnableWindow(TRUE)
  4. 〜OnBnClickedButtonB (应用程序调度排队事件,以便再次启用该按钮)
  5. 这不仅仅是CBitmapButton的一个问题......它应该与任何其他按钮发生碰撞(我没有尝试过自己)。

    可能的解决方法可能是在再次启用按钮之前为此窗口调度鼠标事件...虽然我不太喜欢这样的事情......也许有人可以给你一个更好的解决方案:

    void CMyDlg::OnBnClickedButtonB()
    {
        m_buttonA.EnableWindow(FALSE);
    
        //Process button B clicked event 
    
        MSG msg;
        while(PeekMessage(  &msg, 
                    GetSafeHwnd(), 
                    WM_MOUSEFIRST, 
                    WM_MOUSELAST, 
                    PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);  
        }
    
        m_buttonA.EnableWindow(TRUE);
    }
    

    希望这有帮助!

    哈维尔