| |
VB.NET - Ein- und UmsteigerLabel OwnerDraw | | | Autor: Schü | Datum: 23.03.10 08:51 |
| Hallo.
habe mir eine Klasse von Forms.Label abgeleitet. Dort zeichne ich im Paint-Ereignis den Hintergrund neu (in de Art eines Fortschrittsbalkens). Klappt ganz gut, denke ich.
Nun möchte ich den eigentlichen Text des Labels darüber zeichnen, kann aber irgendwie nicht die Umwandlung von Label.ForeColor nach Brush, was die Textfarbe sein soll.
Hier der Code im PaintEvent des Labels:
Private Sub ProgressLabel_Paint(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Try
Dim Rect As Drawing.Rectangle
Dim Radius As Single = mRadius
If Me.Height <= Me.Width Then
If Radius > (Me.Height - 2 * RAND) / 2 Then Radius = CSng(( _
Me.Height - 2 * RAND) / 2) - 1
Else
If Radius > (Me.Width - 2 * RAND) / 2 Then Radius = CSng(( _
Me.Width - 2 * RAND) / 2) - 1
End If
With Me.Bounds
'Rand
Rect = New Drawing.Rectangle(0, 0, .Width - RAND, .Height - _
RAND)
DrawRoundedRectangle(e.Graphics, Rect, Radius, mBorderColor, _
New LinearGradientBrush(Rect, mBackColor1, mBackColor2, _
LinearGradientMode.Vertical))
'Füllung
Dim Val As Single = CSng(mValue / mMaximum)
Dim W As Integer = CInt(.Width * Val) - 1
If W > 0 Then
Rect = New Drawing.Rectangle(0, 0, W, .Height - RAND)
DrawRoundedRectangle(e.Graphics, Rect, Radius, _
mBorderColor, _
New LinearGradientBrush(Rect, mForeColor1, mForeColor2, _
LinearGradientMode.Vertical))
End If
End With
If Me.Text <> "" Then
Dim Rect2 As System.Drawing.Size = TextRenderer.MeasureText( _
Me.Text, Me.Font)
Dim x As Integer = CInt((Me.Width - Rect2.Width) / 2)
Dim y As Integer = CInt((Me.Height - Rect2.Height) / 2)
'Text zeichnen
e.Graphics.DrawString(Me.Text, Me.Font, Brushes.Black, x, y)
End If
Catch
End Try
End Sub Wie könnte ich das so lösen, das die Farbe nicht Brushes.Black sondern die bereits im Steuerelement angegebene ForeColor ist?
Gibt es eine Möglichkeit, dass der Text immer sichtbar ist, egal welche Hintergrundfarbe(n)?
Schü | |
Re: Label OwnerDraw | | | Autor: Schü | Datum: 23.03.10 09:59 |
| Danke!
Und die Konvertierung würde man wie lösen? | |
Re: Label OwnerDraw | | | Autor: Schü | Datum: 23.03.10 17:27 |
| OK Danke! | |
Re: Label OwnerDraw | | | Autor: Manfred X | Datum: 23.03.10 18:07 |
| Hallo!
Wichtig ist ein maximaler Kontrast.
Ist die Hintergrund insgesamt (in allen RGB-Werten)
näher an "weiss" (255) als an "schwarz" (0), sollte der
Vordergrund schwarz sein - umgekehrt, umgekehrt.
Die Invertierung führt dazu, dass mittleres Grau
mittleres Grau bleibt - d.h. minimaler Kontrast.
Invertierung funktioniert meist dann, wenn es in
einer farbe eine Kombination von sehr hoch mit sehr
niedrig ausgeprägten RGB-Werten gibt.
Check It Out!
Beitrag wurde zuletzt am 23.03.10 um 18:13:20 editiert. | |
Re: Label OwnerDraw | | | Autor: Schü | Datum: 23.03.10 19:30 |
| Danke Manfred für die detailierte Info.
Hier werden Sie geholfen! | |
Noch eine Frage: | | | Autor: Schü | Datum: 23.03.10 19:37 |
| Nach dem Zeichnen des Labels im Designer auf einer Form ist die Eigenschaft AutoSize immer auf TRUE
gesetzt, obwohl ich folgende in der abgeleiteten Klasse geschieben habe:
Public Sub New
MyBase.New
MyBase.AutoSize = False
End Sub offensichtlich wird nach dem Einfügen(Zeichnen)meines Controls der Name des Steuerelementes (z.B.
Label1) und der Text sowie die Eigenschaft AutoSize neu gesetzt, also nochmals nach New().
Wo müsste ich denn Me.AutoSize=False einfügen, wenn ich will, dass das Control eben nicht eine automatische Größe nach dem Einfügn hat?
Hat jemand eine Idee?
Schü | |
Re: Noch eine Frage: | | | Autor: Snof | Datum: 23.03.10 22:53 |
| Hallo
Probiers mal damit:Public Overrides Property AutoSize() As Boolean
Get
Return MyBase.AutoSize
End Get
Set(ByVal value As Boolean)
MyBase.AutoSize = False
End Set
End Property Ist zwar nicht die sauberste Methode, aber sie sollte verhindern, dass der Wert "von außen" geändert werden kann.
Alternativ dazu könnte man eventuell die Attribute der Eigenschaft ändern, so dass der Designer nich jedesmal AutoSize auf True setzt. Aber da bin ich mir nicht sicher. | |
Re: Noch eine Frage: | | | Autor: Schü | Datum: 24.03.10 07:22 |
| Hmm..
Danke daranhatte ich auch gedacht, aber damit kann ich die Eigenschaft nie ändern.
Wollte eigentlich nur, dass beim Zeichnen des Controls die Größe bleibt und der Name (Text) nicht gesetzt wird, da es ja eigentlich eine Art Fortschrittsbalken sein soll und da steht nun mal 0-100% und nicht Label1.
Irgendwo zwischen New() und dem Paint-Ereignis muss das intern doch gesetzt werden.
Geht da was mit SuspendLayout oder so?
Schü | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere Infos
|