vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 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
GetMenuItemInfo-Funktion

Diese Funktion ermittelt Informationen über einen Menüeintrag eines Menüs.

Betriebssystem:  Win95, Win98, WinNT 4.0, Win2000, WinMEViews:  10.969 

Deklaration:

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


Beschreibung:

Diese Funktion ermittelt Informationen über einen Menüeintrag eines Menüs.


Parameter:

hMenuErwartet das Handle einesexistierenden Menüs.
uItemErwartet einen ID, der den Menüeintragidentifiziert. Dies kann ein Positions-ID oder ein Menü-ID sein, je nach dem was in "fByPosition" angegeben wird.
fByPositionWird hier ein Wert "ungleich 0" angegeben, so erwartet die Funktion bei "uItem" den Positions-ID des Menüeintrages, andernfalls muss bei "uItem" der Menü-ID angegeben werden.
lpmiiErwartet eine MENUITEMINFO-Struktur die voreingestellt ist, um die Informationen zuempfangen. Zu diesem Zweck müssen die "cbSize, fMask, dwTypeData und cch" Optionen der Struktur gesetzt sein um erfolgreich die Informationen zu ermitteln.


Rückgabewert:

Ist die Funktion erfolgreich so ist ein Wert "ungleich 0" die Rückgabe, andernfalls wird "0" zurückgegeben. Erweiterte Fehlerinformationen können mit der GetLastError-Funktion ermittelt werden.

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 werdem
 
' 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 Fensters 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üs des Fensters", "Menüs des Fensters") 
  RootNode.Expanded = True
 
  ' Systemmenüeintrag im Treeview erstellen
  Set RelNode = TreeView1.Nodes.Add(RootNode, tvwChild, "Systemmenue", "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üleisten-Einträ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 10.969 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