【问题标题】:"Sticky" MFC popup menu“粘性”MFC 弹出菜单
【发布时间】:2009-10-19 22:40:30
【问题描述】:

我目前有一些工具栏按钮,其侧面有一个小箭头 (TBSTYLE_EX_DRAWDDARROWS),单击该按钮后,会在按钮下方显示一个弹出上下文菜单。这是通过构建一个自定义弹出菜单并调用TrackPopupMenu来完成的。

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

例如:

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

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

【问题讨论】:

    标签: mfc popup contextmenu


    【解决方案1】:

    而不是菜单,而是放置一个带有选项的对话框。对话框可以轻松完成所有需要的操作。

    单击时没有关闭的菜单看起来是错误的。自动关闭的对话框也似乎是错误的,但这可能是两个弊端中最小的一个。

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

    如果您正在动态构建菜单,我可以看到自动调整大小是多么方便,但在对话框中也不难做到 - 让对话框变得非常大,在它变得可见之前,枚举孩子并采取联合他们所有的矩形,然后调整到那个。检查边界以确保它们在屏幕上只是一些带有 OffsetRect 的 if 语句。复选框是微不足道的;图标少了些,但还不错。

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

    【讨论】:

    • 我也不完全认同这个想法,意图是合理的。每次更改都必须重新打开菜单很乏味,至少在这个应用程序中是这样。我考虑过使用菜单以外的东西,这是一个选项,但菜单提供了相当多的功能,例如自动调整大小以适应其内容、将自身放置在屏幕上以确保其可见、显示复选框/单选按钮图标或自定义图标等,我必须手动构建。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您提出我忘记的一个方面。我应该警告你,当你这样做时会有棘手的边缘情况,当你失去焦点时依赖消息可能是不够的。抱歉,我不记得具体细节了,但我不得不经历一次,很痛苦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    相关资源
    最近更新 更多