Guide e Tutorials:indexed
La funzione GetSystemMenu (Tutorial completo)
Come ormai sarà chiaro, tutte le lezioni sui menu sono strettamente concatenate. Se infatti si vuole fare anche una piccola modifica ad un menu tramite codice, bisogna applicare un elevato numero di funzioni. Questo non è certo da considerare un fatto negativo, in quanto più funzioni si hanno a disposizione, maggiori sono le possibilità di apportare modifiche. Questa volta vediamo una funzione un po' particolare: GetSystemMenu. Tale funzione ritorna il valore che identifica il menu della finestra (della form). Bisogna però fare molta attenzione a non confondere GetSystemMenu con GetMenu. Quest'ultima funzione infatti ritornava il numero identificatore della barra menu presente in un determinato form (se era prevista). GetSystemMenu invece mostra il numero identificatore del menu della finestra, dove per "menu della finestra" si intende il menu che compare cliccando sull'icona della finestra. Provate infatti a cliccare sull'estrema destra in alto sull'icona del documento Html. A tutti sarà capitato almeno una volta di andarci a finire sopra, in un tentativo maldestro di aprire invece il menu File che gli sta sotto. Ecco: appena premuta l'icona scenderà un menu in piena regola, formato dagli elementi:
ripristina
sposta
ridimensiona
riduci a icona
ingrandisci

---- (ossia l'elemento separatore che è considerato comunque una voce)
chiudi.
Le funzioni sono quelle necessarie a gestire la finestra e quindi sono totalmente estranee allo scopo dell'applicazione che la finestra contiene. Come fare a modificare queste voci? Con le stesse funzioni che abbiamo applicato alle barre menu. Per potersi riferire però a questi particolari menu, come già visto, non possiamo usare GetMenu ma GetSystemMenu di cui presentiamo qui sotto la dichiarazione:

Declare Function GetSystemMenu Lib "user32.dll" (ByVal hWnd As Long, _
ByVal bRevert As Long) As Long

Siccome siamo tutti degli esperti, possiamo affermare che la funzione GetSystemMenu richiede che le siano passati due parametri (hWnd e bRevert) con formato di numero intero a 32 bit (As Long nella parentesi). Tali parametri devono essere passati alla funzione tramite il metodo ByValue (ByVal). La funzione a sua volta ritornerà un terzo intero a 32 bit (As Long dopo la parentesi), ossia l'identificatore del menu della finestra.

A questo punto facciamo un esempietto semplice: vogliamo sapere (cosa pressochè inutile, in realtà) qual'è il numero che identifica la finestra Form1. Apriamo il classico nuovo progetto completo di modulo .bas. Nelle dichiarazioni generali del modulo (in alto, ancora prima di qualsiasi funzione), dichiariamo la funzione GetSystemMenu nel modo che abbiamo visto precedentemente ed inseriamo un bello quanto inutile (in questo progetto) Option Explicit:

Declare Function GetSystemMenu Lib "user32.dll" (ByVal hWnd As Long, _
ByVal bRevert As Long) As Long
Option Explicit


Adesso la nostra funzioncina è pronta per l'uso. Ritorniamo a Form1 e richiamiamo la funzione, assegnando alla variabile Dimmi_L_Identificatore_Del_Menu il valore numerico che ritorna la funzione, che poi rappresenta l'identificatore della menu principale della finestra Form1:

Option Explicit

Private Sub Form_Load()
Dim Dimmi_L_Identificatore_Del_Menu As Long
Dimmi_L_Identificatore_Del_Menu = GetSystemMenu(Form1.hWnd, 0)
MsgBox Dimmi_L_Identificatore_Del_Menu
End Sub

Il valore visualizzato nella finestra di messaggio rappresenta il numero che serve al sistema per identificare quella determinata finestra.
Se adesso si volessero contare quanti elementi ha il menu, bisognerà fare riferimento alla funzione GetMenuItemCount ampiamente discussa in precedenza. Innanzitutto dichiariamo nel modulo accanto alla dichiarazione di GetSystemMenu la funzione appena richiamata:

Declare Function GetMenuItemCount Lib "user32.dll" (ByVal hMenu As Long) As Long

Ecco dunque come apparirà Module1.bas alla fine del lavoro:

Declare Function GetSystemMenu Lib "user32.dll" (ByVal hWnd As Long, _
ByVal bRevert As Long) As Long
Declare Function GetMenuItemCount Lib "user32.dll" (ByVal hMenu As Long) As Long

Ritorniamo quindi per l'ultimissima volta a Form1 e assegnamo a hMenu che è il parametro necessario alla funzione GetMenuItemCount per capire di quale menu deve contare gli oggetti-menu (le voci) un determinato valore. Questo valore sarà proprio l'identificativo del menu della finestra Form1 che era stato visualizzato nella MessageBox. Questo dice in poche parole al programma che deve contare con GetMenuItemCount le voci del menu identificato dalla funzione GetSystemMenu:

Option Explicit

Private Sub Form_Load()
Dim hMenu As Long
hMenu = GetSystemMenu(Form1.hWnd, 0)
MsgBox hWnd
End Sub

Perchè hMenu ha un valore numerico? Prima di tutto perchè dichiarando la funzione GetMenuItemCount abbiamo posto hMenu come numerico e poi perchè è tale anche il valore che identifica la finestra. All'esecuzione del programma verrà visualizzata una finestrella di messaggio che molto probabilmente mostrerà il valore "7", che rappresenta il numero di voci che generalmente compongono un menu di questo tipo.
Le operazioni che possono essere compiute su questo menu sono svariate, nel corso delle prossime lezioni vedremo come integrare le nuove funzioni a questi particolari menu.

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