Как определить позицию пункта меню в VB6?

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

К сожалению, элемент управления меню VB (который является типом элемента управления, которым являются эти «Файл», «Редактировать» и т. Д.) Не имеет никаких свойств, таких как «Верх», «Слева», «Высота» или «Ширина».

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

Я думаю, что, возможно, есть какой-то вызов API Windows, который я могу использовать, чтобы выяснить положение элемента управления «Меню»?

Заранее спасибо.

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


person Ptah- Opener of the Mouth    schedule 11.05.2011    source источник
comment
по положению вы ссылаетесь на 1-й, 2-й и т. д. или его координаты?   -  person BlackBear    schedule 11.05.2011
comment
Координаты. Я хочу выяснить верхнее, левое и т.   -  person Ptah- Opener of the Mouth    schedule 11.05.2011
comment
Пожалуйста, не делайте этого. Поместите элемент управления в другое место, кроме строки меню. Строка меню предназначена для меню.   -  person David Heffernan    schedule 11.05.2011
comment
Спасибо Дэвид, но управление, которое я там ставлю, это меню. Я заменяю встроенные меню VB6 сторонним всплывающим меню из-за присущих VB6 ограничений. Мне нужно выяснить, где сказать, чтобы это всплывающее меню открывалось, чтобы оно находилось в том же месте, что и встроенное меню.   -  person Ptah- Opener of the Mouth    schedule 11.05.2011
comment
Я действительно пытался опубликовать это как ответ, и мне сказали, что новые пользователи не могут ответить на свой вопрос, пока не пройдет восемь часов. Итак, вместо этого я отредактировал свой вопрос. Я попытаюсь опубликовать это сейчас, хотя снова.   -  person Ptah- Opener of the Mouth    schedule 12.05.2011
comment
Теперь он позволяет мне опубликовать его, но не позволяет мне принять его еще 23 часа. Христос.   -  person Ptah- Opener of the Mouth    schedule 12.05.2011


Ответы (2)


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

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

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

person Bob77    schedule 11.05.2011
comment
Это хороший момент, но, честно говоря, меня это не волнует. У меня есть всевозможные проблемы с чистотой, возникающие из-за того, что я использую древнюю среду разработки, которую я должен по существу игнорировать во имя того, чтобы просто получить что-то работающее. Меня меньше всего беспокоит мысль о том, что Microsoft может выпустить новую ОС с меню слева. - person Ptah- Opener of the Mouth; 11.05.2011
comment
Ой, не понял, что return приводит к тому, что сообщение происходит вместо перевода строки. Вот что я собирался продолжить: Причина, по которой я это делаю, заключается в том, что VB6 накладывает ограничение в 255 элементов управления на форму, и мы достигли этого предела, в основном благодаря тому, что у нас есть что-то вроде 230 пунктов меню, каждый из которых имеет значение. в качестве контроля. Итак, у меня есть сторонний элемент управления всплывающим меню, который будет считаться 1 вместо 230 или чего-то еще, и я хочу, чтобы он открывался в соответствующем месте, когда пользователь нажимает «Файл», «Редактировать» или что-то еще. - person Ptah- Opener of the Mouth; 11.05.2011
comment
Я не могу представить работу с 255 меню без массивов элементов управления. Обычно я называю главное меню mnuMain(0), mnuMain(1), ..., а всплывающие меню ФайлmnuFile(0), mnuFile(1), ..., а затем РедактироватьmnuEdit(0), mnuEdit(1) и т. д. - person wqw; 12.05.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, указывается в пикселях, поэтому при необходимости конвертируйте в твипы или что-то еще.

person Ptah- Opener of the Mouth    schedule 12.05.2011