fastcoloredtextbox - rot unterstreichen

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von filmee24.

    codeproject.com/Articles/16187…x-for-syntax-highlighting

    HighlightingControl von TheCodeProject.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    filmee24 schrieb:

    nur leider hab ich kein plan
    Fang doch einfach mal in einer Paint-Routine an, einen Text auszugeben und ihn zu unterstreichen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    2. Dim x As Single = 50
    3. Dim y As Single = 50
    4. Dim txt = "bla"
    5. Dim ft = Me.Font
    6. Dim sz As SizeF = e.Graphics.MeasureString(txt, ft)
    7. e.Graphics.DrawString(txt, ft, Brushes.Black, New PointF(x, y))
    8. e.Graphics.DrawLine(Pens.Red, New PointF(x, y + sz.Height), New PointF(x + sz.Width, y + sz.Height))
    9. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich habe diesen code:

    VB.NET-Quellcode

    1. Imports FastColoredTextBoxNS
    2. Public Class UnderlineStyle
    3. Inherits Style
    4. Public Overrides Sub Draw(gr As System.Drawing.Graphics, position As System.Drawing.Point, range As FastColoredTextBoxNS.Range)
    5. For index = range.Start.iChar To range.End.iChar
    6. Dim x As Single = position.X
    7. Dim y As Single = position.Y
    8. Dim line As Line = range.tb(range.Start.iLine)
    9. Dim txt = line(index).c.ToString
    10. Dim ft = range.tb.Font
    11. Dim sz As SizeF = gr.MeasureString(txt, ft)
    12. ' gr.DrawString(txt, ft, Brushes.Black, New PointF(x, y))
    13. Dim num1 As Single = CType(range.tb.CharWidth, Single)
    14. Dim num2 As Single = CType((position.X _
    15. - (range.tb.CharWidth / 3)), Single)
    16. gr.DrawLine(Pens.Red, New PointF(x, y + sz.Height), New PointF(x + sz.Width, y + sz.Height))
    17. num2 = (num2 + num1)
    18. Next
    19. End Sub
    20. End Class


    aber es kommt das fehlerbild

    filmee24 schrieb:

    aber es kommt das fehlerbild
    Welches?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da musste mal in Deine Paint-Routine rein-debuggen.
    Da wird iwo eine Exception geschmissen, das musst Du aufklären.
    Aber nicht mit Try-Catch!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ist debuggen. Musste lernen.
    Schick mal Deine Paint-Routine.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    habe keine paint routine,hä

    habe das:

    VB.NET-Quellcode

    1. Imports FastColoredTextBoxNS
    2. Public Class UnderlineStyle
    3. Inherits Style
    4. Public Overrides Sub Draw(gr As System.Drawing.Graphics, position As System.Drawing.Point, range As FastColoredTextBoxNS.Range)
    5. For index = range.Start.iChar To range.End.iChar
    6. Dim x As Single = position.X
    7. Dim y As Single = position.Y
    8. Dim line As Line = range.tb(range.Start.iLine)
    9. Dim txt = line(index).c.ToString
    10. Dim ft = range.tb.Font
    11. Dim sz As SizeF = gr.MeasureString(txt, ft)
    12. ' gr.DrawString(txt, ft, Brushes.Black, New PointF(x, y))
    13. Dim num1 As Single = CType(range.tb.CharWidth, Single)
    14. Dim num2 As Single = CType((position.X _
    15. - (range.tb.CharWidth / 3)), Single)
    16. gr.DrawLine(Pens.Red, New PointF(x, y + sz.Height), New PointF(x + sz.Width, y + sz.Height))
    17. num2 = (num2 + num1)
    18. Next
    19. End Sub
    20. End Class


    und die verwendung: editor.Keywords.Add(New SyntaxItem("under", editor.getStyle("UNDERLINED")))
    und im textchanged event werden die styles benutzt
    also ich hab gleich 2 neue Styles erfunden, einen DelegateStyle und einen OwnerDrawStyle (die prinzipiell das gleiche machen, nämlich das Zeichnen delegieren).
    Ich denke, mit dem OwnerDrawStyle kommt man leichter klar, wenn man schonmal ein Paint-Event behandelt hat.
    Also hier die Styles:

    C-Quellcode

    1. public class OwnerDrawStyle : Style {
    2. public class EventArg : EventArgs {
    3. public Graphics Graphics; public Rectangle Rect; public Range Range;
    4. public EventArg(Graphics gr, Rectangle rct, Range rng) { Graphics = gr; Rect = rct; Range = rng; }
    5. }
    6. public event EventHandler<EventArg> Paint;
    7. public override void Draw(Graphics gr, Point pos, Range range) {
    8. if(Paint != null) Paint(this, new EventArg(gr, new Rectangle(pos, GetSizeOfRange(range)), range));
    9. }
    10. }
    11. public class DelegateStyle : Style {
    12. private Action<Graphics, Rectangle> _Draw;
    13. public DelegateStyle(Action<Graphics, Rectangle> draw) { _Draw = draw; }
    14. public override void Draw(Graphics gr, Point pos, Range range) { _Draw(gr, new Rectangle(pos, GetSizeOfRange(range))); }
    15. }

    Im MarkerTestForm habichdann sowas:

    VB.NET-Quellcode

    1. Private WithEvents _RedUnderlined As New OwnerDrawStyle
    2. Private Sub _RedUnderlined_Paint(ByVal sender As Object, ByVal e As OwnerDrawStyle.EventArg) Handles _RedUnderlined.Paint
    3. With e.Rect
    4. e.Graphics.DrawLine(Pens.YellowGreen, .X, .Bottom - 1, .Right, .Bottom - 1)
    5. End With
    6. End Sub
    7. 'Private _RedUnderlined As New DelegateStyle( _
    8. ' Sub(gr, rct) gr.DrawLine(Pens.Red, rct.X, rct.Bottom - 1, rct.Right, rct.Bottom - 1))
    danke, ich hab es so gemacht:

    VB.NET-Quellcode

    1. Imports FastColoredTextBoxNS
    2. Public Class UnderlineStyle
    3. Inherits Style
    4. Public Overrides Sub Draw(gr As System.Drawing.Graphics, position As System.Drawing.Point, range As FastColoredTextBoxNS.Range)
    5. Dim size As Size = GetSizeOfRange(range)
    6. Dim rect As Rectangle = New Rectangle(position, size)
    7. With rect
    8. gr.DrawLine(Pens.YellowGreen, .X, .Bottom - 1, .Right, .Bottom - 1)
    9. End With
    10. End Sub
    11. End Class