La funzione TrackPopupMenu (Tutorial completo)
La funzione TrackPopupMenu ha lo specifico scopo di far apparire un Popup-menu
in un punto specifico dello schermo. In più la funzione mantiene selezionata la voce scelta
finchè l'utente seleziona un'altra voce oppure chiude il menu. In generale viene mandato un messaggio
dal Popup-Menu alla finestra principale che lo accoglie, messaggio che indica quale scelta è stata
fatta dall'utente. La differenza sostanziale con la funzione TrackPopupMenuEx risiede nel
parametro prcRect.
Ecco la dichiarazione della funzione:
Declare Function TrackPopupMenuEx Lib "user32.dll" (ByVal hMenu As Long, _
ByVal uFlags As Long, ByVal x As Long, ByVal y As Long, ByVal hWnd As _
Long, prcRect As Long) As Long
|
Diamo un'occhiata ai parametri da utilizzare con TrackPopupMenuEx:
hMenu |
E' l'indicatore del menu
da mostrare attraverso il Popup-Menu.
|
fuFlags |
E' la combinazione
dei seguenti flags che specificano come posizionare il menu ed altre caratteristiche
della funzione:
TPM_CENTERALIGN: posiziona il Popup-Menu in modo tale che la X che si andrà
ad indicare specificherà la coordinata del centro orizzontale del Popup-Menu;
TPM_LEFTALIGN: posiziona il Popup-Menu in modo tale che la X rappresenta
lo spigolo sinistro del Popup-Menu;
TPM_RIGHTALIGN: posiziona il Popup-Menu in modo tale che la X rappresenta
lo spigolo destro del Popup-Menu;
TPM_BOTTOMALIGN: posiziona il Popup-Menu in modo tale che la Y che si andrà
ad indicare specificherà il limite inferiore del Popup-Menu;
TPM_TOPALIGN: posiziona il Popup-Menu in modo tale che la Y che si andrà
ad indicare specificherà il limite superiore del Popup-Menu;
TPM_VCENTERALIGN: posiziona il Popup-Menu in modo tale che la Y che si andrà
ad indicare specificherà la coordinata del centro verticale del Popup-Menu;
TPM_NONOTIFY: non manda un messaggio alla finestra alla quale il Popup-Menu è
legata per indicarle quale scelta è stata compiuta dall'utente;
TPM_LEFTBUTTON: permette all'utente di operare scelte sul Popup-Menu solo attraverso
il pulsante sinistro del mouse o la tastiera;
TPM_RIGHTBUTTON: permette all'utente di operare scelte sul Popup-Menu attraverso
entrambi i pulsanti del mouse e la tastiera;
TPM_HORIZONTAL: se il Popup-Menu non può essere mostrato interamente alle coordinate
prescelte, preserva le dimensioni in orizzontale adattando quelle verticali;
TPM_VERTICAL: se il Popup-Menu non può essere mostrato interamente alle coordinate
prescelte, preserva le dimensioni in verticale adattando quelle orizzontali;
|
x |
La coordinata X del Popup-Menu
|
y |
La coordinata Y del Popup-Menu
|
hWnd |
L'intero di riferimento
della finestra che ospita il Popup-Menu. Questa finestra riceverà il messaggio del tipo:
WM_COMMAND.
|
prcRect |
E'un parametro
del tutto ignorato dal sistema. Si consiglia pertanto di settarlo a 0.
|
Per concludere la trattazione, diamo un'occhiata alle costanti relative ai flags appena
visti:
Const TPM_CENTERALIGN = &H4
Const TPM_LEFTALIGN = &H0
Const TPM_RIGHTALIGN = &H8
Const TPM_BOTTOMALIGN = &H20
Const TPM_TOPALIGN = &H0
Const TPM_VCENTERALIGN = &H10
Const TPM_NONOTIFY = &H80
Const TPM_RETURNCMD = &H100
Const TPM_LEFTBUTTON = &H0
Const TPM_RIGHTBUTTON = &H2
Const TPM_HORIZONTAL = &H0
Const TPM_VERTICAL = &H40
|
A questo punto vediamo un esempio.
Sul piano abbiamo solo un semplice pulsante. Quando l'utente preme il pulsante, appare
un semplice popup-menu. Il menu ha solamente due voci, divise da un separatore che
come abbiamo già visto precedentemente è esso stesso un oggetto-menu.
La particolarità del codice è che il menu (e le sue voci al suo interno) non esiste al
momento dell'avvio del codice e può continuare a non esistere finchè l'utente non preme
il pulsante. In tal caso, nella posizione indicata dalla funzione GetCursorPosition,
un nuovo Popup-Menu verrà creato utilizzando la funzione
CreatePopupMenu, verrà riempito di voci attraverso la funzione InsertMenuItem,
e verrà visualizzato nel punto determinato con TrackPopupMenu. Al termine del suo utilizzo verrà
distrutto con DestroyMenu.
Dichiariamo tutte le funzioni, le strutture
e le relative costanti, comprese oltre a TrackPopupMenu anche quelle già
viste in lezioni precedenti. Tutto questo blocco di codice andrà naturalmente posizionato
nelle dichiarazioni generali del modulo:
'funzione TrackPopupMenuEx
Declare Function TrackPopupMenu Lib "user32.dll" (ByVal hMenu As Long, _
ByVal uFlags As Long, ByVal x As Long, ByVal y As Long, ByVal hWnd As _
Long, prcRect As TPMPARAMS) As Long
'funzione CreatePopupMenu
Public Declare Function CreatePopupMenu Lib "user32.dll" () As Long
'funzione DestroyMenu
Public Declare Function DestroyMenu Lib "user32.dll" (ByVal hMenu As Long) _
As Long
'funzione GetCursorPosition
Public Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINT_TYPE) As Long
'funzione InsertMenuItem
Public Declare Function InsertMenuItem Lib "user32.dll" Alias _ "InsertMenuItemA" (ByVal
hMenu As Long, ByVal uItem As Long, ByVal _
fByPosition As Long, lpmii As MENUITEMINFO) As Long
'struttura MENUITEMINFO
Public Type MENUITEMINFO
cbSize As Long
fMask As Long
fType As Long
fState As Long
wID As Long
hSubMenu As Long
hbmpChecked As Long
hbmpUnchecked As Long
dwItemData As Long
dwTypeData As String
cch As Long
End Type
'costanti dei flags di MENUITEMINFO
Public Const MIIM_STATE = &H1
Public Const MIIM_ID = &H2
Public Const MIIM_TYPE = &H10
Public Const MFT_SEPARATOR = &H800
Public Const MFT_STRING = &H0
Public Const MFS_DEFAULT = &H1000
Public Const MFS_ENABLED = &H0
Public Const TPM_LEFTALIGN = &H0
Public Const TPM_TOPALIGN = &H0
Public Const TPM_NONOTIFY = &H80 A
Public Const TPM_RETURNCMD = &H100
Public Const TPM_LEFTBUTTON = &H0
Public Type POINT_TYPE
x As Long
y As Long
End Type
|
Terminato il lavoro relativo al modulo, passiamo a Form1. Su di esso dovremo trascinare
un pulsante che chiameremo col suo nome di default: Command1.
E alla fine dichiariamo tre costanti che, notare bene, non fanno parte di nessun'API
ma definiscono gli oggetti-menu che si andranno ad inserire nel Popup-Menu. Tali oggetti saranno
saranno infatti la voce "Informazioni" (quindi una stringa di testo), un separatore di voci e la
voce "Esci":
Private Const ID_INFORMAZIONI = 101
Private Const ID_SEPARATOR = 102
Private Const ID_ESCI = 103
|
Adesso gestiamo l'evento Click di Command1:
Private Sub Command1_Click()
'si definisce il nome del nuovo popup-menu
Dim nuovoPopupMenu As Long
'si definiscono gli oggetti da inserire nel popup-menu
Dim mii As MENUITEMINFO
'si definiscono le coordinate
Dim CurPos As POINT_TYPE
'menusel è l'identificativo della voce selezionata
Dim MenuSel As Long
'generico valore di ritorno (Return Value)
Dim RetVal As Long
'il nuovo popup viene creato
nuovoPopupMenu = CreatePopupMenu()
'ora aggiungiamo la voce "Informazioni..."
With mii
'definiamo la lunghezza della struttura
.cbSize = Len(mii)
'indichiamo quali elementi la struttura deve usare
.fMask = MIIM_STATE Or MIIM_ID Or MIIM_TYPE
'definiamo il tipo di oggetto: una stringa di testo
.fType = MFT_STRING
'indichiamo che la voce "Informazioni..." è quella di default
.fState = MFS_ENABLED Or MFS_DEFAULT
'assegnamo a questa voce un identificatore
.wID = ID_INFORMAZIONI
'testo da visualizzare
.dwTypeData = "&Informazioni..."
.cch = Len(.dwTypeData)
End With
RetVal = InsertMenuItem(nuovoPopupMenu, 0, 1, mii)
'aggiungiamo il secondo elemento: la barra separatrice
With mii
.fType = MFT_SEPARATOR
.fState = MFS_ENABLED
.wID = ID_SEPARATOR
End With
RetVal = InsertMenuItem(nuovoPopupMenu, 1, 1, mii)
'aggiungiamo l'ultima voce: "Esci"
With mii
.fType = MFT_STRING
.wID = ID_ESCI
.dwTypeData = "E&sci"
.cch = Len(.dwTypeData)
End With
retval = InsertMenuItem(nuovoPopupMenu, 2, 1, mii)
'determiniamo la posizione del puntatore in modo che il popup
'appaia proprio in quella posizione
retval = GetCursorPos(CurPos)
'adesso mostriamo il popup nella posizione desiderata
MenuSel = TrackPopupMenu(nuovoPopupMenu, TPM_TOPALIGN Or TPM_LEFTALIGN Or _
TPM_NONOTIFY Or TPM_RETURNCMD Or TPM_LEFTBUTTON, curpos.x, curpos.y, 0, _ Form1.hWnd, 0)
'distruggiamo il Popup-Menu
RetVal = DestroyMenu(nuovoPopupMenu)
'varie opzioni di scelta dell'utente
Select Case MenuSel
'l'utente sceglie "Informazioni..."
Case ID_INFORMAZIONI
MsgBox "Esempio a cura di Visual Basic Italia ", vbOKOnly, "VBItalia"
'l'utente sceglie "Esci..."
Case ID_ESCI
Unload Form1
End Select
End Sub
|
|