Perfektes Gitter mit GDI malen

    • VB.NET

    Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von CrosSLight.

      Perfektes Gitter mit GDI malen

      Hey leute,
      ich habe heute eine kleine Sub geschrieben womit man ein Perfektes Gleichmäßiges Gitter mit GDI zeichnen kann mit Spalten und reihen angabe!
      Also erstmal braucht ihr zwei Variablen:
      spalten und reihen
      wozu sollte klar sein^^
      Die sub:

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private spalten As Integer = 15
      3. Private reihen As Integer = 15
      4. Public Sub DrawLines( ByVal g As Graphics)
      5. Dim factorx As Double = (Me.ClientSize.Width / spalten) - (1 / spalten)
      6. Dim factory As Double = (Me.ClientSize.Height / reihen) - (1 / reihen)
      7. For y As Integer = 1 To reihen
      8. g.DrawLine(Pens.Green, 1, CInt(y * factory), Me.Width, CInt(y * factory))
      9. Next
      10. For x As Integer = 1 To spalten
      11. g.DrawLine(Pens.GreenYellow, CInt(x * factorx), 1, CInt(x * factorx), Me.Height)
      12. Next
      13. End Sub
      14. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
      15. e.Graphics.Clear(Color.Black)
      16. DrawLines(e.Graphics)
      17. End Sub
      18. Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
      19. Me.Refresh()
      20. End Sub
      21. End Class


      jetzt einfach in die variable reihen die reihen hinschreiben und in spalten die spalten und jetzt sollte es wenn alles richtig ist so aussehn:

      In meinen fall waren es 15 Zeilen und 15 Spalten.
      Hoffe konnte euch helfen
      Über Kommentarre freue ich mich
      Mfg
      Load-soft

      EDIT:
      Hab mir erlaubt den Code einwenig umzugestalten, sodass er auch für den Sourcecode-Austausch akzeptabel ist.
      Ansonten - nette Idee.

      Gruss

      mikeb69

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Load-soft.ch.vu“ () aus folgendem Grund: Idee nett - Code untragbar für Sourcecode-Austausch

      Danke^^
      Ich habe das ganze nochmal mit richtigen Rechtecken gemacht so kann man auch mehr damit machen bzw. man weiß wo welches Rechteck anfängt:

      VB.NET-Quellcode

      1. Public Sub DrawRectangles()
      2. Dim x As Integer = 1
      3. Dim y As Integer = 1
      4. Dim Factoryx As Double = Panel1.width / spalten
      5. Dim Factoryy As Double = Panel1.height / reihen
      6. For rows = 1 To reihen
      7. For spalt = 1 To spalten
      8. Dim rechteck As New Rectangle(x, y, Factoryx, Factoryy)
      9. g.DrawRectangle(Pens.Green, rechteck)
      10. x += Factoryx - (1 / spalten)
      11. Next
      12. y += Factoryy - (1 / reihen)
      13. x = 1
      14. Next
      15. End Sub

      Wenn man wieder zweifarben haben möchte dann einfach Drawlines ausführen (ob man Rechtecke nimmt oder Linen) sie sind immer an der gleichen stelle.
      Einfach in eine List(of Rectangle).
      Edit:
      Code etwas überarbeitet so sollte es besser klappen bzw. Trotztdem noch genau sein. (hoff ich)

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Load-soft.ch.vu“ ()

      Boah,der code ist echt gut,hat mir sehr gehollfen.Aber da war ein kleiner Fehler drin, bei den "yellowgreen" Linien, werden diese,wenn man die Form ganz klein zieht nicht ganz durchgezeichnet.Weil da als als letzte Angabe "me.width" steht,also sind die immer nur so lang wie die Breite und nicht ganz durchgehend bis zur höhe.Da sollte "me.height" hin.

      edit: Außerdem ist es echt witzig die Spalten und Reihen auf einen sehr hohen wert zu stellen,dann wird eine wand erst von oben nach unten und dann von rechts nach links gezogen,echt witzig. :D
      Ist vllt bisschen her das Thema aber wie kann man das Gitter in den Hintergrund machen, wenn ich z.B. etwas mit der Maus zeichnen will (in einem Programm auf Basis von einem Thema im Source Code Austausch (Paint Prog)) dann ist das gitter im vordergrund und ich muss es erst deaktivieren bevor ich alle linien etc. sehe ?(
      ich selbst habe soetwas auch mal gebraucht und genauso realisiert. das problem ist, wenn man den abstand zwischen den linien sehr klein wählt - also sehr viele linien gezeichnet werden müssen - dauert das ganze extrem lange und es kommt zu "rucklern".
      ich habe das problem gelöst indem ich nur ein rechteck auf eine bitmap gezeichnet habe und den betreffenden bereich dann mittels texturebrush ausgefüllt habe. das ergebnis ist das selbe, es geht nur um einiges schneller^^

      mfg FreakJNS

      VB.NET-Quellcode

      1. public class Class1
      2. Dim G as Graphics
      3. Dim BBG as Graphics
      4. Dim BB as Bitmap
      5. Dim R as rectangle
      6. Die größe Der kästen
      7. Dim TileSize as integer = 32
      8. 'Ins FormLoad
      9. Sub Form_Load()
      10. me.show
      11. me.focus
      12. G = Me.CreateGraphics
      13. BB = new Bitmap (me.width,me.height)
      14. DoLoop()
      15. end sub
      16. 'Wiederholung
      17. sub DoLoop()
      18. do
      19. 'Da mit das Programm ansprechbar Bleibt
      20. application.doevents
      21. 'jetzt erstellen des gitters
      22. DrawGraphics()
      23. Loop
      24. end sub
      25. sub DrawGraphics
      26. For X = 0 to 50
      27. For Y = 0 to 50
      28. R = new Rectangle(X * TileSize, Y * TileSize, TileSize,TileSize)
      29. G.Fillrectangle(brushes.Gray,R)
      30. G.DrawRectangle(pens.Black,R)
      31. next
      32. next
      33. end sub
      34. end Class



      Code nicht getstet und mit Copy and paste bringt er dir nichts am besten Übst du bisel dann Klapt das schon
      @ CrosSLight
      der code ist die hölle!!

      du erstellst eine schleife die das raster unaufhörlich neuzeichnet. damit es nicht hängt/ruckelt nutzt du application doevents? das ist sehhhr schlecht!

      zeichnen nur im paint-event ist die lösung. so wird NUR gezeichnet wenn es erforderlich ist - nicht alle paar millisekunden...

      PS: wozu eigentlich die bitmap BB?? du wolltest mit sicherheit meinen tipp verwirklichen allerdings hat es nicht so wirklich hingehauen^^

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

      Seppi123 schrieb:

      Hat geklappt nach einigen Stunden rumbasteln

      ..und der Nächste wird wieder Rumbasteln, anstatt auf erreichten aufzubauen,wenn du deine Lösung hier nicht
      veröffentlichst.
      Es ist schade das es so viele Fragen mit keiner Lösung gibt.


      Code nicht getstet und mit Copy and paste bringt er dir nichts am besten Übst du bisel dann Klapt das schon

      Lösungsvorschläge sollten Fair sein,es gibt schon unbeabsichtigt genug Fehler. ;)
      Gruß