vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
ARRR... Was vergessen 
Autor: Snof
Datum: 22.12.03 00:32

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
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
kontextmenü1.096[CrX].:HappyHer...21.12.03 21:30
Re: kontextmenü821WaldiMaywood22.12.03 00:25
Re: kontextmenü806Snof22.12.03 00:29
ARRR... Was vergessen786Snof22.12.03 00:32
Re: Kontextmenü640[CrX].:HappyHer...22.12.03 01:13
Re: Kontextmenü675WaldiMaywood22.12.03 01:22
Re: Kontextmenü648[CrX].:HappyHer...23.12.03 17:58
Re: Kontextmenü678Snof24.12.03 02:11

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 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