2

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

如果事件 B 正在执行(从按钮 B),我想要做的是阻止按钮 A 触发事件 A。所以在事件 B 中,我想禁用按钮 A。

4

2 回答 2

1

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

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

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

从 CodeProject 使用此类可能更容易。

于 2009-03-12T18:03:06.687 回答
0

我想问题是当你参加活动 B 时,这个窗口的消息没有被发送。因此,在您完成参加活动 B 并且您再次启用按钮 A 后,他们正在排队和调度。像这样的东西:

  1. OnBnClickedButtonB
  2. buttonA.EnableWindow(FALSE) (窗口的鼠标事件正在排队而不是调度)
  3. buttonA.EnableWindow(TRUE)
  4. ~OnBnClickedButtonB(应用程序调度排队事件,使按钮再次启用)

这不仅仅是 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);
}

希望这有帮助!

哈维尔

于 2009-03-13T09:08:31.190 回答