Есть всплывающее меню на форме без полей


Как добавить всплывающее меню в форму без полей VB 6.0?

Каждый раз, когда я добавляю меню, граница появляется снова, даже если BorderStyle установлено в vbBSNone и меню скрыто.

3 3

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