Windows 如何在VB6中判断菜单项的位置?

Windows 如何在VB6中判断菜单项的位置?,windows,winapi,vb6,menu,position,Windows,Winapi,Vb6,Menu,Position,我使用的是Visual Basic 6(请不要笑),我希望在运行时根据其中一个“顶级”菜单项(如“文件”、“编辑”、“视图”)的位置动态地将控件定位在某个位置 不幸的是,VB的菜单控件(这是“文件”、“编辑”等控件的类型)没有任何属性,如“顶部”、“左侧”、“高度”或“宽度” 我可以进行实验,观察它,最终得出我将硬编码的数字,但出于各种原因,我更希望代码能够真正确定控件应该放在哪里 我在想,也许有一些Windows API调用,我可以用它来确定菜单控件的位置 提前谢谢 编辑:如果有问题,这是在M

我使用的是Visual Basic 6(请不要笑),我希望在运行时根据其中一个“顶级”菜单项(如“文件”、“编辑”、“视图”)的位置动态地将控件定位在某个位置

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

我可以进行实验,观察它,最终得出我将硬编码的数字,但出于各种原因,我更希望代码能够真正确定控件应该放在哪里

我在想,也许有一些Windows API调用,我可以用它来确定菜单控件的位置

提前谢谢

编辑:如果有问题,这是在MDI表单上

编辑#2:


好,回答我自己的问题:

您可以通过GetMenuBarInfo函数获取主菜单栏上每个项目的位置,例如:

    Dim mbi as MENUBARINFO
    mbi.cbSize = LenB(mbi)
    GetMenuBarInfo Me.hWnd, OBJID_MENU, lMenuNumber, mbi
    Dim mbi as MENUBARINFO
    mbi.cbSize = LenB(mbi)
    GetMenuBarInfo Me.hWnd, OBJID_MENU, lMenuNumber, mbi
其中,第一个(如“文件”)的“lMenuNumber”为1,第二个(如“编辑”)的“lMenuNumber”为2,等等

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

不幸的是,它是相对于屏幕的绝对坐标,而不是相对于MDI表单。所以,得到你感兴趣的mbi和第一个的mbi,然后减去


此外,mbi中给出的位置是以像素为单位的,因此需要将其转换为twips或其他任何形式。

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

如果要使用这些信息,就可以获得这些信息


如果您能详细解释一下如何使用UI,我们可能会有其他建议。

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

您可以通过GetMenuBarInfo函数获取主菜单栏上每个项目的位置,例如:

    Dim mbi as MENUBARINFO
    mbi.cbSize = LenB(mbi)
    GetMenuBarInfo Me.hWnd, OBJID_MENU, lMenuNumber, mbi
    Dim mbi as MENUBARINFO
    mbi.cbSize = LenB(mbi)
    GetMenuBarInfo Me.hWnd, OBJID_MENU, lMenuNumber, mbi
其中,第一个(如“文件”)的“lMenuNumber”为1,第二个(如“编辑”)的“lMenuNumber”为2,等等

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

不幸的是,它是相对于屏幕的绝对坐标,而不是相对于MDI表单。所以,得到你感兴趣的mbi和第一个的mbi,然后减去


此外,mbi中给出的位置以像素为单位,因此根据需要转换为twips或其他任何形式。

根据位置,您指的是1、2等还是其坐标?坐标。我想算出顶部、左侧等。请不要这样做。将控件放在菜单栏以外的其他位置。菜单栏是菜单栏。谢谢大卫,但我放在那里的控件是菜单。由于VB6的固有限制,我将用第三方弹出菜单控件替换VB6的内置菜单。我需要弄清楚在哪里告诉弹出菜单弹出打开,这样它就和内置菜单在同一个位置。我确实试图把它作为一个答案发布,并且被告知新用户在八个小时后才能回答他们自己的问题。因此,我编辑了我的问题。不过,我现在会再发一次。这是一个很好的观点,但坦率地说,这不是我关心的问题。由于我使用的是一个古老的开发环境,我有各种各样的纯度问题,我不得不以简单地获得一些有效的东西的名义忽略这些问题。我最不担心的是微软可能会推出一款左边有菜单的新操作系统。哎呀,我没有意识到“返回”会导致帖子而不是换行。下面是我要继续说的:我这么做的原因是因为VB6对每个表单施加了255个控件的限制,我们达到了这个限制,主要是因为有230个菜单项,每个菜单项都算作一个控件。因此,我得到了一个第三方弹出菜单控件,它将计为1,而不是230或其他什么,我想告诉它,当用户单击“文件”或“编辑”或其他什么时,它将在适当的位置弹出打开。没有控件数组,我无法处理255个菜单的图像。我通常将主菜单命名为
mnuMain(0)
mnuMain(1)
。。。文件弹出菜单是
mnuFile(0)
mnuFile(1)
。。。然后进行编辑的是
mnuEdit(0)
mnuEdit(1)
,等等。