vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Menüs15.03.02
DrawMenuBar-Funktion

Diese Funktion zeichnet die Menüleiste eines Fensters neu

Betriebssystem:  Win95, Win98, WinNT 3.1, Win2000, WinMEViews:  9.689 

Deklaration:

Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long

Beschreibung:

Diese Funktion zeichnet die Menüleiste eines Fensters neu um eventuelle, durch Änderungen hervorgerufene, Grafikfehler zu beseitigen.

Parameter:

hWnd: erwartet das Fensterhandle des Fensters dessen Menüleiste neu gezeichnet werden soll.


Rückgabewert:

Ist die Funktion erfolgreich so ist die Rückgabe "ungleich 0", andernfalls ist die Rückgabe "0".

Beispiel:

Private Declare Function GetMenu Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32.dll" (ByVal hMenu As Long) As Long 
Private Declare Function GetMenuItemInfo Lib "user32.dll" _
  Alias "GetMenuItemInfoA"  ( _
  ByVal hMenu As Long, _
  ByVal uItem As Long, _
  ByVal fByPosition As Long, _
  lpmii As MENUITEMINFO) As Long
Private Declare Function GetSystemMenu Lib "user32.dll" ( _
  ByVal hwnd As Long, _
  ByVal bRevert As Long) As Long
Private Declare Function SetMenuItemInfo Lib "user32.dll" _
  Alias "SetMenuItemInfoA"  ( _
  ByVal hMenu As Long, _
  ByVal uItem As Long, _
  ByVal fByPosition As Long, _
  lpmii As MENUITEMINFO) As Long
Private Declare Function RemoveMenu Lib "user32.dll" ( _
  ByVal hMenu As Long, _
  ByVal uPosition As Long, _
  ByVal uFlags As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
 
Private 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
 
' Einige der MENUITEMINFO fMask-Konstanten
Private Const MIIM_SUBMENU = &H4     ' die hSubMenü Option soll gefüllt/behandelt werden
Private Const MIIM_TYPE = &H10       ' die fType Option soll gefüllt/behandelt werden
 
' Einige der MENUITEMINFO fType-Konstanten
Private Const MFT_BITMAP = &H4       ' der Menüeintrag ist ein Bitmapmenü
Private Const MFT_SEPARATOR = &H800  ' der Menüeintrag ist ein Separator
Private Const MFT_STRING = &H0       ' der Menüeintrag ist ein String
 
' Einige der RemoveMenu uPosition-Konstanten
Private Const MF_BYCOMMAND = &H0 ' der Wert stellt die Menü-ID dar
Private Const MF_BYPOSITION = &H400 ' der Wert stellt die nullbasierte relative 
' Position des Menüelements dar
 
Private SelectedHwnd As Long
' Starten des Ermittelns der Menüs unserer Form
Private Sub Form_Load()
   SelectedHwnd = Me.hwnd
   SetTreeview SelectedHwnd
   MsgBox "Starten Sie mit der rechten Maustaste das Editieren der Menüeinträge."  _
      & vbCrLf & "Bitte geben Sie nur den Text und evtl. ein &-Zeichen des neuen  _
      Menüs ein.", vbInformation, "Bitte beachten"
End Sub
' Treeview der aktuellen Fenstergröße anpassen
Private Sub Form_Resize()
   On Error Resume Next
   TreeView1.Width = Me.ScaleWidth - (2 * TreeView1.Left)
   TreeView1.Height = Me.ScaleHeight - (2 * TreeView1.Top)
End Sub
' Treeview mit den Menüs des angegebenen Fenster füllen
Private Function SetTreeview(ByVal hwnd As Long)
   Dim Retval As Long, hSysMenu As Long, hMenuBar As Long
   Dim RootNode As Node, RelNode As Node
 
   ' Treeview leeren
   TreeView1.Nodes.Clear
 
   ' Root im Treeview erstellen
   Set RootNode = TreeView1.Nodes.Add(, , "Menü des Fensters", "Menü des Fensters") 
   RootNode.Expanded = True
 
   ' Systemmenüeintrag im Treeview erstellen
   Set RelNode = TreeView1.Nodes.Add(RootNode, tvwChild, "Systemmenü", "Systemmenü") 
   RelNode.Expanded = True
 
   '  Systemmenüeinträge ermitteln und ins Treeview übertragen
   hSysMenu = GetSystemMenu(hwnd, False)
   If hSysMenu << 0 Then
      GetMenuItems hSysMenu, RelNode
   End If
 
   ' Menüleisten-Menüeintrag im Treeview erstellen
   Set RelNode = TreeView1.Nodes.Add(RootNode, tvwChild, "Menüleiste", "Menüleiste") 
   RelNode.Expanded = True
 
   ' Menüleisteneinträge ermitteln und ins Treeview übertragen
   hMenuBar = GetMenu(hwnd)
   If hMenuBar << 0 Then
      GetMenuItems hMenuBar, RelNode
   End If
End Function
' Alle Untermenüs ermitteln
Private Function GetMenuItems(ByVal hMenuStart As Long, ByRef RootNode As Node)
   Dim MenuItemCount As Long, TmpMenuInfo As MENUITEMINFO
   Dim RelNode As Node
 
   ' Anzahl Einträge ermitteln
   MenuItemCount = GetMenuItemCount(hMenuStart)
 
   '  Einträge ermitteln und hinzufügen, falls vorhanden
   If MenuItemCount < 0 Then
 
      For i = 0 To MenuItemCount - 1
 
        ' Informationen des Eintrags ermitteln
        With TmpMenuInfo
           .cbSize = Len(TmpMenuInfo)
           .fMask = MIIM_SUBMENU Or MIIM_TYPE
           .cch = 256
           .dwTypeData = Space(.cch)
        End With
        Retval = GetMenuItemInfo(hMenuStart, i, True, TmpMenuInfo)
 
        ' Besonderheiten auswerten, bis zum VBNullChar abschneiden und  
        ' "VBTabs" ersetzen
        If CBool(TmpMenuInfo.fType And MFT_BITMAP) = True Then
           TmpMenuInfo.dwTypeData = "Bitmap"
        ElseIf CBool(TmpMenuInfo.fType And MFT_SEPARATOR) = True Then
           TmpMenuInfo.dwTypeData = "Trennlinie"
        Else
           TmpMenuInfo.dwTypeData = Left$(TmpMenuInfo.dwTypeData, TmpMenuInfo.cch) 
           TmpMenuInfo.dwTypeData = Replace(TmpMenuInfo.dwTypeData, vbTab, Space(5)) 
        End If
 
       ' Eintrag ins Treeview übertagen
       Set RelNode = TreeView1.Nodes.Add(RootNode, tvwChild, "(" & CStr(i)  _
          & ") -  " & TmpMenuInfo.dwTypeData, CStr(i) & " - " & TmpMenuInfo.dwTypeData) 
       RelNode.Tag = hMenuStart
       RelNode.Expanded = True
 
       ' Falls Submenüs gefunden auch diese ermitteln
       If TmpMenuInfo.hSubMenu << 0 Then
          Call GetMenuItems(TmpMenuInfo.hSubMenu, RelNode)
       End If
     Next i
   End If
End Function
' Ändern eines Eintrags im Treeview in dem Menü vollziehen
Private Sub TreeView1_AfterLabelEdit(Cancel As Integer, NewString As String)
   Dim Retval As Long, OldValue As Node, MsgRet As Long, TmpMenuInfo As MENUITEMINFO 
 
   ' Aktuell ausgewählten Treeview-Eintrag bestimmen
   Set OldValue = TreeView1.Nodes(TreeView1.SelectedItem.Index)
 
   ' Prüfen ob der alte Eintrag vom Typ String ist oder ein nicht änderbarer  
   ' Eintrag markiert wurde, andernfalls die Funktion abbrechen
   If OldValue.Text = "Bitmap" Or OldValue.Text = "Trennlinie" Or OldValue.Text =  _
      "Systemmenü" Or OldValue.Text = "Menüleiste" Or OldValue.Text = "Menüs des  _
      Fensters" Then
          MsgBox "Dieser Menüeintrag kann nicht geändert werden"
          Cancel = True
      Exit Sub
  End If
 
  ' Eintrag löschen?
  If NewString = "" Then
     MsgRet = MsgBox("Sie sind im Begriff den Menüeintrag zu entfernen, wollen  _
     sie fortfahren?", vbQuestion + vbYesNo, "Achtung !!")
     If MsgRet = vbYes Then
        ' Menüeintrag entfernen
        RemoveMenu OldValue.Tag, CLng(Left$(OldValue.Text, InStr(1,  _
           OldValue.Text, " - ") - 1)), MF_BYPOSITION
        '  Treeview- Eintrag entfernen
        TreeView1.Nodes.Remove OldValue.Index
        Cancel = True
        Exit Sub
     Else
        Cancel = True
        Exit Sub
     End If
 
   ' Eintrag umbenennen?
   Else
      MsgRet = MsgBox("Sie sind im Begriff den Menüeintrag umzubenennen, wollen  _
         sie fortfahren?", vbQuestion + vbYesNo, "Achtung !!")
      If MsgRet = vbYes Then
      ' Menüeintrag umbenennen
 
      ' Erst einmal die Originaldaten ermitteln
      With TmpMenuInfo
         .cbSize = Len(TmpMenuInfo)
         .fMask = MIIM_SUBMENU Or MIIM_TYPE Or MIIM_TYPE
         .cch = 256
         .dwTypeData = Space(.cch)
      End With
      Retval = GetMenuItemInfo(OldValue.Tag, CLng(Left$(OldValue.Text,  _
         InStr(1, OldValue.Text, " - ") - 1)), True, TmpMenuInfo)
 
      ' dann Caption Text ändern und dem Menüeintrag diese Änderung zuweisen
      TmpMenuInfo.dwTypeData = NewString
      TmpMenuInfo.cch = Len(NewString)
      Retval = SetMenuItemInfo(OldValue.Tag, CLng(Left$(OldValue.Text,  _
         InStr(1, OldValue.Text, " - ") - 1)), 1, TmpMenuInfo)
      If Retval = 0 Then
         MsgBox "Der Menüeintrag konnte nicht geändert werden"
        Cancel = True
        Exit Sub
      End If
      NewString = CLng(Left$(OldValue.Text, InStr(1, OldValue.Text, " - ")  _
         - 1)) & " - " & NewString
 
      ' Sorgt dafür, dass keine Grafikfehler auftreten, wenn in der Menüleiste 
      ' ein Eintrag länger wird
       DrawMenuBar SelectedHwnd
    Else
       Cancel = True
       Exit Sub
    End If
  End If
End Sub
Private Sub TreeView1_MouseUp(Button As Integer, Shift As Integer, x As Single, y  _
   As Single)
   If Button = vbRightButton Then
      TreeView1.StartLabelEdit
  End If
End Sub

Diese Seite wurde bereits 9.689 mal aufgerufen.

nach obenzurück
 
   

Druckansicht Druckansicht Copyright ©2000-2024 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