Как узнать положение пункта меню в VB6? - PullRequest
2 голосов
/ 11 мая 2011

Я использую Visual Basic 6 (пожалуйста, не смейтесь), и я хотел бы динамически позиционировать элемент управления во время выполнения в положение, основанное на положении одного из пунктов меню «верхнего уровня» (например, "Файл", "Редактировать", "Просмотр").

К сожалению, элемент управления VB's Menu (который представляет собой тип элемента управления «File», «Edit» и т. Д.) Не имеет таких свойств, как «Top», «Left», «Height» или « Ширина».

Я мог бы просто поэкспериментировать, взглянув на это, и в итоге получить числа, которые я жестко закодирую, но по разным причинам я бы предпочел, чтобы код действительно выяснил, куда должен идти элемент управления.

Я думаю, что, возможно, есть какой-то вызов 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, указана в пикселях, поэтому при необходимости конвертируйте в твипы или что-то еще.

Ответы [ 2 ]

1 голос
/ 12 мая 2011

ОК, отвечая на мой вопрос:

Вы можете получить положение каждого элемента в строке главного меню с помощью функции GetMenuBarInfo, например:

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

Где "lMenuNumber" равен 1 для первого (например, "Файл"), 2 для второго (например, "Редактировать") и т. Д.

Эта структура mbi имеет член rcBar, который является координатами прямоугольника, в котором находится этот пункт меню.

К сожалению, он находится в абсолютных координатах относительно экрана, а не относительно формы MDI. Итак, возьмите mbi, который вас интересует, и первого и вычтите.

Кроме того, позиция, указанная в mbi, указывается в пикселях, поэтому при необходимости конвертируйте в твипы или что-либо еще.

1 голос
/ 11 мая 2011

Это как бы обречено. Стандартные меню будут различаться по внешнему виду и ширине в зависимости от версии Windows и настроек пользователя для шрифтов пользовательского интерфейса и т.п. Насколько нам известно, Windows Next / 8 может размещать их вдоль левой части окна!

Если бы эта информация предназначалась для использования, она была бы доступна.

Возможно, если бы вы могли объяснить больше о том, что вы пытаетесь сделать со своим пользовательским интерфейсом, у нас могли бы быть альтернативные предложения.

...