vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

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

VB.NET - Ein- und Umsteiger
Re: Label OwnerDraw 
Autor: ModeratorRalfE (Moderator)
Datum: 23.03.10 09:50

>> Wie könnte ich das so lösen, das die Farbe nicht Brushes.Black sondern die bereits im Steuerelement angegebene ForeColor ist?
Die Eigenschaft ForeColor liefert dir ein Color-Objekt, mit dem du ein Brush-Objekt erzeugen kannst, was du für den DrawString()-Aufruf brauchst:
Dim b As New SolidBrush(Me.ForeColor)
>> Gibt es eine Möglichkeit, dass der Text immer sichtbar ist, egal welche Hintergrundfarbe(n)?
Wenn ForeColor und BachColor identisch sind, musst du selber die Farben anpassen. Eine Möglichlkeit wäre die Invertierung.

Ralf

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Label 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ü
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Label OwnerDraw 
Autor: Schü
Datum: 23.03.10 09:59

Danke!

Und die Konvertierung würde man wie lösen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Label OwnerDraw 
Autor: ModeratorRalfE (Moderator)
Datum: 23.03.10 11:20

Konvertierung? Du meinst sicherlich Invertierung:

Private Function InvertColor(ByVal c As Color) As Color
  Return Color.FromArgb(c.A, 255 - c.R, 255 - c.G, 255 - c.B)
End Function

Ralf

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Label OwnerDraw 
Autor: Schü
Datum: 23.03.10 17:27

OK Danke!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Label OwnerDraw 
Autor: Schü
Datum: 23.03.10 19:30

Danke Manfred für die detailierte Info.

Hier werden Sie geholfen!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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ü
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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ü
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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-2024 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