Connessione al database con Visual Basic NET? Lo trovi su Opentraining.it Visual Basic Italia
Guide e Tutorials:indexed
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


Archivio:ndexed
Lezioni Commenta questa lezione Invia la tua guida Avviso per le nuove lezioni
Proponi un argomento

Visual Basic Italia© copyright 2000 - tutti i diritti riservati
E-mail:
vbitalia@libero.it