Connessione al database con Visual Basic NET? Lo trovi su Opentraining.it Visual Basic Italia
Guide e Tutorials:indexed
La funzione SetMenuItemBitmaps (Tutorial completo)

Avendo già una buona conoscenza delle funzioni necessarie a manipolare un menu, possiamo agevolmente affrontare il problema dell'inserimento di una bitmap all'interno di un menu.
Problema risolto da Microsoft che ha dato vita alla SetMenuItemBitmaps, funzione che associa ad una voce di un menu, una bitmap, ossia un'immagine ad alta definizione.
La dichiarazione dell'API è piuttosto semplice e la funzione non è particolarmente ostica nel suo complesso:

Declare Function SetMenuItemBitmaps Lib "user32" (ByVal hMenu As Long, _
ByVal uPosition As Long, ByVal uFlags As Long, ByVal hBitmapUnchecked _
As Long, ByVal hBitmapChecked As Long) As Long

Si tratta di un'API contenuta in user32.dll, dunque. In aggiunta possiamo dire che necessita di cinque parametri in forma numerica ed in particolare cinque interi a 32 bit. Il valore di ritorno è allo stesso modo un Long diverso da zero se la funzione ha successo. In caso di fallimento il valore restituito dalla SetMenuItemBitmaps sarà proprio lo zero.
Questi sono i parametri di cui si "nutre" la funzione:

hMenu E' l'indicatore del menu nel quale inserire la bitmap.
uPosition Specifica la voce del menu nella quale inserire la bitmap. L'individuazione di una voce del menu dipende da quanto impostato nel parametro uFlags
uFlags Specifica come interpretare la posizione della voce del menu come indicato da uPosition: il parametro uFlags può contenere uno dei seguenti Flags:
MF_BYCOMMAND in questo caso uPosition dà il numero identificatore dalla voce del menu specificato;
MF_BYPOSITION in questo caso uPosition dà invece la posizione della voce in una numerazione che parte da 0: la prima voce del menu ha quindi indice 0, la seconda 1 e così via fino ad n voci.
hBitmapUnchecked Specifica il riferimento o handle dell'immagine da inserire quando la voce corrispondente non è selezionata (quando cioè non è previsto il segno "v" di spunta)
hBitmapChecked Specifica il riferimento o handle dell'immagine da inserire quando la voce corrispondente è selezionata (al posto del segno "v" di spunta)

Da ciò si ricava che non solo è possibile inserire una bitmap a piacere in un menu, ma anche che al passaggio del mouse sulle varie voci le immagini possono cambiare.
Facciamo dunque un esempio per avere una maggiore confidenza con la SetMenuItemBitmaps.

Tutte le funzioni dell'esempio, tranne naturalmente la SetMenuItemBitmaps, sono già stati ampiamente trattate singolarmente in precedenza. In caso di dubbi basterà andare recuperare l'articolo corrispondente dall'indice analitico di Guide e Tutorials.
Iniziamo aprendo un progetto EXE Standard. Verrà creata per default una form denominata Form1.
Creiamo un menu con l'editor di menu. Tale menu deve avere una struttura di questo tipo:
&Menu1
...&Voce1
...&Voce2
&Menu2
...&Voce1
...&Voce2
ossia ogni menu deve contenere due voci.
E siccome abbiamo già introdotto il tipo di immagine da usare, diciamo subito che la funzione SetMenuItemBitmaps non supporta le immagini con estensione .ico ma solo le bitmap pure, come si è visto anche relativamente alla struttura MENUITEMINFO. Una cosa che la SetMenuItemBitmpas non ci dice è che per poter utilizzare una bitmap nel menu, tale immagine deve avere una dimensione massima di 13x13 pixels. In caso contrario la funzione ritornerà un valore pari a 0 e il menu rimarrà tale e quale.
Ritornando in fase di progettazione bisognerà trascinare sul piano tre controlli PictureBox nei quali inserire in ciascuno la bitmap che si preferisce.
Troverete le bitmap adatte nella cartella di Microsoft Visual Studio contenente tutte le immagini a disposizione.
Sarà anche necessario impostare la proprietà AutoRedraw della PictureBox su True.
Ed eccoci finalmente al codice. Le dichiarazioni, le strutture e le costanti, già tutte analizzate singolarmente, non verranno ulteriormente trattate. Basti ricordare che siccome operiamo con una sola form, non sarà affatto necessario inserire le dichiarazioni delle funzioni nel modulo.

Private Declare Function SetMenuItemBitmaps Lib "user32" (ByVal hMenu As Long, _
ByVal uPosition As Long, ByVal uFlags As Long, ByVal hBitmapUnchecked _
As Long, ByVal hBitmapChecked As Long) As Long
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, _
ByVal nPos As Long) As Long
Private Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, _ ByVal nPos As Long) As Long
Private Const MF_BITMAP As Long = &H1

Notare che anche le costanti dei membri della struttura MENUITEMINFO sono già stati ampiamente trattati.
Adesso vediamo il codice per l'evento Load di Form1. Bisognerà innanzitutto dire all'applicazione su quale menu principale lavorare. Il menu che a noi interessa è la classica barra posta in testa alla form:

Private Sub Form_Load()
Menu = GetMenu(Form1.hwnd)

dopodichè bisognerà indicare su quale sottomenu lavorare: Menu1 o Menu2:

sMenu = GetSubMenu(Menu&, 0)

dove la linea precedente utilizza la GetSubMenu per recuperare l'intero di riferimento che indica il sottomenu facente parte del menu che abbiamo denominato in precedenza "Menu" (la barra menu principale). Di Menu abbiamo scelto il primo sottomenu, in posizione 0, corrispondente nella fattispecie a "Menu1".
Compiamo adesso un'operazione analoga per definire l'identificativo del sottomenu:

ID = GetMenuItemID(sMenu, 0)

e per finire aggiungiamo la bitmap e chiudiamo il tutto con un End Sub:

SetMenuItemBitmaps Menu, ID, MF_BITMAP, Picture1.Picture, Picture1.Picture End Sub

indicando che vogliamo mantenere la stessa bitmap in ogni caso.
Questo è dunque il codice completo, escluse le dichiarazioni che abbiamo visto all'inizio dell'esempio:

Private Sub Form_Load()
Menu = GetMenu(Form1.hwnd)
sMenu = GetSubMenu(Menu, 0)
ID = GetMenuItemID(sMenu, 0)
SetMenuItemBitmaps Menu, ID, MF_BITMAP, Picture1.Picture, Picture1.Picture End Sub

Se a questo punto volessimo inserire la seconda bitmap nella seconda voce del primo sottomenu, il codice appena visto si trasformerebbe in questo blocco:

Private Sub Form_Load()
Menu = GetMenu(Form1.hwnd)
sMenu = GetSubMenu(Menu, 0)
ID = GetMenuItemID(sMenu, 0)
SetMenuItemBitmaps Menu, ID, MF_BITMAP, Picture1.Picture, Picture1.Picture
sMenu = GetSubMenu(Menu, 0)
ID = GetMenuItemID(sMenu, 1)
SetMenuItemBitmaps Menu, ID, MF_BITMAP, Picture2.Picture, Picture2.Picture
End Sub

dove nella funzione GetMenuItemID abbiamo sostituito 1 a 0 volendo indicare di considerare la seconda voce invece della prima ed abbiamo indicato l'immagine contenuta nella seconda PictureBox.
Se a questo punto volessimo anche inserire la terza bitmap nella prima voce del secondo sottomenu:

Private Sub Form_Load()
Menu = GetMenu(Form1.hwnd)
sMenu = GetSubMenu(Menu, 0)
ID = GetMenuItemID(sMenu, 0)
SetMenuItemBitmaps Menu, ID, MF_BITMAP, Picture1.Picture, Picture1.Picture
sMenu = GetSubMenu(Menu, 0)
ID = GetMenuItemID(sMenu, 1)
SetMenuItemBitmaps Menu, ID, MF_BITMAP, Picture2.Picture, Picture2.Picture
sMenu = GetSubMenu(Menu, 1)
ID = GetMenuItemID(sMenu, 0)
SetMenuItemBitmaps Menu, ID, MF_BITMAP, Picture3.Picture, Picture3.Picture
End Sub

dove questa volta abbiamo modificato il parametro della funzione GetSubMenu facendolo diventare 1 ed abbiamo indicato la terza immagine.


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