4

我有使用 MFC 编写的在 Windows 上运行的应用程序。菜单项的启用/禁用状态取决于很多条件。例如,如果满足条件 A 或满足条件 B,我必须启用菜单项,但如果 A 和 B 同时为 TRUE,则应禁用该菜单项。我们如何在代码中对此进行建模?我想我应该使用某种状态机,但我的状态机似乎包含太多状态。处理此类问题的一般方法是什么?请注意,以上只是一个例子,这样的条件还有很多。此外,始终启用菜单并在用户按下它时显示错误消息的选项不存在,因为我必须禁用菜单。

澄清一下,我不是在寻找如何禁用 MFC 中的菜单项,而是在寻找在涉及许多相互依赖的状态时决定是否启用/禁用菜单项的最佳方法。

4

3 回答 3

0

尝试编写一个updateUIStatus()在每个 UI 操作后调用的方法。该方法将根据您的条件设置菜单项(以及任何其他 UI 组件)的启用或禁用状态。

使用单一方法进行所有 UI 状态更新的好处在于,您可以将所有这些逻辑集中在一个地方,而不是多次调用,例如,if (condition A && condition B) menu.setEnabled(true);

于 2009-03-01T15:59:41.640 回答
0

MFC 具有用于启用和禁用菜单项的内置机制,以命令路由和ON_UPDATE_COMMAND_UI宏的形式。有关更多详细信息,请参阅如何:更新用户界面对象和 MSDN 中的CCmdUI类文档。

您不一定需要状态机。对于每个菜单命令,决定应该在哪里处理命令,例如,在您的文档、视图或主框架类中,然后实现一个OnUpdate处理程序并为适当的类添加一个ON_UPDATE_COMMAND_UI消息映射条目。

例如,看看我给这个问题的答案。

于 2009-03-01T16:57:30.643 回答
0

看一下中介模式。它旨在跟踪此类内容。

来自 gof:

在以下情况下使用中介者模式

一组对象以定义明确但复杂的方式进行通信。由此产生的相互依赖是非结构化的并且难以理解。

重用一个对象很困难,因为它引用了许多其他对象并与之通信。

分布在多个类之间的行为应该是可定制的,无需大量子类化。

于 2019-07-26T05:39:07.353 回答