0

私は、ツールバーのボタンを更新すると、ドラッグ長方形の描画が台無しになる MDI アプリケーションに取り組んでいます。

ON_WM_LBUTTONDOWN で SetCapture() が呼び出され、ON_WM_MOUSEMOVE でドラッグ四角形が更新され、ON_WM_LBUTTONUP で四角形が消去され、ReleaseCapture() が呼び出されます。

ほとんどの場合、この手順はうまくいきますが、このドラッグ操作中に特定のツールバー ボタンの状態が有効から無効に切り替わると、最初のウィンドウがフォーカスを失い、WM_LBUTTONUP を受け取りません。

これがコールスタックの一部です

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 の呼び出しをブロックする必要があります (そうであれば、これを達成するための標準的な方法はありますか?)。

4

1 に答える 1

1

私の知る限り、ツールバーはフォーカスされません。あなたの更新ハンドラー自体がEnableWindowあなたのウィンドウの1つを呼び出しているのではないかと思います。HWNDたぶん、ツールバーにカスタムを入れましたか?

于 2012-11-06T08:10:36.867 に答える