【问题标题】:How to UPDATE_COMMAND_UI with SendMessage如何使用 SendMessage UPDATE_COMMAND_UI
【发布时间】:2021-07-19 02:09:53
【问题描述】:

我想在某些事件中启用/禁用菜单项,独立于 UPDATE_COMMAND_UI 处理程序,所以,我没有 CCmdUI 对象,所以,我想发送一条消息,调用处理程序。我试过这个:

    SendMessage(WM_COMMAND, CN_UPDATE_COMMAND_UI, ID_VIEW_SYNTAXHIGHLIGHT);

这样好吗?如果没有,正确的方法是什么?谢谢。

【问题讨论】:

  • “我想在某些事件中启用/禁用菜单项,这与 UPDATE_COMMAND_UI 处理程序无关” - 这没有意义。只要 UI 进入可以接受用户输入的状态,就会执行 UPDATE_COMMAND_UI 处理程序。您可以随时安排在那里更新您的用户界面。
  • 我的英语并不完美。我的 IDE 有一个二进制编辑器。 CScrollView 使用 32 位有符号整数,因此,视图的大小限制为 2^31-1 像素,因此,行数是有限的。我的二进制编辑器支持 2/4/8/16/32 字节/行模式。如果我插入一些字节,如果超出最大行数,字节/数字会自动复制,这将消除溢出,保持可处理的行数。因此,如果将其更改为 32 字节/行,我必须禁用“双字节/行”菜单项:来自 OnChar。所以,我需要一个 CCmdUI 对象。所以,我必须调用 UPDATE_COMMAND_UI 处理程序。
  • 您是在主框架上还是在模式弹出对话框中使用它?因为在第二种情况下,您可能需要处理WM_KICKIDLE 消息,然后对话框将侦听消息泵,并且在您正在处理它的例程中,执行UpdateDialogControls 之类的操作以使控件的状态起床-迄今为止。
  • 这是一个IDE,一个MDI MFC程序,我想在CIDEView::OnChar中使用。因此,在视图类中,在 WM_CHAR 消息处理程序中。

标签: c++ windows mfc desktop-application sendmessage


【解决方案1】:

不,这不正确。您需要转到 Class View,然后转到 Events 选项卡并添加一个 ON_UPDATE_COMMAND_UI 处理程序。

在实现内部,您可以调用 pCmdUI->Enable() 和/或 pCmdUI->SetCheck()pCmdUI->SetRadio(),具体取决于您希望 UI 项具有的功能。这种机制的好处在于,您不需要在每个可能影响 UI 项的启用/检查/无线电状态的操作之后调用某种比如 UpdateUIItems() 函数,而是由框架调用处理程序,当您的应用程序进入空闲状态时。当然,评估上述条件的代码必须尽可能快。不要在那里执行冗长的操作。尝试在这样的处理程序(例如Beep(1000,25))中播放简短的声音,以查看它们被调用的频率。必须在ON_COMMAND 处理程序中创建、读取或修改数据。在 ON_UPDATE_COMMAND_UI 处理程序中,您必须只告诉框架 UI 项的状态。

检查 UI Update Mechanism。另外,我以前的帖子 herehere

【讨论】:

  • "您需要转到类视图,然后转到事件选项卡并添加一个 ON_UPDATE_COMMAND_UI 处理程序。在实现中,您调用 pCmdUI->Enable() 和/或 pCmdUI->SetCheck( ) 或 pCmdUI->SetRadio(),具体取决于您希望 UI 项具有的功能。”这是在我创建这个问题之前准备好的。所以,我不需要 SendMessage。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多