Как да разбера позицията на елемент от менюто във VB6?

Използвам Visual Basic 6 (моля, не се смейте) и бих искал динамично да позиционирам контрола, по време на изпълнение, в позиция въз основа на позицията на един от елементите на менюто от "най-високо ниво" (като "Файл" , „Редактиране“, „Преглед“).

За съжаление, контролата на менюто на VB (която е типът контрола, който са тези неща "Файл", "Редактиране" и т.н.) няма никакви свойства като "Горе", "Ляво", "Височина" или "Ширина".

Бих могъл просто да експериментирам, да го наблюдавам и в крайна сметка да стигна до числа, които ще кодирам твърдо, но поради различни причини бих предпочел кодът действително да разбере къде трябва да отиде контролата.

Мисля си, че може би има някакво извикване на Windows API, което мога да използвам, за да разбера позицията на контролата на менюто?

Благодаря предварително.

Редактиране: В случай, че има значение, това е на 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, е в пиксели, така че преобразувайте, ако е необходимо, в twips или каквото и да е друго.


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 и настройките на потребителя за UI шрифтове и други подобни. Доколкото знаем, Windows Next/8 може да ги постави от лявата страна на прозореца!

Ако тази информация е била предназначена за използване, тя ще бъде налична.

Може би, ако можете да обясните повече за това, което се опитвате да направите с потребителския си интерфейс, може да имаме алтернативни предложения.

person Bob77    schedule 11.05.2011
comment
Това е добър въпрос, но честно казано не е такъв, който ме притеснява. Имам всякакви проблеми с чистотата, които възникват поради факта, че използвам древна среда за разработка, която по същество трябва да игнорирам в името на това просто да получа нещо, което работи. Идеята, че Microsoft може да излезе с нова операционна система, която има менюта отляво, е най-малкото от моите притеснения. - person Ptah- Opener of the Mouth; 11.05.2011
comment
Опа, не разбрах, че връщането кара публикацията да се случи вместо емисия на ред. Ето какво смятах да продължа да казвам: Причината, поради която го правя, е, че 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, е в пиксели, така че преобразувайте, ако е необходимо, в twips или каквото и да е друго.

person Ptah- Opener of the Mouth    schedule 12.05.2011