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

 Beiträge: 2678 Registriert: 06.11.2000
|
erstellt am: 11. Jul. 2013 14:41 <-- editieren / zitieren --> Unities abgeben:         
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.TextPublic 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
  
 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 / zitieren --> Unities abgeben:          Nur für KMassler
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.

 Beiträge: 2678 Registriert: 06.11.2000
|
erstellt am: 15. Jul. 2013 10:07 <-- editieren / zitieren --> Unities abgeben:         
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
  
 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 / zitieren --> Unities abgeben:          Nur für KMassler
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.

 Beiträge: 2678 Registriert: 06.11.2000
|
erstellt am: 15. Jul. 2013 13:57 <-- editieren / zitieren --> Unities abgeben:         
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |