&引用;粘的;MFC弹出菜单

&引用;粘的;MFC弹出菜单,mfc,popup,contextmenu,Mfc,Popup,Contextmenu,我现在有一些工具栏按钮,旁边有一个小箭头(TBSTYLE\u EX\u drawdarrows),单击这些按钮时,按钮下会显示一个弹出式上下文菜单。这是通过构造自定义弹出菜单并调用TrackPopupMenu来实现的 客户机现在希望能够在关闭菜单之前从菜单中选择多个选项,以便可以修改多个选项,而无需重新打开菜单并等待每次更改之间的中间重画 例如: 用户单击下拉按钮 出现下拉菜单(模式,无限期等待用户操作) 用户单击某些项目(例如,切换复选标记) 计时器(如500毫秒)启动 如果计时器过期,则关闭

我现在有一些工具栏按钮,旁边有一个小箭头(
TBSTYLE\u EX\u drawdarrows
),单击这些按钮时,按钮下会显示一个弹出式上下文菜单。这是通过构造自定义弹出菜单并调用
TrackPopupMenu
来实现的

客户机现在希望能够在关闭菜单之前从菜单中选择多个选项,以便可以修改多个选项,而无需重新打开菜单并等待每次更改之间的中间重画

例如:

  • 用户单击下拉按钮
  • 出现下拉菜单(模式,无限期等待用户操作)
  • 用户单击某些项目(例如,切换复选标记)
  • 计时器(如500毫秒)启动
  • 如果计时器过期,则关闭菜单并执行所有选定的操作
  • 用户在计时器过期之前单击另一项,返回到4

  • 我能想到的最好办法是通过多次调用
    TrackPopupMenu
    重新显示菜单。这会使菜单在您选择某个项目时“闪烁”,并且可能需要我启动一个线程来执行超时操作,我宁愿避免超时操作。

    与其设置菜单,不如设置一个包含选项的对话框。对话框可以轻松完成所有需要的操作

    当你点击一个菜单时,它不会关闭,这似乎是错误的。一个单独关闭的对话框看起来也不正确,但它可能是两个坏处中最小的一个

    编辑:如果我从微软学到了什么,那就是不要试图抵制默认行为。你这样做是自找麻烦

    如果你在动态构建菜单,我可以看到自动调整大小是多么方便,但在对话框中也不难做到——让对话框变得非常大,在它变得可见之前,枚举子菜单并将其所有矩形合并,然后调整大小。检查边界以确保它们在屏幕上只是几个带有OffsetRect的if语句。复选框是微不足道的;图标没有那么糟糕,但仍然不错


    另一个易于添加的增强功能是双击后立即关闭对话框。

    在@Mark Ransom的回答之后,您应该打开一个对话框。但您可以使对话框无模式,并在单击对话框外部时使其自动关闭(即,对话框失去焦点)。这样的话,它就更像菜单了


    请注意,普通菜单永远不会自行消失,您必须始终单击菜单之外的某个位置(或其选项之一)才能使其消失。

    我也不完全赞同这个想法,其目的是合理的。每次更改都要重新打开菜单,这很乏味,至少在这个应用程序中是这样。我考虑过使用菜单以外的东西,这是一个选项,但菜单提供了相当多的功能,例如自动调整大小以适应其内容,将其自身放置在屏幕上以确保其可见,显示复选框/单选按钮图标或自定义图标等。,我必须手动构建。感谢您提出我忘记的方面。我应该警告你,当你这样做的时候,有一些棘手的边缘情况,当你失去焦点时依靠消息可能是不够的。对不起,我记不起具体细节了,但我不得不经历一次,这很痛苦。