こんばんわ
ツールバーにあるボタンを
CToolBarCtrlクラスを使って無効にしたいのですが、
うまく動きません。
何卒、良きアドバイスをお願いいたします。
メインフレームで以下のようなコードをかきました。
ツールバーのボタンIDはID_BUTTON_ONEとし、
m_wndToolBar.GetToolBarCtrl().EnableButton(ID_BUTTON_ONE, FALSE);としました。
デバックで観ると、実行はされる(一瞬無効になる)のですが、その後で元に戻ってしま
う感じです。なぜ元に戻るか判りません。
環境は WinXP,VC++6.0,SDIです。
よろしくお願いいたします。
ID_BUTTON_ONE の UPDATE_COMMAND_UI ハンドラで有効/無効を切り替えるようにしてく
ださい。
他に方法が無いってわけではないけれど、それが MFC での定石です。
アドバイスどうもありがとうございます。
どうしても、下記方法でボタンを無効にしたいのですが、無理なのでしょうか?
m_wndToolBar.GetToolBarCtrl().EnableButton(ID_BUTTON_ONE, FALSE);
以上、よろしくお願いいたします。
それで無効にしても、UPDATE_COMMAND_UI で処理をしなければ、有効化されてしまうの
でしょう。
なぜ、「どうしてもそうしなければならない」のかを書けば、「どうしてもそうしなけ
ればならない」という制限自体を回避する方法が見つかるかもしれませんよ。
ただ、少なからず苦しい方法にはなるでしょうが。
>どうしても、下記方法でボタンを無効にしたいのですが、無理なのでしょうか?
>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));
とでも記述すれば、意図通りのことが実現できるかもしれません。
#よいこは真似をしないでね
> pCmdUI->Enable(m_wndToolBar.GetToolBarCtrl().IsButtonEnabled(ID_APP_ABOUT));
pCmdUI->Enable(m_wndToolBar.GetToolBarCtrl().IsButtonEnabled(ID_BUTTON_ONE));
~~~~~~~~~~~~~
Tab様 レスどうもありがとうございました。
また、回答が遅れて大変申し訳ございませんでした。
上記ツールバーのボタンに関しては、フラグを用意し制御することにいたします。
また、この場を借りての便乗質問で申し訳ないのですが、
ダイアログバーに創ったボタンを無効にするにはどうすればよいのでしょうか。
GetDlgItem(***)->EnableWindow(FALSE)では無効にできませんでした。
また、無効にしたいボタンにUPDATE_COMMAND_UIのハンドラがありませんでした。?
どうか、良きアドバイスをお願いいたします。