vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2019
 
zurück
Rubrik: Oberfläche · Menüs   |   VB-Versionen: VB4, VB5, VB616.05.01
Bitmaps im Menü

Mit Hilfe der Windows-API können auch Sie Icons in Ihrer Menüleiste anzeigen.

Autor:   LonelySuicide666Bewertung:     [ Jetzt bewerten ]Views:  23.288 
www.vbapihelpline.deSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

Mit Hilfe der Windows-API können auch Sie Icons in den Menüleisten Ihrer Anwendung anzeigen lassen. Ein kleines Manko ist jedoch, daß die Bildsymbole nicht in der Größe 16x16 dargestellt, sondern im etwas eigenartigen Format 13x13. Somit werden die kleinen "Standard-Icons" sowohl in der Breite als auch in der Höhe gestaucht, was mit unter nicht mehr so schön aussieht.

' Alle benötigten API-Deklarationen
Public Declare Function LoadImage Lib "user32" _
  Alias "LoadImageA" ( _
  ByVal hInst As Long, _
  ByVal lpsz As String, _
  ByVal un1 As Long, _
  ByVal n1 As Long, _
  ByVal n2 As Long, _
  ByVal un2 As Long) As Long
 
Public Declare Function GetMenu Lib "user32" ( _
  ByVal hwnd As Long) As Long
 
Public Declare Function GetSubMenu Lib "user32" ( _
  ByVal hMenu As Long, _
  ByVal nPos As Long) As Long
 
Public Declare Function GetMenuItemID Lib "user32" ( _
  ByVal hMenu As Long, _
  ByVal nPos As Long) As Long
 
Public Declare Function SetMenuItemBitmaps Lib "user32" ( _
  ByVal hMenu As Long, _
  ByVal nPosition As Long, _
  ByVal wFlags As Long, _
  ByVal hBitmapUnchecked As Long, _
  ByVal hBitmapChecked As Long) As Long
 
Public Declare Function GetSystemMenu Lib "user32" ( _
  ByVal hwnd As Long, _
  ByVal bRevert As Long) As Long
 
Public Declare Function DeleteObject Lib "gdi32.dll" ( _
  ByVal hObject As Long) As Long
 
Public Const MF_BYPOSITION = &H400
Public Const MF_BITMAP = &H4&
Public Const LR_LOADFROMFILE = &H10
Public Const IMAGE_BITMAP = 0

Die einzelnen Bildsymbole werden zunächst mittels der LoadImage-Funktion aus den entsprechenden Dateien in verschiedene Variablen-Arrays gespeichert.

Option Explicit
' Bitmap-Handles der Bildsymbole "im Speicher halten"
Dim imgHandle() As Long
 
Private Sub Form_Load()
  Dim imgCount As Long
 
  ' Insgesamt 3 verwendete Bildsymbole (0-2)
  imgCount = 2
  ReDim imgHandle(imgCount)
 
  ' Bildsymbole laden
  imgHandle(0) = LoadImage(App.hInstance, _
    App.Path & "\Open.bmp", IMAGE_BITMAP, 16, 16, _
    LR_LOADFROMFILE)
 
  imgHandle(1) = LoadImage(App.hInstance, _
    App.Path & "\Save.bmp", IMAGE_BITMAP, 16, 16, _
    LR_LOADFROMFILE)
 
  imgHandle(2) = LoadImage(App.hInstance, _
    App.Path & "\Close.bmp", IMAGE_BITMAP, 16, 16, _
    LR_LOADFROMFILE)
 
  ...

Um die geladenen Symbole nun den einzelnen Menüeinträgen zuzuordnen, bedient man sich der API-Funktion SetMenuItemBitmaps. Die Funktion erwartet als ersten Parameter die ID des Menüs der Menüleiste. Die einzelnen Menüs von links nach rechts durchlaufend numeriert, wobei das erste Menü die ID 0 hat. Als zweiten Parameter muss man die Position des Menüeintrags innerhalb des Menüs angeben. Auch hier beginnt die Zählung wieder bei 0. Für den dritten Parameter geben Sie MF_BITMAP an. Der vierte Parameter ist dann das Handle des Bitmaps. Als letzten Parameter geben Sie 0& an.

  ...
  Dim MenuBar As Long
  Dim Menu As Long
  Dim SubMenu As Long
 
  ' Handle der Menüleiste
  MenuBar = GetMenu(Me.hwnd)
 
  ' Handle des ersten Menüs (von links): ID 0
  Menu = GetSubMenu(MenuBar, 0)
 
  ' Handle des ersten Eintrags im ersten Menü
  SubMenu = GetSubMenu(Menu, 0)
  SetMenuItemBitmaps Menu, SubMenu, MF_BITMAP, _
    imgHandle(0), 0&
 
  ' Handle des zweiten Eintrags im ersten Menü
  SubMenu = GetSubMenu(Menu, 1)
  SetMenuItemBitmaps Menu, SubMenu, MF_BITMAP, _
    imgHandle(1), 0&
 
  ' Handle des dritten Eintrags im ersten Menü
  SubMenu = GetSubMenu(Menu, 2)
  SetMenuItemBitmaps Menu, SubMenu, MF_BITMAP, _
    imgHandle(2), 0&
End Sub

Das war es schon. Zu beachten ist noch, daß Sie die Resourcen beim Beenden (Entladen) der Form wieder freigegeben. Dies erfolgt am besten im Form_Unload-Ereignis.

Private Sub Form_Unload()
  ' Bitmap-Resourcen wieder freigeben
  Dim i As Integer
 
  For i = 0 To Ubound(imgHandle)
    DeleteObject imgHandle(i)
  Next i
End Sub

Dieser Tipp wurde bereits 23.288 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2019 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel