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 通知 () を実行していますか? それとも、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. ボタンA.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 に答える