Hot News:

Unser Angebot:

  Foren auf CAD.de
  VBasic / vb.net / vbs / wsh
  vb.net: Label mit Textschatten.

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Online-Kurs: Grundlagen des 3D-Druck-Designs für Industrieingenieure , ein Kurs
Autor Thema:  vb.net: Label mit Textschatten. (1709 mal gelesen)
KMassler
Ehrenmitglied V.I.P. h.c.
CAD Admin + Mädchen für Alles... i.R.



Sehen Sie sich das Profil von KMassler an!   Senden Sie eine Private Message an KMassler  Schreiben Sie einen Gästebucheintrag für KMassler

Beiträge: 2678
Registriert: 06.11.2000

erstellt am: 11. Jul. 2013 14:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


DropShadowText.zip

 
Ahoi,
ich habe hier einen kleinen Code, der prinzipell funktioniert, im Detail aber seltsame Effekte erzeugt.
Mit dem Code wird dem Text eines Labels ein Schattenwurf hinzugefügt:
Code:
Imports System.Drawing.Text

Public Class Form1

    Sub DropShadow(lbl As Windows.Forms.Label, ByVal e As System.Windows.Forms.PaintEventArgs, _
                  x As Integer, y As Integer, ShadowColor As System.Drawing.Color)
        Dim fnt As New Font(lbl.Font, lbl.Font.Style)

        With e
            .Graphics.FillRectangle(New SolidBrush(lbl.BackColor), lbl.DisplayRectangle)
            .Graphics.DrawString(lbl.Text, fnt, New SolidBrush(ShadowColor), 0 + x, 0 + y)
            .Graphics.DrawString(lbl.Text, fnt, New SolidBrush(lbl.ForeColor), 0, 0)
        End With
        fnt = Nothing
    End Sub

    Private Sub Label1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Label1.Paint
        DropShadow(sender, e, 2, 3, Color.Gold)
    End Sub

' ....
End Class


Das Ganze funktioniert erst mal ganz gut, aber ...
der mit e.Graphics.DrawString() erzeugte Text entspricht nicht mehr dem Original.
Er wird mal größer, mal kleiner:

oder verhunzt den Text ganz:

Also meistens ist das ja schon nutzbar, aber es wäre schon schön, wenn ich die Probleme noch in den Griff bekommen könnte. Hat da vielleicht jemand eine Idee dazu?

------------------
Klaus

www.al-ko.com | mein Gästebuch | privat... |

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

HenryV
Mitglied
Konstrukteur, Engineering


Sehen Sie sich das Profil von HenryV an!   Senden Sie eine Private Message an HenryV  Schreiben Sie einen Gästebucheintrag für HenryV

Beiträge: 820
Registriert: 18.05.2005

SolidWorks 2022 x64 SP5.0
Dell Precision 5820
Intel Xeon W-2125 4x4GHz
NVIDIA Quadro P2000 5GB
32GB RAM
2x Dell U2412M, 24" TFT
Windows 10 Enterprise x64 22H2
Microsoft 365 E5
Microsoft Visual Studio Enterprise 2022

erstellt am: 12. Jul. 2013 09:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für KMassler 10 Unities + Antwort hilfreich

Hallo Klaus

Ich hab da ein bisschen gespielt und konnte den Fehler auf das Anwendungsframework zurückführen.
Ist das Anwendungsframework aktiviert, wird der Text beim erneuten zeichnen breiter und passt nicht mehr in das Label.
Deaktiviert man das Anwendungsframework, wird der Text richtig gezeichnet.

Um den mehrzeiligen Text zu korrigieren, hab ich die DropShadow-Prozedur umgeschrieben

Code:
    Sub DropShadow(ByVal lbl As Windows.Forms.Label, ByVal e As System.Windows.Forms.PaintEventArgs, _
                  ByVal x As Integer, ByVal y As Integer, ByVal ShadowColor As System.Drawing.Color)

        Dim fnt As New Font(lbl.Font, lbl.Font.Style)
        Dim lblRect As Rectangle = lbl.DisplayRectangle
        Dim shadowRect As Rectangle = lblRect
        shadowRect.X += x
        shadowRect.Y += y

        With e
            .Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias
            .Graphics.FillRectangle(New SolidBrush(lbl.BackColor), lblRect)
            .Graphics.DrawString(lbl.Text, fnt, New SolidBrush(ShadowColor), shadowRect)
            .Graphics.DrawString(lbl.Text, fnt, New SolidBrush(lbl.ForeColor), lblRect)
        End With

    End Sub


Gruss Andreas

------------------
21 ist nur die halbe Antwort.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KMassler
Ehrenmitglied V.I.P. h.c.
CAD Admin + Mädchen für Alles... i.R.



Sehen Sie sich das Profil von KMassler an!   Senden Sie eine Private Message an KMassler  Schreiben Sie einen Gästebucheintrag für KMassler

Beiträge: 2678
Registriert: 06.11.2000

erstellt am: 15. Jul. 2013 10:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Ahoi Henry,
danke für die Tipps.
Aber das ist ne komische Sache...

1. Anwendungsframework: Macht bei mir keinen Unterschied, ob das aktiv oder inaktiv ist.
(In den "richtigen" Programmen deaktiviere ich das auch ungern, wegen Splash-Screens und den anderen Einstellungen, die da enthalten sind.)

2. Dein Code:
- Smoothing-Mode: Macht keinen Unterschied, ob die Zeile vorhanden ist oder nicht. Auch bei Riesenvergrößerung der Screenshots sehen beide Versionen gleich aus.
- Der Knackpunkt für die mehrzeilige Darstellung ist die verwendete Variante (Überladung) von graphics.drawstring: DrawString(String, Font, Brush, PointF) --> DrawString(String, Font, Brush, RectangleF)
Mit deiner Version wird der zweizeilige Text dargestellt  - aber dafür wird alles noch mehr in die Länge gezerrt  . Auch der verhuzte Text von meinem 2. Bild wird leider nicht richtig dargestellt.

------------------
Klaus

www.al-ko.com | mein Gästebuch | privat... |

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

HenryV
Mitglied
Konstrukteur, Engineering


Sehen Sie sich das Profil von HenryV an!   Senden Sie eine Private Message an HenryV  Schreiben Sie einen Gästebucheintrag für HenryV

Beiträge: 820
Registriert: 18.05.2005

SolidWorks 2022 x64 SP5.0
Dell Precision 5820
Intel Xeon W-2125 4x4GHz
NVIDIA Quadro P2000 5GB
32GB RAM
2x Dell U2412M, 24" TFT
Windows 10 Enterprise x64 22H2
Microsoft 365 E5
Microsoft Visual Studio Enterprise 2022

erstellt am: 15. Jul. 2013 13:36    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für KMassler 10 Unities + Antwort hilfreich

Hallo Klaus

Ich habe noch mal ein bischen getüftelt.
Wenn ich die Eigenschaft "UseCompatibleTextRendering" beim Label auf true setzte, wird das Label zwar auch breiter, aber der gesamte Text wird dargestellt.

Gruss Andreas

------------------
21 ist nur die halbe Antwort.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KMassler
Ehrenmitglied V.I.P. h.c.
CAD Admin + Mädchen für Alles... i.R.



Sehen Sie sich das Profil von KMassler an!   Senden Sie eine Private Message an KMassler  Schreiben Sie einen Gästebucheintrag für KMassler

Beiträge: 2678
Registriert: 06.11.2000

erstellt am: 15. Jul. 2013 13:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hey cool   

Das sieht gut aus!
Der schattierte Text stimmt jetzt fast mit dem ursprünglichen überein. Selbst der verhunzte Text aus meinem "richtigen" Programm kommt jetzt richtig.
Aber Achtung: TextAlign muss auf TopLeft gesetzt sein, dann klappts

 

------------------
Klaus

www.al-ko.com | mein Gästebuch | privat... |

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2025 CAD.de | Impressum | Datenschutz