pat.bat
Goto Top

Rechteck zeichnen bleibt erfolglos

Hallo zusammen,

ich versuche gerade in einer Form ein Rechteck zu zeichnen, dieses erscheint jedoch nicht und ich sehe nicht wo ich einen Fehler in der Prozedur gemacht habe:

    Private Sub FormSettings_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        txtBoxProsozAusgabe.Text = My.Settings.AusgabeProsoz
        txtBoxEVArchiv.Text = My.Settings.EVArchiv
        txtBoxEVAusgabeHH.Text = My.Settings.EVAusgabeHH
        Check_Settings()
    End Sub

    ' Textbox kennzeichnen, wenn leer  
    Private Sub Check_Settings()
        Dim myGraphics As Graphics = Me.CreateGraphics
        Dim myPen As Pen
        myPen = New Pen(Drawing.Color.Red, 5)
        Dim myRectangle As New Rectangle
        myRectangle.Width = 520
        myRectangle.Height = 22

        If (My.Settings.AusgabeProsoz = "") Then  
            myRectangle.X = TextProsozAusgabe.Location.X
            myRectangle.Y = TextProsozAusgabe.Location.Y
            myGraphics.DrawRectangle(myPen, myRectangle)
        Else
            'Grafik löschen  
        End If

        If (My.Settings.EVArchiv = "") Then  
            myRectangle.X = txtBoxEVArchiv.Location.X
            myRectangle.Y = txtBoxEVArchiv.Location.Y
            myGraphics.DrawRectangle(myPen, myRectangle)
        Else
            'Grafik löschen  
        End If

        If (My.Settings.EVAusgabeHH = "") Then  
            myRectangle.X = TextEVAusgabeHH.Location.X
            myRectangle.Y = TextEVAusgabeHH.Location.Y
            myGraphics.DrawRectangle(myPen, myRectangle)
        Else
            'Grafik löschen  
        End If
    End Sub

Das Programm wird ohne Fehler ausgeführt, er füllt die Variablen auch mit den richtigen Werten.

Content-Key: 476926

Url: https://administrator.de/contentid/476926

Printed on: April 19, 2024 at 17:04 o'clock

Mitglied: 140447
Solution 140447 Jul 24, 2019 updated at 10:02:28 (UTC)
Goto Top
ich versuche gerade in einer Form ein Rechteck zu zeichnen, dieses erscheint jedoch nicht und ich sehe nicht wo ich einen Fehler in der Prozedur gemacht habe:
Die Zusatztexte sollte man auch immer lesen ...
How to: Draw a Filled Rectangle on a Windows Form
You cannot call this method in the Load event handler. The drawn content will not be redrawn if the form is resized or obscured by another form. To make your content automatically repaint, you should override the OnPaint method.
Zu dem Zeitpunkt ist die Form noch garnicht gezeichnet also kann dein Rechteck auch nicht erscheinen weil es vom Paint Event bereits wieder überschrieben wird.
Platziere deinen Code im Paint-Event oder Shown-Event etc. in dem die Form schon sichtbar ist. nur im Paint-Event ist sichergestellt das dein Rechteck auch bei einem ändern der Größe der Form oder bei einem Redraw das Rechteck noch sichtbar ist.

Die Grundlagen zu Windows Forms sollten hier doch mal gelesen werden.
Member: emeriks
emeriks Jul 24, 2019 at 11:25:58 (UTC)
Goto Top
Hi,
' Textbox kennzeichnen, wenn leer
Kann man sicher so machen ....
Ich setzte in solchen Fällen einfach die Hintergrundfarbe der Textbox.

E.
Member: Pat.bat
Pat.bat Jul 25, 2019 at 06:59:13 (UTC)
Goto Top
Ich habs jetzt so gelöst:

    Private Sub Check_Settings()

        p = New Panel
        p.Parent = Me.TabPagePath
        p.BorderStyle = BorderStyle.None
        p.BackColor = Color.Transparent
        p.Location = TabPagePath.Location
        p.Size = TabPagePath.Size
        p.Visible = True

        Dim myGraphics1 As Graphics = p.CreateGraphics
        Dim myGraphics2 As Graphics = p.CreateGraphics
        Dim myGraphics3 As Graphics = p.CreateGraphics

        If (My.Settings.AusgabeProsoz = "") Then  

            Dim myPen As Pen
            myPen = New Pen(Drawing.Color.Red, 2)
            Dim myRectangle As New Rectangle
            myRectangle.Width = 560
            myRectangle.Height = 21
            myRectangle.X = TextProsozAusgabe.Location.X - 4
            myRectangle.Y = TextProsozAusgabe.Location.Y - 39
            myGraphics1.DrawRectangle(myPen, myRectangle)
            Fehler = "Prosoz Ausgabepfad nicht festgelegt!"  
        Else
            myGraphics1.Dispose()
        End If

        If (My.Settings.EVArchiv = "") Then  

            Dim myPen As Pen
            myPen = New Pen(Drawing.Color.Red, 2)
            Dim myRectangle As New Rectangle
            myRectangle.Width = 560
            myRectangle.Height = 21
            myRectangle.X = TextEVArchiv.Location.X - 4
            myRectangle.Y = TextEVArchiv.Location.Y - 39
            myGraphics2.DrawRectangle(myPen, myRectangle)
            Fehler = "EV Archivpfad nicht festgelegt!"  
        Else
            myGraphics2.Dispose()
        End If

        If (My.Settings.EVAusgabeHH = "") Then  

            Dim myPen As Pen
            myPen = New Pen(Drawing.Color.Red, 2)
            Dim myRectangle As New Rectangle
            myRectangle.Width = 560
            myRectangle.Height = 21
            myRectangle.X = TextEVAusgabeHH.Location.X - 4
            myRectangle.Y = TextEVAusgabeHH.Location.Y - 39
            myGraphics3.DrawRectangle(myPen, myRectangle)
            Fehler = "EV H&H Ausgabepfad nicht festgelegt!"  
        Else
            myGraphics3.Dispose()
        End If


    End Sub

Ich erstelle ein neues Panel, mache das Transparent und Zeichne direkt darauf. Das funktioniert so deutlich besser als wenn ich versuche direkt in die Form bzw auf der ebene der TabPage zeichne.

Das ist erstmal eine fixe Lösung, Optimierung folgt sobald alles funktioniert wie es soll.

Das Ergebnis sieht dann so aus:
resultat

Das einzige Problem was ich jetzt noch habe ist, das wenn ich das Programm starte und die Einstellungsmaske öffne, er nichts markiert (obwohl er durch den Code geht).

Schließe ich die Einstellungsmaske und öffne diese erneut wird alles richtig angezeigt. Also zeigt er mir dies nur nicht beim ersten Laden der Maske.

Das einzige was ich mir vorstellen kann, woran es liegt ist, das das Panel, worauf gezeichnet wird, beim ersten öffnen ein paar Ebenen in den Hintergrund rutscht und dadurch von der TabPage überzeichnet wird.

Frage ist, warum passiert das beim erstmaligen Öffnen und nicht danach?