更新工具栏按钮状态会窃取另一个窗口的焦点

时间:2012-11-05 16:41:01

标签: visual-studio-2008 mfc mfc-feature-pack

我正在开发一个MDI应用程序,更新工具栏按钮会搞乱拖动矩形的绘制。

在ON_WM_LBUTTONDOWN中调用SetCapture(),在ON_WM_MOUSEMOVE中更新拖动矩形,在ON_WM_LBUTTONUP中删除矩形并调用ReleaseCapture()。

大多数情况下,此过程运行良好,但在此拖动操作期间,特定工具栏按钮将其状态从启用切换为禁用,然后初始窗口失去焦点,并且不会收到WM_LBUTTONUP。

这是callstack的一部分

MyApp.exe!MyWindow::OnCaptureChanged(CWnd * pWnd=0x00000000)
...
mfc90d.dll!CWnd::EnableWindow(int bEnable=0x00000000)  Line 352 + 0x11 bytes C++
mfc90d.dll!CMFCToolBarEditBoxButton::SetStyle(unsigned int nStyle=0x00040000)  Line 470 C++
mfc90d.dll!CMFCToolBar::SetButtonStyle(int nIndex=0x00000001, unsigned int nStyle=0x00040000)  Line 1268 C++
mfc90d.dll!CMFCToolBarCmdUI::Enable(int bOn=0x00000000)  Line 2560 C++
MyApp.exe!MyToolbar::OnUpdateButton(CCmdUI * pCmd=0x0012faa8)
...
mfc90d.dll!CWinApp::OnIdle(long lCount=0x00000000)

由于代码在软件移动到mfc功能包之前一直有效,我可以想象原因是设置错误的工具栏按钮(例如错误的窗口样式)?

或者我应该在绘制拖动矩形时阻止对OnIdle的调用(如果是这样,是否有一些标准方法可以实现此目的?)。

1 个答案:

答案 0 :(得分:1)

据我所知,工具栏无法获得焦点。我怀疑你的更新处理程序本身在你的一个窗口上调用EnableWindow。 Mayber你在工具栏中放了一个自定义的HWND吗?