你如何禁用 CBitmapButton?
Posted
技术标签:
【中文标题】你如何禁用 CBitmapButton?【英文标题】:How do you disable CBitmapButton? 【发布时间】:2009-03-12 17:57:23 【问题描述】:如何禁用 CBitmapButton?我尝试使用 m_bitmapbutton.EnableWindow(false);但它不起作用。它仍然会触发一个事件。
如果事件 B 正在执行(从按钮 B),我想要做的是阻止按钮 A 触发事件 A。所以在事件 B 中,我想禁用按钮 A。
【问题讨论】:
【参考方案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可能更容易。
【讨论】:
对这两个问题都是肯定的。这是一个错误吗?除了使用类还有其他选择吗? 我认为你最好使用 CodeProject 按钮 事件 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);【参考方案2】:我想问题是当您参加活动 B 时,该窗口的消息没有被发送。因此,在您完成参加活动 B 并且您再次启用按钮 A 后,他们正在排队和调度。类似的东西:
-
OnBnClickedButtonB
buttonA.EnableWindow(FALSE)
(窗口的鼠标事件正在排队中而不是分派)
buttonA.EnableWindow(TRUE)
~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);
希望对您有所帮助!
哈维尔
【讨论】:
以上是关于你如何禁用 CBitmapButton?的主要内容,如果未能解决你的问题,请参考以下文章