ツールバー上にあるボタンを無効にする。

[戻る]
2004/11/12(金) 01:17:18
こんばんわ

ツールバーにあるボタンを
CToolBarCtrlクラスを使って無効にしたいのですが、
うまく動きません。
何卒、良きアドバイスをお願いいたします。

メインフレームで以下のようなコードをかきました。
ツールバーのボタンIDはID_BUTTON_ONEとし、
m_wndToolBar.GetToolBarCtrl().EnableButton(ID_BUTTON_ONE, FALSE);としました。
デバックで観ると、実行はされる(一瞬無効になる)のですが、その後で元に戻ってしま
う感じです。なぜ元に戻るか判りません。

環境は WinXP,VC++6.0,SDIです。
よろしくお願いいたします。

Tab 2004/11/12(金) 10:07:51
ID_BUTTON_ONE の UPDATE_COMMAND_UI ハンドラで有効/無効を切り替えるようにしてく
ださい。
他に方法が無いってわけではないけれど、それが MFC での定石です。

2004/11/17(水) 01:24:52
アドバイスどうもありがとうございます。

どうしても、下記方法でボタンを無効にしたいのですが、無理なのでしょうか?
m_wndToolBar.GetToolBarCtrl().EnableButton(ID_BUTTON_ONE, FALSE);

以上、よろしくお願いいたします。

シャノン 2004/11/19(金) 10:16:30
それで無効にしても、UPDATE_COMMAND_UI で処理をしなければ、有効化されてしまうの
でしょう。

なぜ、「どうしてもそうしなければならない」のかを書けば、「どうしてもそうしなけ
ればならない」という制限自体を回避する方法が見つかるかもしれませんよ。

ただ、少なからず苦しい方法にはなるでしょうが。

Tab 2004/11/19(金) 18:41:57
>どうしても、下記方法でボタンを無効にしたいのですが、無理なのでしょうか?
>m_wndToolBar.GetToolBarCtrl().EnableButton(ID_BUTTON_ONE, FALSE);

普通は、
専用のフラグを用意しておいて、そのフラグに有効/無効を設定します。
そして、UPDATE_COMMAND_UI でそのフラグ状態に従ってコマンドの有効/無効を切り替
えます。

コマンドはメニュー、ツールバーなど複数の UI 要素に関連付けられるものであり、
UPDATE_COMMAND_UI はそれらを状況依存で集中管理するのに使われます。
各 UI 要素が UPDATE_COMMAND_UI に問い合わせて状態を更新するイメージです。

ID_BUTTON_ONE コマンドはツールバーボタンにだけ置くコマンドなのですか?
仮にそうだとして、あとでメインメニューにも入れたくなったらどうします?
右クリックメニューに追加したくなったらどうします?
ボタンが不要になったら各所に書かれた EnableButton() も削除しなくちゃいけないで
すよ?

UPDATE_COMMAND_UI に書いておけば、関連する UI 要素の追加/削除は自由自在にでき
るのです。

ボタンがコマンドのマスターであり絶対不変のものだというのであれば、
UPDATE_COMMAND_UI の中に、
  pCmdUI->Enable(m_wndToolBar.GetToolBarCtrl().IsButtonEnabled(ID_APP_ABOUT));
とでも記述すれば、意図通りのことが実現できるかもしれません。
#よいこは真似をしないでね

Tab 2004/11/19(金) 18:43:33
>  pCmdUI->Enable(m_wndToolBar.GetToolBarCtrl().IsButtonEnabled(ID_APP_ABOUT));
pCmdUI->Enable(m_wndToolBar.GetToolBarCtrl().IsButtonEnabled(ID_BUTTON_ONE));
                                                             ~~~~~~~~~~~~~

2004/12/08(水) 01:18:26
[[解決]]
Tab様 レスどうもありがとうございました。
また、回答が遅れて大変申し訳ございませんでした。

上記ツールバーのボタンに関しては、フラグを用意し制御することにいたします。

また、この場を借りての便乗質問で申し訳ないのですが、
ダイアログバーに創ったボタンを無効にするにはどうすればよいのでしょうか。

GetDlgItem(***)->EnableWindow(FALSE)では無効にできませんでした。
また、無効にしたいボタンにUPDATE_COMMAND_UIのハンドラがありませんでした。?

どうか、良きアドバイスをお願いいたします。

古いスレッドには追加発言できません。