CMFCTasksPaneでタスクを完全に非表示にせずにプログラムで無効化/有効化するにはどうすればよいですか?

シル

動的に無効化および有効化する必要のあるタスクを含むタスクバーがあります。今のところ私は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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ