Hi [CrX].:HappyHero:.
Das Kontextmenü ist eine ContextMenu-Klasse diese ist ähnlich wie die MainMenu-Klasse und besitzt mehrere Einträge. Diese Einträge sind, wie sollte es auch anders sein, ebenfalls Klassen. Es sind MenuItem-Klassen. Dank der vollständigen OOP in .NET kannst du diese einfach vererben und eine eigenne Klasse erstellen. Diese kann dann auch, ohne das API-Funktionen benötigt werden, Bitmaps anzeigen.
Ich habe mir mal eine solche Klasse zusammengebastelt. Sie ist zwar nicht perfekt, aber ausreichend. Ich muss dazu sagen, dass die Prozeduren BMPMenu_DrawItem und BMPMenu_MeasureItem nicht von mir entwickelt wurden, sondern aus dem Buch Visual Basic .NET Kompendium stammen. Die Idee mit der Klasse ist aber von mir.
Lange Rede, kurzer Sinn. Hier ist der Code:Imports System
Imports System.Drawing
Imports System.Windows.Forms
Public Class BMPMenu
Inherits MenuItem
Protected frmParentForm As Form
Protected MaxMenuTextBreite As Short
Protected imgMenuImage As Image
Sub New(ByRef ParentForm As Form)
MyBase.New()
MyBase.OwnerDraw = True
frmParentForm = ParentForm
End Sub
Sub New(ByRef ParentForm As Form, ByVal Image As Image)
MyBase.New()
MyBase.OwnerDraw = True
imgMenuImage = Image
frmParentForm = ParentForm
End Sub
Public Shadows ReadOnly Property OwnerDraw() As Boolean
Get
Return True
End Get
End Property
Public ReadOnly Property ParentForm() As Form
Get
Return frmParentForm
End Get
End Property
Public Property Image() As Image
Get
Return imgMenuImage
End Get
Set(ByVal Value As Image)
imgMenuImage = Value
End Set
End Property
Private Sub BMPMenu_DrawItem(ByVal sender As Object, ByVal e As _
System.Windows.Forms.DrawItemEventArgs) Handles MyBase.DrawItem
'Rechteck für die Ausgabefläche definieren, das etwas kleiner ist als
'die Fläche des Menüs
Dim TextGrenzen As New RectangleF(e.Bounds.Left + 24, e.Bounds.Top + 2, _
e.Bounds.Right, e.Bounds.Bottom - 2)
Dim MenuTextFormat As New StringFormat()
Dim TextFarbe As Color = SystemColors.MenuText
'Erster Tabstop bereits beim 0.ten Zeichen
Dim TabStops() As Single = {0}
'Nr. des anzuzeigenden Bilds aus der Imagelist
Dim inBildNr As Integer
'Auszugebenden Text aufbereiten
With MenuTextFormat
.SetTabStops(MaxMenuTextBreite, TabStops)
.HotkeyPrefix = Drawing.Text.HotkeyPrefix.Show
End With
Dim MenuSelected As Boolean
'Feststellen, ob Eintrag selektiert ist
MenuSelected = (e.State And DrawItemState.Selected) = DrawItemState.Selected
'Wenn ja, dann anderen Hintergrund und Textfarbe anzeigen
If MenuSelected = True Then
e.DrawBackground()
TextFarbe = SystemColors.HighlightText
Else
e.Graphics.FillRectangle(SystemBrushes.Menu, e.Bounds)
End If
'Bitmap nur zeichnen, wenn Menüeintrag BildNr besitzt
If Not (imgMenuImage Is Nothing) Then
'Bitmap in ihrer ursprünglichen Größe anzeigen
e.Graphics.DrawImageUnscaled(imgMenuImage, _
e.Bounds.Left + 1, e.Bounds.Top + 1)
End If
'Zum Schlus auch den Text im Menü "zeichnen"
e.Graphics.DrawString(Me.Text, Me.frmParentForm.Font, _
New SolidBrush(TextFarbe), TextGrenzen, MenuTextFormat)
End Sub
Private Sub BMPMenu_MeasureItem(ByVal sender As Object, ByVal e As _
System.Windows.Forms.MeasureItemEventArgs) Handles MyBase.MeasureItem
'Größe des Menütextes
Dim TextGröße As Size
'StringFormat kümmert sich um die Formatierung auf "Grafikebene"
Dim TextFormat As New StringFormat()
'Menüshortcuts sollen angezeigt werden
TextFormat.HotkeyPrefix = Drawing.Text.HotkeyPrefix.Show
'Textgröße des Menütextes feststellen
TextGröße = e.Graphics.MeasureString(Me.Text, New Font("Microsoft Sans Serif", _
10)).ToSize
'Maximale Breite eines Menüeintrags feststellen
MaxMenuTextBreite = Math.Max(MaxMenuTextBreite, TextGröße.Width + 24)
'Maximale Höhe eines Menüeintrags festlegen
e.ItemHeight = Math.Max(TextGröße.Height + 2, _
SystemInformation.SmallIconSize.Height + 2)
'Breite festlegen
e.ItemWidth = MaxMenuTextBreite
End Sub
End Class demn?chst Online: SnofWare.de |