tekening in picturebox aanpassen vb 2008

Status
Niet open voor verdere reacties.

beest820

Gebruiker
Lid geworden
22 aug 2009
Berichten
52
Hoi allemaal,

ik heb in een programma een combobox en een picture box.
in de picturebox heb ik via "picturebox_paint" een tekening gemaakt.

op het moment dat ik een waarde in een combobox selecteer of verander wil ik in de picturebox een rechthoek met een bepaalde kleur tekenen.

ik krijg het alleen niet voor elkaar om vanuit het "SelectedIndexChanged" van de combobox,in de picturebox te tekenen.

ik heb dit stukje code hiervoor.

Code:
Public Class frmweerstandcalculator

    Private pictureBox1 As New PictureBox()


    Private Sub frmweerstandcalculator_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        PictureBox2.Dock = DockStyle.Fill
        AddHandler PictureBox2.Paint, AddressOf Me.pictureBox2_Paint
        Me.Controls.Add(PictureBox2)

    End Sub


    Private Sub pictureBox2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)

        Dim g As Graphics = e.Graphics

        Dim pensilver As New Pen(Color.Silver, 1)
        pensilver.Width = 4
        g.DrawLine(pensilver, 160, 60, 100, 60)
        g.DrawLine(pensilver, 375, 60, 315, 60)

        g.DrawRectangle(New Pen(Color.PapayaWhip), 175, 45, 125, 30)
        g.FillRectangle(Brushes.PapayaWhip, 175, 45, 125, 30)
        g.DrawEllipse(New Pen(Color.PapayaWhip), 160, 42, 35, 35)
        g.FillEllipse(Brushes.PapayaWhip, 160, 42, 35, 35)
        g.DrawEllipse(New Pen(Color.PapayaWhip), 280, 42, 35, 35)
        g.FillEllipse(Brushes.PapayaWhip, 280, 42, 35, 35)


    End Sub

    Private Sub RePaint(ByVal g As Graphics)
        g.DrawRectangle(New Pen(Color.Black), 180, 50, 15, 30)
    End Sub

    Private Sub PictureBox3_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox2.Paint
        RePaint(e.Graphics)
    End Sub

    Private Sub cbo10_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbo10.SelectedIndexChanged

        ' combobox 10 tallen
        If cbo10.Text = "zwart" Then
            'teken zwart vierkant in picturebox2 in eerste rechthoek
        End If

        If cbo10.Text = "bruin" Then
            'teken bruin vierkant in picturebox2 in eerste rechthoek
        End If

    End Sub

    Private Sub cbo1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbo1.SelectedIndexChanged

        ' combobox 1 tallen
        If cbo01.Text = "zwart" Then
            'teken zwart vierkant in picturebox2 in tweede rechthoek
        End If

        If cbo01.Text = "bruin" Then
            'teken bruin vierkant in picturebox2 in tweede rechthoek
        End If

    End Sub
End Class
ik krijg het vanuit de combobox niet voor elkaar om de tekening aan te passen,Weet iemand hoe dit wel kan.
 
Laatst bewerkt:
Hoi evertVB

ik ben met je code aan het stoeien geweest maar krijg niet het gewenste resultaat.:(
Hetgeen wat ik tot nu toe heb bereikt is eigenlijk alleen een uitbruiding in de bestaande picturebox.Maar nog niet vanuit een combobox.

het probleem wat nu optreed is dat mijn nieuwe "blokje" meteen verschijnd.Maar zich achter het plaatje verschuild.Hierdoor is hij dus niet zichtbaar.

ik heb 6 comboboxen met ieder 10 waarden "kleurcodes"
op het moment dat ik in een combobox een waarde selecteer moet op een bepaalde plaats in de picturebox een rechthoekje met die kleur verschijnen.6 comboboxen voor 6 rechthoeken met ieder 10 verschillende kleuren.

wat ik uit jou doorverwijzing begrijp is dat ik voor iedere situatie een nieuw plaatje moet tekenen, maar dan moet ik er honderden tekenen ?

ik heb de code aangepast, zodat het misschien duidelijk is waar het fout gaat.
grtz beest
 
Ik had een invalidate aangeroepen in dit stukje code :

Code:
   ' combobox 10 tallen
        If cbo10.Text = "zwart" Then
           me.picturebox2.invalidate()
        End If

het had alleen geen effect.
het vierkantje verschijnd al zodra het programma opstart.
daarom heb ik die regel weer verwijderd.

grtz beest
 
In je code zie ik meerdere pictureboxen (picturebox1, picturebox2, picturebox3 in elk geval).
Gaat dat wel goed? Was dat de bedoeling?
 
Het is waarschijnlijk niet nodig om zoveel pictureboxes te gebruiken.
Het probleem waar ik tegenaan loop als ik maar 1 picturebox gebruik is dat ik een melding krijg :

private_sub pictutrebox1_paint(sender as object,e as system.windows.forms.painteventargs)has multiple definitions whith identical signatures.

zodra ik meerdere pictureboxes aanmaak lijkt dit probleem te zijn opgelost.
het nadeel is dat het wel onoverzichtelijk wordt.
 
Je moet wel invalidate aanroepen.
Maar daarnaast moet er nog iets gebeuren.
In je pictureBox2_Paint routine staat nu:
Code:
        ...
        g.DrawRectangle(New Pen(Color.PapayaWhip), 175, 45, 125, 30)
        ...
Dat PapayaWhip moet worden vervangen door bruin of zwart - afhankelijk van wat de gebruiker heeft gekozen.
Anders is het logisch dat er niets gebeurt, toch?
 
Ik ben even opnieuw begonnen met het programma.
Het werd nogal een zooitje.

mijn nieuwe code is :
Code:
Public Class Form1

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint

        Dim g As Graphics = e.Graphics

        Dim pensilver As New Pen(Color.Silver, 1)
        pensilver.Width = 4
        g.DrawLine(pensilver, 160, 60, 100, 60)
        g.DrawLine(pensilver, 375, 60, 315, 60)

        g.DrawRectangle(New Pen(Color.PapayaWhip), 175, 45, 125, 30)
        g.FillRectangle(Brushes.PapayaWhip, 175, 45, 125, 30)
        g.DrawEllipse(New Pen(Color.PapayaWhip), 160, 42, 35, 35)
        g.FillEllipse(Brushes.PapayaWhip, 160, 42, 35, 35)
        g.DrawEllipse(New Pen(Color.PapayaWhip), 280, 42, 35, 35)
        g.FillEllipse(Brushes.PapayaWhip, 280, 42, 35, 35)

        If ComboBox1.SelectedText = ("zwart") Then
            g.DrawRectangle(New Pen(Color.Black), 200, 45, 7, 30)
            g.FillRectangle(Brushes.Black, 200, 45, 7, 30)

        End If

    End Sub

    
    
    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

        Me.Validate()

    End Sub
End Class


zoals je ziet heb ik alle pictureboxes verwijderd en teken ik direct op het form.
wanneer ik nu in het stukje code :

Code:
   If ComboBox1.SelectedText = ("") Then
            g.DrawRectangle(New Pen(Color.Black), 200, 45, 7, 30)
            g.FillRectangle(Brushes.Black, 200, 45, 7, 30)
        End If

"zwart" weglaat verschijnt het vierkantje op de goede manier.

nu begrijp ik nog steeds niet hoe ik het vierkantje vanuit de combobox kan laten verschijnen.

grtz beest
 
Het volgende heb ik getest en werkt bij mij.
Code:
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.ComboBox1.Items.Add("zwart")
        Me.ComboBox1.Items.Add("bruin")
    End Sub

    Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        Dim g As Graphics = e.Graphics

        Dim pensilver As New Pen(Color.Silver, 1)
        pensilver.Width = 4
        g.DrawLine(pensilver, 160, 60, 100, 60)
        g.DrawLine(pensilver, 375, 60, 315, 60)

        g.DrawRectangle(New Pen(Color.PapayaWhip), 175, 45, 125, 30)
        g.FillRectangle(Brushes.PapayaWhip, 175, 45, 125, 30)
        g.DrawEllipse(New Pen(Color.PapayaWhip), 160, 42, 35, 35)
        g.FillEllipse(Brushes.PapayaWhip, 160, 42, 35, 35)
        g.DrawEllipse(New Pen(Color.PapayaWhip), 280, 42, 35, 35)
        g.FillEllipse(Brushes.PapayaWhip, 280, 42, 35, 35)

        If ComboBox1.SelectedText = ("zwart") Then
            g.DrawRectangle(New Pen(Color.Black), 200, 45, 7, 30)
            g.FillRectangle(Brushes.Black, 200, 45, 7, 30)
        End If

        If ComboBox1.SelectedText = ("bruin") Then
            g.DrawRectangle(New Pen(Color.Brown), 200, 45, 7, 30)
            g.FillRectangle(Brushes.Brown, 200, 45, 7, 30)
        End If

    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        Me.Invalidate()
    End Sub
End Class
PS Ik heb het niet over validate maar over INvalidate
 
Laatst bewerkt:
De code doet nu wat hij moet doen :thumb:
kan nu eindelijk verder met de uitbreiding ervan.

bedankt, beest
 
Het principe is als volgt:
Door invalidate aan te roepen, laat jouw programma aan het OS (windows) weten dat (een deel van) jouw form niet meer correct wordt weergegeven.
Het OS (windows) zal dan besluiten om het form opnieuw te gaan tekenen.
Dit leidt binnen jouw programma dan weer tot het optreden van de paint-event van je form.

Daarom moet je dus invalidate aanroepen, elke keer als je wilt dat je teken-instructies nog een keer doorlopen worden.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan