How to Create Pop-up Menus on a Visual Basic Form

ID Number: Q71279

1.00

WINDOWS

Summary:

Visual Basic can call the Windows API function TrackPopupMenu to

display a specified menu at the location on the screen that the user

clicks with the mouse.

This information applies to Microsoft Visual Basic Programming

System version 1.00 for Windows.

More Information:

The TrackPopupMenu function displays a "floating" pop-up menu at the

specified location and tracks the selection of items on the pop-up

menu. A floating pop-up menu can appear anywhere on the screen. The

hMenu parameter specifies the handle of the menu to be displayed; the

application obtains this handle by calling GetSubMenu to retrieve the

handle of a pop-up menu associated with an existing menu item.

TrackPopupMenu is defined as follows

TrackPopupMenu (hMenu%,wFlags%, X%, Y%, rRes%, hwnd%, lpRes&)

where:

hMenu% - Identifies the pop-up menu to be displayed.

wFlags% - Not used. This parameter must be set to zero.

x% - Specifies the horizontal position in screen coordinates

of the left side of the menu on the screen.

y% - Specifies the vertical position in screen coordinates

of the top of the menu on the screen.

nRes% - Is reserved and must be set to zero.

hWnd% - Identifies the window that owns the pop-up menu.

lpRes& - Is reserved and must be set to NULL.

The supporting Windows API functions needed to support the arguments

to TrackPopupMenu are:

1. GetMenu(hWnd%)

hWnd% - Identifies the window whose menu is to be examined.

GetMenu returns a value that identifies the menu. The return value

is NULL if the given window has no menu. The return value is

undefined if the window is a child window.

2. GetSubMenu(hMenu%, nPos%)

hMenu% - Identifies the menu.

nPos% - Specifies the position in the given menu of the pop-up

menu. Position values start at zero for the first

menu item.

GetSubMenu returns a value that identifies the given pop-up menu.

The return value is NULL if no pop-up menu exists at the given

position.

To create a pop-up menu within Visual Basic, define a menu system with

the Menu Design window. The following is an example of a menu system:

Caption CntlName Indented

------- -------- --------

File M_File No

New M_New Once

Open M_Open Once

Close M_Close Once

Exit M_Exit Once

Help M_Help No

Within the general-declaration section of your Code window, declare

the following:

Declare Function TrackPopupMenu% Lib "user"(ByVal hMenu%,

ByVal wFlags%,

ByVal X%, ByVal Y%,

ByVal r2%, ByVal hwnd%,

ByVal r1&)

Declare Function GetMenu% Lib "user" (ByVal hwnd%)

Declare Function GetSubMenu% Lib "user" (ByVal hMenu%, ByVal nPos%)

Note: Each Declare statement above must be located on just one line.

Place the following code in the form's MouseUp event procedure:

Sub Form1_MouseUp (Button As Integer, Shift As Integer, X As Single,

Y As Single)

' The above Sub statement must be concatenated onto one line.

Const PIXEL = 3

Const TWIP = 1

ScaleMode = PIXEL

InPixels = ScaleWidth

ScaleMode = TWIP

IX = (X + Left) \ (ScaleWidth \ InPixels)

IY = (Y + (Top + (Height - ScaleHeight -

(Width - ScaleWidth)))) \ (ScaleWidth \ InPixels)

' The above IY = ... statement must be concatenated onto one line.

hMenu% = GetMenu(hwnd)

hSubMenu% = GetSubMenu(hMenu%, Button - 1)

R = TrackPopupMenu(hSubMenu%, 0, IX, IY, 0, hwnd, 0)

End Sub

When you run the program, clicking anywhere on Form1 will display the

first menu on your menu bar at that location.

Reference:

1. "Programming Windows: the Microsoft Guide to Writing Applications

for Windows 3," by Charles Petzold (published by Microsoft

Press, 1990)

2. "Microsoft Windows 3.0 Software Development Kit: Reference

Volume 1"

3. The WINSDK.HLP file shipped with Microsoft Windows 3.0 Software

Development Kit.