動的に無効化および有効化する必要のあるタスクを含むタスクバーがあります。今のところ私はCMFCTasksPane :: ShowTaskでそれを行っていますが、それはタスクも非表示/表示します。理想的には、有効になっていないときにタスクをグレー表示したいと思います。ON_COMMANDマクロを使用して登録されていないタスクコマンドに割り当てると、同じ動作が発生することに気付きました。その後、グレー表示されます。ただし、後でこの動作を動的に制御する方法がわかりません。これはどのように行うことができますか?(理想的には、すでに提供されているものを使用しますが、もちろん他の方法がない場合は必ずしもそうとは限りません)。
これは、それを実証するための最小限の例です。CMainFrame
私が追加しました:
// CMainFrame class definition
CMFCTasksPane pane;
afx_msg void OnCommand1() {};
afx_msg void OnCommand2() {};
// constants
int TASKBAR_ID = 33333;
int TASK_ID1 = 34000;
int TASK_ID2 = 34001;
// BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
ON_COMMAND(TASK_ID1, &CMainFrame::OnCommand1)
ON_COMMAND(TASK_ID2, &CMainFrame::OnCommand2)
// CMainFrame::OnCreate
pane.Create("Pane", this, 500, FALSE, TASKBAR_ID);
pane.AddGroup("Group1");
pane.AddTask(0, "Task1", -1, TASK_ID1);
pane.AddTask(0, "Task2", -1, TASK_ID2);
pane.EnableGroupCollapse(FALSE);
pane.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&pane);
次に、タスクボタンが表示/クリック可能になります。
たとえば、ON_COMMANDマクロを削除した場合、クリックできません(これは、動的に有効/無効にしたいものです)。
私が使用する場合、ShowTask
それは完全に隠されています(予想通りですが、私が望むものではありません):
pane.ShowTask(0, 0, FALSE);
私はどんな提案にも感謝します。
編集:それは少しハックですが、私は方法を見つけたと思います。基本的に私が行うボタンを無効にするには:
CMFCTasksPaneTask* task = pane.GetTask(0, 0);
task->m_uiCommandID = 1;
そしてそれを再び有効にするために私はします:
CMFCTasksPaneTask* task = pane.GetTask(0, 0);
task->m_uiCommandID = TASK_ID1;
もちろん、期待どおりに機能しているようです。これを行うためのより適切な方法があれば、私は喜んでいます。
これを引き起こす理由は、UI更新メカニズムの関与です。また、CMFCTasksPane
クラスにはタスクアイテムを有効/無効にできるパブリックメンバーがないように見えますが、UI更新メカニズムはタスクアイテムを変更したとしても変更します。
実際、ON_COMMAND
アクティブなクラスインスタンスの1つにUIアイテム(メニュー、ツールバー/鉄筋ボタンなど)のハンドラーがあると、アイテムが有効になりますが、ハンドラーがないと無効になります。これは、DocumentクラスまたはViewクラスにハンドラーが実装されているMDI
プロジェクトで簡単に確認できますON_COMMAND
。すべてのビュー(およびその後のすべてのドキュメント)を閉じると、メニュー項目またはツールバーボタンが自動的に無効になります。
ON_UPDATE_COMMAND_UI
ハンドラーを使用することで、上記のデフォルトの動作を変更し、現在選択されているデータなどの他の基準に基づいて有効化/無効化条件を指定できます。UI更新メカニズムはMFCの非常に強力な機能であり、UIアイテムを変更する可能性のあるすべてのポイントで明示的に評価(およびアイテムを更新)するのではなく、コード内の1つのポイントでUIアイテムを更新する条件を設定できます。 (たとえば、ユーザーがコマンドを選択したとき、コントロールの状態を変更したとき、別のデータセットを選択したときなど)。ON_UPDATE_COMMAND_UI
あなたはそこに任意の長い操作を置くべきではありませんので、ハンドラは、アイドル時の処理中に実行されます。短いビープコマンド(例Beep(500,30);
)を追加するだけで、これらが呼び出される頻度を確認できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加