Frage zu GDI+

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von PhoenixBlaster.

    Frage zu GDI+

    Hi

    Ich wollte ein 8x8-Raster zeichnen also hab ich mir diesen Code geschrieben:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. 'Das Malen ermöglichen
    3. Dim Malen As Graphics = CreateGraphics()
    4. 'Schwarzen-Stift erstellen
    5. Dim Stift As New Pen(Color.Black, 1)
    6. '8x8 Raster malen
    7. For x = 1 To 8
    8. For y = 1 To 8
    9. Malen.DrawRectangle(Stift, New Rectangle(New Point(30 * x, 30 * y), New Point(30 * x + 30, 30 * y + 30)))
    10. Next
    11. Next
    12. End Sub


    Allerdings passiert das wenn ich ihn benutze:


    Jetzt erscheinen 12x12 Kästchen mit unterschiedlichen Größen. Ich hätte aber gerne nur die roteingekreisten Kästchen. Wie geht das jetzt?

    MFG
    PhoenixBlaster :)
    Zeichne ausschließlich im Paint Event, und nicht mit CreateGraphics.

    Mir hat mal jemand erzählt ich solle mit GDi+ und CreateGraphics zeichen, okay ich hab's jetzt so im Paint-Event

    VB.NET-Quellcode

    1. Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    2. 'Schwarzen-Stift erstellen
    3. Dim Stift As New Pen(Color.Black, 2)
    4. '8x8 Raster malen
    5. For x = 1 To 8
    6. For y = 1 To 8
    7. If x < 8 Or x = 8 And y < 8 Or y = 8 Then
    8. e.Graphics.DrawRectangle(Stift, New Rectangle(New Point(30 * x, 30 * y), New Point(30 * x + 30, 30 * y + 30)))
    9. End If
    10. Next
    11. Next
    12. End Sub

    Der Fehler kommt trotzdem.

    VB.NET-Quellcode

    1. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    2. Dim g As Graphics = e.Graphics
    3. End Sub


    Danach einfach mit g. Zeichnen.
    Dann schmeiß diesen jemand sofort aus deiner Kontaktliste in Sachen Programmieren, denn er zeigt damit, dass er keine Ahnung hat. Schau dir mal das GDI+ Tutorial von @FreakJNS: an, da ist das alles gut beschrieben.
    [VB 2008] [Tutorial] GDI+
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    In der Berufsschule wird es aber eben genau so beigebracht, wir haben dass erst gerade gemacht, dort haben wir auch wo wir wollten das createGraphics aufgerufen!
    Werd mal meinen Lehrer darauf ansprechen müssen...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()

    Fang gar nicht erst an, Spaghetti-Code zu schreiben. Ein Grid kann man als Klasse darstellen:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _grid As New Grid(8, 8, 30, Pens.Red)
    3. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    4. _grid.DrawGrid(e.Graphics)
    5. End Sub
    6. End Class
    7. Public Class Grid
    8. Public Property Width As Integer
    9. Public Property Height As Integer
    10. Public Property SquareSize As Integer
    11. Public Property GridColor As Pen
    12. Public Sub New(width As Integer, height As Integer, squareSize As Integer, gridColor As Pen)
    13. Me.Width = width
    14. Me.Height = height
    15. Me.SquareSize = squareSize
    16. Me.GridColor = gridColor
    17. End Sub
    18. Public Sub DrawGrid(g As Graphics)
    19. For i As Integer = 0 To Height - 1
    20. For j As Integer = 0 To Width - 1
    21. Dim r As New Rectangle(New Point(SquareSize * j, SquareSize * i), New Size(SquareSize, SquareSize))
    22. g.DrawRectangle(Me.GridColor, r)
    23. Next
    24. Next
    25. End Sub
    26. End Class


    Ist viel leichter erweiterbar. Denke mal daran, wenn Du feststellen willst, auf welches "Kästchen" geklickt wurde. Dann hast Du hier eine gute Möglichkeit, diese Funktion in die Klasse einzubauen. Denke immer in Objekten.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Noch ne Kleine Frage

    //CodeEdit:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Shared Sub RenderField(ByVal DrawArgs As PaintEventArgs, ByVal xcount As Integer, ByVal ycount As Integer)
    3. 'Konstanten
    4. Const StartX As Integer = 30
    5. Const StartY As Integer = 30
    6. Const Breite As Integer = 30
    7. Const Höhe As Integer = 30
    8. 'Malen
    9. With DrawArgs.Graphics
    10. For x = StartX To Breite * xcount Step Breite
    11. For y = StartY To Höhe * ycount Step Höhe
    12. .DrawRectangle(Pens.Black, x, y, Breite, Höhe)
    13. Next
    14. Next
    15. End With
    16. End Sub
    17. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    18. RenderField(e, 8, 8)
    19. End Sub
    20. End Class


    Warum geht das nicht?
    Du hast den Fehler gedacht, dass ein Rectangle aus 2 Punkten bestehen würde, was es zwar auch tut, allerdigns kannst du es mit denen nicht direkt instanzieren. Du brauchst immer einen Point und eine Size anstatt 2 Points.

    //EDIT: War auf deinen vorletzten Post bezogen :S.
    Bitte sehr.

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Zeichnet ein Raster mit gegebener Größe auf gegebener Position.
    3. ''' </summary>
    4. ''' <param name="g">Das Graphics-Objekt mit dem gezeichnet werden soll.</param>
    5. ''' <param name="size">Die Größe eines einzelnen Blocks im Raster.</param>
    6. ''' <param name="point">Der Startpunkt an dem der erste Block des Rasters dargestellt werden soll.</param>
    7. ''' <param name="gridcount">Die Anzahl der Blöcke pro Reihe im Raster.</param>
    8. ''' <param name="color">Die Farbe in der der Raster dargestellt werden soll.</param>
    9. Private Sub DrawGrid(ByVal g As Graphics, ByVal size As Size, ByVal point As Point, ByVal gridcount As Integer, ByVal color As Color)
    10. For x = point.X To (point.X + (size.Width * gridcount)) Step size.Width
    11. For y = point.Y To (point.Y + (size.Height * gridcount)) Step size.Height
    12. g.DrawRectangle(New Pen(color, 1), x, y, size.Width, size.Height)
    13. Next
    14. Next
    15. End Sub


    Aufruf sollte logisch sein:
    DrawGrid(e.Graphics, New Size(30, 30), New Point(30, 30), 8, Color.Black)
    @RushDen
    Danke für die Hilfe!

    Wen es interessiert hier der fertige Sub:

    VB.NET-Quellcode

    1. Public Class Form1
    2. ''' <summary>
    3. ''' Rendert ein Netz aus Rechtecken
    4. ''' </summary>
    5. ''' <param name="DrawArgs">Der PaintEventArgs</param>
    6. ''' <param name="pen">Der Stift</param>
    7. ''' <param name="start">Die Startposition des Netzes</param>
    8. ''' <param name="size">Die Größe eines Rechteckes</param>
    9. ''' <param name="xcount">Die horizontale Anzahl an Rechtecken</param>
    10. ''' <param name="ycount">Die vertikale Anzahl an Rechtecken</param>
    11. ''' <remarks></remarks>
    12. Public Shared Sub RenderField(ByVal DrawArgs As PaintEventArgs, ByVal pen As Pen, ByVal start As Point, ByVal size As Size, ByVal xcount As Integer, ByVal ycount As Integer)
    13. 'Malen
    14. With DrawArgs.Graphics
    15. For x = start.X To size.Width * xcount Step size.Width
    16. For y = start.Y To size.Height * ycount Step size.Height
    17. .DrawRectangle(pen, x, y, size.Width, size.Height)
    18. Next
    19. Next
    20. End With
    21. End Sub
    22. Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    23. RenderField(e, New Pen(Color.Black, 2), New Point(30, 30), New Size(30, 30), 10, 10)
    24. End Sub
    25. End Class

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „PhoenixBlaster“ ()