Originariamente inviata da
Kahm
salve a tutti
vorrei evidenziare l'etichetta di una tab control di rosso
ovviamente non cambiando il font, ma da drawstring!
utilizzando il seguente codice:
codice:
'variabili
Dim rect As New System.Drawing.Rectangle
Dim RedPen As New Pen(Color.Red, 3)
Dim graphics As System.Drawing.Graphics
rect = TABControl1.Bounds
graphics.DrawRectangle(RedPen, rect)
Dim ScreenLocation As Point
Dim p As Point = New Point(rect.X, rect.Y)
If Not parent Is Nothing Then
ScreenLocation = parent.PointToScreen(p)
il problema è che mi disegna una rettangolo rosso: TUTTO OK
ma su tutta l'area della tab control
mentre io voglio solo sulla linguetta in alto
cosa sbaglio?
in tutte le proprietà della tab control non c'è qualcosa che ti gestisce la linguetta
Ciao,
in quel codice direi che sbagli le dimensioni del rettangolo....
Le dimensioni della "label" si ottengono dal parametro di tipo DrawItemEventArgs che viene passato al metodo (o funzione in vb) OnDrawItem del TabControl, ti basta fare un override di quest'ultimo e non dovresti più avere problemi. Non dimenticare di impostare DrawMode del TabControl a TabDrawMode.OwnerDrawFixed
codice:
Public Class MyTabControl
Inherits TabControl
Public Sub New()
Me.DrawMode = TabDrawMode.OwnerDrawFixed
End Sub
Protected Overrides Sub OnDrawItem(e As DrawItemEventArgs)
Dim coloreTesto As Brush = New System.Drawing.SolidBrush(e.ForeColor)
If e.State = DrawItemState.Selected Then
coloreTesto = ColoreTestoSelezionato
e.Graphics.FillRectangle(ColoreSfondoSelezionato, e.Bounds)
Else
e.DrawBackground()
End If
e.Graphics.DrawString(Me.TabPages(e.Index).Text, Font, coloreTesto, Me.GetTabRect(e.Index), New StringFormat(Me.AllineamentoScritta))
MyBase.OnDrawItem(e)
End Sub
Private m_coloreTestoSelezionato As Brush = New SolidBrush(Color.WhiteSmoke)
Public Property ColoreTestoSelezionato() As Brush
Get
Return Me.m_coloreTestoSelezionato
End Get
Set(value As Brush)
Me.m_coloreTestoSelezionato = value
End Set
End Property
Private m_coloreSfondoSelezionato As Brush = New SolidBrush(Color.Red)
Public Property ColoreSfondoSelezionato() As Brush
Get
Return Me.m_coloreSfondoSelezionato
End Get
Set(value As Brush)
Me.m_coloreSfondoSelezionato = value
End Set
End Property
Private m_allineamentoScritta As New StringFormat() With { _
.Alignment = StringAlignment.Center, _
.LineAlignment = StringAlignment.Center _
}
Public Property AllineamentoScritta() As StringFormat
Get
Return Me.m_allineamentoScritta
End Get
Set(value As StringFormat)
Me.m_allineamentoScritta = value
End Set
End Property
End Class
Comunque se vuoi personalizzare davvero le tue applicazioni senza troppi sbattimenti, ti consiglio di passare a WPF, parliamo di un altro mondo...