“Sticky”MFC弹出菜单

时间:2009-10-19 22:40:31

标签: mfc popup contextmenu

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

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

例如:

  1. 用户点击下拉按钮
  2. 显示下拉菜单(模态,无限期等待用户操作)
  3. 用户点击某个项目(例如,切换复选标记)
  4. 计时器(例如,500毫秒)启动
  5. 如果计时器到期,则关闭菜单并执行所有选定的操作。
  6. 用户在计时器到期之前单击另一个项目,返回到4。
  7. 我能想到的最好的方法是多次调用TrackPopupMenu来重新显示菜单。当你选择一个项目时,这会使菜单“闪烁”,并且可能需要我启动一个线程来执行超时,我宁愿避免。

2 个答案:

答案 0 :(得分:3)

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

单击它时未关闭的菜单似乎不对。一个单独关闭的对话框似乎也是错误的,但它可能是两个邪恶中最少的。

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

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

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

答案 1 :(得分:1)

按照@Mark Ransom的回答,您应该设置一个对话框。但是你可以使对话框无模式,并在你点击它之外使它自己关闭(即对话框失去焦点)。这样它可能更像菜单。

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