2011-05-11 26 views
2

我正在使用Visual Basic 6(請不要笑),並且我希望在運行時動態地將控件放置在基於「頂級」菜單項之一的位置(如「文件「,」編輯「,」查看「)。不幸的是,VB的菜單控件(它們是這些「文件」,「編輯」等東西所具有的控件類型)沒有任何屬性,如「頂部」,「左」,「高度」或「寬度」。如何判斷VB6中菜單項的位置?

我只能做實驗,目測它,並最終到達數字,我會硬編碼,但出於各種原因,我寧願代碼實際上找出控制應該去哪裏。

我在想,也許有一些Windows API調用,我可以用它來弄清楚菜單控件的位置?

在此先感謝。

編輯:萬一它很重要,這是在一個MDI表格。

編輯#2:

OK,回答我的問題:

您可以通過GetMenuBarInfo功能得到每個項目的主菜單欄上的位置,如:

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

其中 「lMenuNumber」 爲1的第一(例如 「文件」),2表示第二個(例如, 「編輯」)等

即MBI STRU ct有一個rcBar成員,它是該菜單項所在矩形的座標。

不幸的是,它在相對於屏幕的絕對座標中,而不是相對於MDI形式。所以,讓mbi成爲你感興趣的和第一個的,然後減去。

另外,在mbi中給出的位置是以像素爲單位的,因此可以根據需要轉換爲緹或任何。

+0

按位置你是指第一,第二等或其座標? – BlackBear 2011-05-11 14:21:00

+0

座標。我想弄清楚頂部,左邊等。 – 2011-05-11 14:21:50

+1

請不要這樣做。把你的控制權放在菜單欄以外的地方。菜單欄用於菜單。 – 2011-05-11 15:27:07

回答

1

OK,回答我的問題:

您可以通過GetMenuBarInfo功能得到每個項目的主菜單欄上的位置,如:

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

其中「lMenuNumber」是1第一個(例如「文件」),第二個(例如「編輯」),等等。

mbi結構有一個rcBar成員,它是該菜單項所在矩形的座標。

不幸的是,它在相對於屏幕的絕對座標中,而不是相對於MDI形式。所以,讓mbi成爲你感興趣的和第一個的,然後減去。

另外,在mbi中給出的位置是以像素爲單位的,因此可以根據需要轉換爲緹或任何。

1

這是一種註定。標準菜單在外觀和寬度上會隨Windows的版本和用戶對UI字體等的設置而有所不同。對於我們所知道的Windows Next/8可能會將它們放在窗口的左側!

如果這個信息是爲了使用它將可用。

也許如果你能解釋更多關於你想要用你的UI來做什麼,我們可能會有其他的建議。

+0

這是一個好點,但坦率地說,不是我所關心的。由於我使用了一個古老的開發環境,因此我不得不基於純粹的獲取某些有用的東西的名義而忽視這些事實,因此我產生了各種各樣的純度問題。微軟可能推出帶有左側菜單的新操作系統是我最擔心的問題。 – 2011-05-11 15:27:18

+0

哎呀,沒有意識到「迴歸」導致帖子發生而不是換行。這就是我要繼續說的: 我這樣做的原因是因爲VB6強制限制每個表單255個控件,並且我們達到了這個限制,主要是因爲有類似於230個菜單項的東西,每個這被視爲一個控制。 因此,我得到了第三方彈出式菜單控件,它將被計數爲1而不是230或任何其他值,並且我想告訴它在用戶單擊「文件」或「編輯」或其他任何內容時彈出在適當位置打開。 – 2011-05-11 15:31:18

+1

這聽起來像很多菜單項。你可以使用控制數組。 – Bob77 2011-05-11 19:42:02

相關問題