resize redraw

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von kiter20.

    Hallo,

    und wieder bestimmt eine absolute Anfänger Frage die man sich hätte sparen können.
    Aber........ ICH FINDE NICHT DIE LÖSUNG :cursing:

    1. Ich habe eine Linie gezeichnet
    2. Größe der Form geändert
    3. weg ist die Linie

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class form1
    3. Public Pen As New Pen(Brushes.Black, 1)
    4. Private Sub cmdrechteck_Click(sender As Object, e As EventArgs) Handles cmdrechteck.Click
    5. Dim graphic As Graphics = Me.CreateGraphics()
    6. graphic.DrawRectangle(Pen, 10, 10, 50, 50)
    7. graphic.DrawEllipse(Pen, 50, 130, 44, 22)
    8. End Sub
    9. Private Sub form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    10. Me.ResizeRedraw = True
    11. End Sub
    12. End Class


    Ich werde aus dem Galileo...2008 einfach nicht schlau.
    "Mann" lernt mit seinen Projekten.

    VB.NET-Quellcode

    1. Private Sub cmdrechteck_Click(sender As Object, e As EventArgs) Handles cmdrechteck.Click
    2. Dim graphic As Graphics = Me.CreateGraphics()
    3. graphic.DrawRectangle(Pen, 10, 10, 50, 50)
    4. graphic.DrawEllipse(Pen, 50, 130, 44, 22)
    5. End Sub

    NEIN NEIN NEIN NEIN :D

    Setze beim Click auf den Button ne globale Flag (Boolean) und dann zeichnest du im Paint-Event, wenn die Flag True ist.

    EDIT: Code gelöscht, TE soll selbst lernen :s
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Danke für den Tipp mit dem Microsoft 2005.
    Da stand zumindest das drin, was mir für den Einstieg gefehlt hat.
    Und in kombination mit Galileo 2008 hab Ich erstmal ne Menge zum rumprobieren.

    Was Ich aber nicht finden kann ist, wie Ich Mein Koordinatensystem spiegeln kann.
    Rotieren geht, alles wunderbar, jetzt will Ich nur noch spiegeln. Nach recht und nach oben positiver verlauf der Achsen.
    "Mann" lernt mit seinen Projekten.
    Genau das wollte Ich vermeiden.
    Denn wenn Ich eine dxf datei einlese muss Ich immer das Vorzeichen drehen.

    Gibt es nicht die Möglichkeit mit rotateflip?

    VB.NET-Quellcode

    1. Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    2. Dim penXY As New Pen(Color.Gray, 0.5)
    3. Dim g As Graphics = e.Graphics
    4. g = Graphics.FromHwnd(grpZeichnen.Handle)
    5. g.ResetTransform()
    6. g.PageUnit = GraphicsUnit.Pixel
    7. g.PageScale = numscale.Value
    8. g.RotateTransform(180)
    9. g.TranslateTransform(-(grpZeichnen.Size.Width + schieberX.Value), -(grpZeichnen.Size.Height + schieberY.Value))
    10. If zeichnen Then
    11. g.DrawLine(penXY, 0, 0, 50, 50)
    12. End If
    13. End Sub
    "Mann" lernt mit seinen Projekten.
    So, habe jetzt erst einmal das mit der Verrechnung über die Höhe gemacht.
    Aber....

    Ich habe da nen anderes Problem:

    Das OnPaint wird ja permanent durchlaufen.
    Aber wieso wird nicht sobald Ich die Variable zum Zeichnen auf true setze gezeichnet?
    Erst wenn Ich die größe ändere oder Ich mit der Maus über nen Button fahre.

    VB.NET-Quellcode

    1. If chkZeichen.Checked = True Then
    2. zeichnen = True
    3. grpZeichnen.Invalidate()
    4. Else


    VB.NET-Quellcode

    1. Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    2. Dim penXY As New Pen(Color.Gray, 0.5)
    3. Dim penGitter As New Pen(Color.GreenYellow, 0.5)
    4. Dim GitterX As Single = grpZeichnen.Width * 20 / CSng(txtGitter.Text)
    5. Dim GitterY As Single = grpZeichnen.Height * 20 / CSng(txtGitter.Text)
    6. verschiebungX = schieberX.Value + CSng(grpZeichnen.Width / 8)
    7. verschiebungY = grpZeichnen.Height - schieberY.Value - CSng(grpZeichnen.Height / 8)
    8. Dim g As Graphics = e.Graphics
    9. g = Graphics.FromHwnd(grpZeichnen.Handle)
    10. g.ResetTransform()
    11. g.PageUnit = GraphicsUnit.Pixel
    12. g.PageScale = numscale.Value
    13. g.TranslateTransform(verschiebungX, verschiebungY)
    14. If zeichnen Then
    15. ' 0 Linien zeichnen
    16. g.DrawLine(penXY, -grpZeichnen.Width * 10, 0, grpZeichnen.Width * 10, 0)
    17. g.DrawLine(penXY, 0, grpZeichnen.Height * 10, 0, -grpZeichnen.Height * 10)
    18. ' Gitter X
    19. For i = 0 To GitterX - 1
    20. Dim z As Single = i * CSng(txtGitter.Text)
    21. g.DrawLine(penGitter, -grpZeichnen.Width * 10, grpZeichnen.Height * 10 - z, grpZeichnen.Width * 10, grpZeichnen.Height * 10 - z)
    22. Next
    23. End If
    24. End Sub
    "Mann" lernt mit seinen Projekten.

    kiter20 schrieb:

    VB.NET-Quellcode

    1. zeichnen = True
    2. grpZeichnen.Invalidate()
    Kann es sein, dass Deine OnPaint-Routine das Paint-Event der Form ist?
    Hole Dir das Paint-Event Deines Controls grpZeichnen.
    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!
    ja, da scheint irgendwie sowas im Busch zu sein.

    Habe mal

    VB.NET-Quellcode

    1. me.invalidate()


    gemacht.

    Siehe da, es geht. Aber auch nicht so richtig.
    Ich denke, Ich verstehe das Problem, kenne aber nicht die möglichkeiten dies zu lösen. (bis jetzt)

    Ich nutze das onpaint der Form, zeichne in der grpbox und somit wird das erst angestoßen, sobald sich etwas auf der form ändert.

    RodFromGermany schrieb:

    Hole Dir das Paint-Event Deines Controls grpZeichnen.
    Aber wie mache Ich das?
    Unter was für einem Thema kann Ich das nachlesen?
    Oder nen kleines Beispiel.

    Besser noch beides ;)
    "Mann" lernt mit seinen Projekten.

    kiter20 schrieb:

    Aber wie mache Ich das?
    Wenn Du auf die Form zeichnest, schmeiß das Control (zunächst) mal raus.
    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!

    kiter20 schrieb:

    Ich denke, Ich verstehe das Problem, kenne aber nicht die möglichkeiten dies zu lösen. (bis jetzt)

    Ich nutze das onpaint der Form, zeichne in der grpbox und somit wird das erst angestoßen, sobald sich etwas auf der form ändert.
    wennde im Onpaint des Forms in die Groupbox zeichnest, dann denke ich eher, du hast garnix verstanden.

    vlt. studierste Control mit beweglicher Figur mal ganz genau, inklusive aller Erklärungen. Da habich versucht, das Prinzip OwnerDrawing auseinanderzusetzen.

    ErfinderDesRades schrieb:

    Ich nutze das onpaint der Form, zeichne in der grpbox und somit wird das erst angestoßen, sobald sich etwas auf der form ändert.
    Bevor daraus jetzt ein Missverständniss wird. Mit dem Satz wie was mache wollte Ich sagen, dass das das Probleblem ist.
    Das sollte nicht bedeuten, dass das richtig ist.

    Auf jeden Fall binn Ich wieder nen Schritt weiter gekommen.

    Dafür ist doch das Forum da. Fragen stellen und Antworten bekommen. Ihr habt doch bestimmt auch nicht alles aus irgend welchen Buchern gelernt, oder doch? (Das ist doch nen bisschen trocken.)
    "Mann" lernt mit seinen Projekten.