Есть всплывающее меню на форме без полей
Как добавить всплывающее меню в форму без полей VB 6.0?
Каждый раз, когда я добавляю меню, граница появляется снова, даже если BorderStyle
установлено в vbBSNone
и меню скрыто.
3 ответа:
Это выполнимо, но несколько неудовлетворительно (для меня). При наличии каких-либо свойств меню в форме, граница по умолчанию возвращается к видимой. Есть, однако, несколько обходных путей:
1) метод, который, я думаю, вы предпочтете, включает в себя создание второй формы, которую вы никогда не будете по-настоящему "использовать" или видеть. Поместите меню на эту вторую форму, а затем вызовите это меню из формы, которую вы действительно хотите использовать. Предположим, что вы используетеForm_MouseDown
для вызова этого, вот код:Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button And vbRightButton Then PopupMenu Form2.mnuYourMenu End sub
Вы должны будете помнить, что однако выгрузите эту вторую форму из памяти.
2) Другой способ, ТОЛЬКО используя первую форму, состоял бы в том, чтобы установить формуControlBox
вFalse
и оставить СВОЙСТВОCaption
пустым. Это" удаляет " границу, когдаBorderStyle
установлено в 0... Я ставлю removes в кавычки, потому что он, к сожалению, оставит после себя 1-пиксельную черную линию. Это не выглядит плохо, но это не может быть жизнеспособным решением для вас. 3) Последний способ, о котором я читал, но ничего не сделал с собой, - это использоватьCreatePopupMenu
API, найденный в http://allapi.mentalis.org/apilist/CreatePopupMenu.shtmlНадеюсь, это поможет!
Это возможно. Установите для формы BorderStyle значение None, Caption-пустая строка, ControlBox, MaxButton MinButton-False. Затем, используя редактор меню VB6, создайте Меню верхнего уровня с именем "mnuPopup" и установите его видимое свойство в False. Создайте остальную часть меню как подменю этого Меню верхнего уровня, установив их видимые свойства в True. Затем, в коде формы, вы можете отобразить меню с помощью
PopupMenu menuPopup
. Это выглядит так:
Для тех, кто приходит сюда в поисках ответа на эту проблему, вот очень простой метод API, который работает:
Объявления:
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _ (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _ (ByVal hwnd As Long, ByVal nIndex As Long) As Long Const GWL_STYLE = -16, WS_BORDER = &H800000
В Form_Load:
SetWindowLong Me.hwnd, GWL_STYLE, GetWindowLong(Me.hwnd, GWL_STYLE) And Not WS_BORDER