Aus welchen Gründen auch immer, hat Microsoft im Visual Studio das Frame Control vergessen. Es gibt zwar das Panel und die GroupBox, doch durch die begrenzte Möglichkeit des BorderStyles kann kein, auch nicht nur annäherndes, Look & Feel eines Frames erzeugt werden. Was liegt also näher auf der Hand, als uns selber ein Frame Control zu bauen. Die nachfolgende Komponenten Klasse Frame wird dabei von einem ContainerControl geerbt, sodass sie die gleichen Eigenschaften wie ein Panel oder GroupBox aufweist. Zusätzlich erzeugen wir einen 3D BorderStyle und geben dem Frame noch eine Caption mit. Das Frame kann, getrennt für den Rahmen und der Caption, je 10 verschiedene BorderStyles verwenden, sodass wir wieder das "Look & Feel“ eines Frames erhalten. Nachfolgend die Klasse "Frame“: Imports System.ComponentModel Imports System.ComponentModel.Design ''' <summary> ''' Frame Container Control ''' </summary> ''' <remarks> ''' Frame Container Control - VB.Net 2005 Komponente. ''' ================================================= ''' Diese Komponenten Klasse stellt einen Steuerelenenten Container ''' im "Look and Feel" eines Frames zur Verfügung. Die Komponente ''' verfügt über je 10 BorderStyles für das Frame und die Caption. ''' ''' Oktober 2006 - VB-Power.net ''' http://www.vb-power.net ''' </remarks> Public Class Frame Inherits System.Windows.Forms.ContainerControl Private m_label As New CaptionLabel Private m_BorderStyle As Border3DStyle = Border3DStyle.Etched Private m_BorderStyleCaption As Border3DStyle = Border3DStyle.Adjust ''' <summary> ''' Interne Label Komponenten-Klasse mit 3D BorderStyle ''' </summary> Protected Class CaptionLabel Inherits System.Windows.Forms.Label Private m_CaptionStyle As Border3DStyle = Border3DStyle.Etched Public WriteOnly Property CaptionStyle() As Border3DStyle Set(ByVal value As Border3DStyle) m_CaptionStyle = value Me.Invalidate() End Set End Property Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs) MyBase.OnPaintBackground(pevent) ControlPaint.DrawBorder3D(pevent.Graphics, pevent.ClipRectangle, m_CaptionStyle) End Sub End Class ' Beginn der Hauptklasse ' ====================== Public Sub New() Me.Controls.Add(m_label) End Sub Protected Overrides Sub OnPaintBackground(ByVal pevent As PaintEventArgs) MyBase.OnPaintBackground(pevent) ' Abmaße bestimmen Dim g As Graphics = pevent.Graphics Dim r As Rectangle = pevent.ClipRectangle Dim h As Int16 = (g.MeasureString(Me.Text, Me.Font).Height / 2) + 1 Dim rect As Rectangle = New Rectangle(r.X, r.Y + h, r.Width, r.Height - h) ' 3D Rahmen Zeichnen ControlPaint.DrawBorder3D(g, rect, m_BorderStyle) ' CaptionLabel zeichnen With m_label .AutoSize = True .Text = Me.Text .Padding = New Padding(1, 2, 1, 2) .BackColor = Me.BackColor .Location = New Point(15, 0) .CaptionStyle = m_BorderStyleCaption .Visible = IIf(.Text <> "", True, False) End With End Sub Protected Overrides Sub OnScroll(ByVal se As System.Windows.Forms.ScrollEventArgs) MyBase.OnScroll(se) Me.Invalidate() End Sub <Category("Darstellung"), Description("Legt den BorderStyle fest, oder liest ihn aus.")> _ Public Property BorderStyle() As Border3DStyle Get Return m_BorderStyle End Get Set(ByVal value As Border3DStyle) m_BorderStyle = value Me.Invalidate() End Set End Property <Category("Darstellung"), _ Description("Legt den BorderStyle für die Beschriftung fest, oder liest ihn aus.")> _ Public Property BorderStyleCaption() As Border3DStyle Get Return m_BorderStyleCaption End Get Set(ByVal value As Border3DStyle) m_BorderStyleCaption = value Me.Invalidate() End Set End Property <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _ Public Overrides Property Text() As String Get Return MyBase.Text End Get Set(ByVal value As String) MyBase.Text = value Me.Invalidate() End Set End Property End Class Noch ein Tipp: Viel Spaß |