【问题标题】:How to tell the position of a menu item in VB6?如何判断VB6中菜单项的位置?
【发布时间】:2011-05-12 23:07:30
【问题描述】:

我正在使用 Visual Basic 6(请不要笑),我想在运行时根据“顶级”菜单项之一(例如“文件”、“编辑”、“视图”)。

不幸的是,VB 的 Menu 控件(即这些“文件”、“编辑”等的控件类型)没有任何属性,如“顶部”、“左侧”、“高度”或“宽度”。

我可以进行试验,观察它,最终得出我将硬编码的数字,但出于各种原因,我更希望代码能够真正确定控件的位置。

我在想也许有一些 Windows API 调用可以用来确定 Menu 控件的位置?

提前致谢。

编辑:如果重要的话,这是在 MDI 表单上。

编辑#2:

好的,回答我自己的问题:

可以通过GetMenuBarInfo函数获取主菜单栏上各项的位置,如:

    Dim mbi as MENUBARINFO
    mbi.cbSize = LenB(mbi)
    GetMenuBarInfo Me.hWnd, OBJID_MENU, lMenuNumber, mbi

其中“lMenuNumber”是第一个(例如“文件”)的 1,第二个(例如“编辑”)的 2,等等。

那个 mbi 结构有一个 rcBar 成员,它是那个菜单项所在矩形的坐标。

不幸的是,它是相对于屏幕的绝对坐标,而不是相对于 MDI 表单。因此,获取您感兴趣的 mbi 和第一个,然后减去。

另外,在 mbi 中给出的位置以像素为单位,因此可以根据需要转换为缇或其他值。

【问题讨论】:

  • 按位置是指第一、第二等还是它的坐标?
  • 坐标。我想弄清楚顶部,左侧等。
  • 请不要这样做。将控件放在菜单栏以外的位置。菜单栏用于菜单。
  • 谢谢大卫,但我放在那里的控件是一个菜单。由于 VB6 的固有限制,我正在用第三方弹出菜单控件替换 VB6 的内置菜单。我需要弄清楚在哪里告诉弹出菜单弹出打开,以便它与内置菜单位于同一位置。
  • 我实际上确实试图将其发布为答案,并被告知新用户在八小时后才能回答他们自己的问题。所以,我改为编辑我的问题。不过,我现在会再次尝试发布它。

标签: windows winapi vb6 menu position


【解决方案1】:

这是注定的。标准菜单的外观和宽度会因 Windows 版本和用户对 UI 字体等的设置而异。据我们所知,Windows Next/8 可能会将它们放在窗口的左侧!

如果要使用此信息,它将是可用的。

也许如果您能详细说明您想用您的 UI 做什么,我们可能会有其他建议。

【讨论】:

  • 这是一个很好的观点,但坦率地说,这不是我关心的问题。由于我使用的是古老的开发环境,我遇到了各种各样的纯度问题,我不得不以简单地获得有效的东西的名义忽略这些问题。微软可能会推出一个左侧有菜单的新操作系统的想法是我最不关心的。
  • 哎呀,没有意识到“返回”会导致帖子发生而不是换行。下面是我要继续说的: 我这样做的原因是因为 VB6 对每个表单施加了 255 个控件的限制,而我们已经达到了这个限制,主要是因为有 230 个菜单项,每个都很重要作为对照。所以,我得到了一个第三方弹出菜单控件,它将计为 1 而不是 230 或其他什么,我想告诉它在用户单击“文件”或“编辑”或其他任何内容时在适当的位置弹出打开。
  • 我无法在没有控制数组的情况下处理 255 个菜单。我通常将主菜单命名为 mnuMain(0)mnuMain(1)、...,而 File 弹出菜单是 mnuFile(0)mnuFile(1)、...,然后在 EditmnuEdit(0)mnuEdit(1)
【解决方案2】:

好的,回答我自己的问题:

可以通过GetMenuBarInfo函数获取主菜单栏上各项的位置,如:

    Dim mbi as MENUBARINFO
    mbi.cbSize = LenB(mbi)
    GetMenuBarInfo Me.hWnd, OBJID_MENU, lMenuNumber, mbi

其中“lMenuNumber”是第一个(例如“文件”)的 1,第二个(例如“编辑”)的 2,等等。

那个 mbi 结构有一个 rcBar 成员,它是那个菜单项所在矩形的坐标。

不幸的是,它是相对于屏幕的绝对坐标,而不是相对于 MDI 表单。因此,获取您感兴趣的 mbi 和第一个,然后减去。

另外,在 mbi 中给出的位置以像素为单位,因此可以根据需要转换为缇或其他值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2014-04-13
    • 1970-01-01
    相关资源
    最近更新 更多