如何在不完全隐藏任务的情况下以编程方式禁用/启用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",TASK_ID2);
pane.EnableGroupCollapse(FALSE);
pane.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&pane);

然后任务按钮可见/可点击:

enter image description here

例如,如果我删除ON_COMMAND宏,则它不可单击(这是我想动态启用/禁用的功能):

enter image description here

如果我使用ShowTask,它将被完全隐藏(如预期的那样,但不是我想要的):

pane.ShowTask(0,FALSE);

enter image description here

如果有任何建议,我将不胜感激。

编辑: 我认为我找到了一种方法,尽管有点麻烦。基本上是禁用按钮:

CMFCTasksPaneTask* task = pane.GetTask(0,0);
task->m_uiCommandID = 1;

然后重新启用它:

CMFCTasksPaneTask* task = pane.GetTask(0,0);
task->m_uiCommandID = TASK_ID1;

似乎可以按预期工作,当然,如果有更适当的方法可以做到这一点,我会很高兴。

解决方法

引起这种情况的原因是UI Update Mechanism的参与。虽然CMFCTasksPane类似乎没有可以启用/禁用任务项的公共成员,但UI更新机制会更改它们,即使它们确实可以执行。

实际上,在一个活动的类实例中具有一个ON_COMMAND处理程序来处理UI项(菜单,工具栏/钢筋按钮等)会导致该项被启用,而没有使该项禁用。在MDI项目中,通过ON_COMMAND处理程序在Document或View类中实现,可以很容易地看到这一点。如果您关闭所有视图(然后关闭所有文档),则菜单项或工具栏按钮将被自动禁用。

通过使用ON_UPDATE_COMMAND_UI处理程序,您可以更改上述默认行为,并根据其他条件(例如,当前选择的数据)指定启用/禁用条件。 UI更新机制是MFC的一项非常强大的功能,它允许有条件在代码中的一点上更新UI项,而不必在可能更改它的每个点上进行显式评估(并更新该项) (例如,当用户选择命令,更改控件的状态,选择不同的数据集等时)。 ON_UPDATE_COMMAND_UI处理程序在空闲时间处理期间运行,因此您不应在其中进行任何冗长的操作。只需添加一声短促的哔声命令(例如Beep(500,30);)即可找出调用它们的频率。

在我的旧帖子herehere中查看更多详细信息和示例代码。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...