vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Zufällige Rechtecke im Control ausmalen 
Autor: keco
Datum: 20.09.08 15:45

Hallo,

ich habe ein Control, welches mir ein kariertes Feld zeichnet. Die Größe der zu zeichnenden Felder kann ich auch individuell bestimmen. Jetzt habe ich es so gemacht, dass wenn ich auf eines dieser Felder klicke das gesamte Feld ausgefüllt wird, also mit einer anderen Farbe übermalt wird. Entsprechende Funktionen habe ich alles schon fertig. Jetzt möchte ich aber zufällig einige Felder ausmalen lassen, also ohne, dass ich vorher darauf klicken muss.

Hier erstmal der Code, wie ich den habe:
   Private Function GetFieldIndex(ByVal x As Integer, ByVal y As Integer) As _
     Integer
      ' Errechnet den Index des Feldes (von links nach rechts)
      Return (Me.Width \ FieldSize.Width) * (GetLineFromField(y) - 1) + _
        GetColumnFromField(x) - 1
   End Function
 
   Private Function GetFieldPosition(ByVal x As Integer, ByVal y As Integer) As _
     Point
      ' Errechnet aus den X- und Y-Koordinaten die Zeilen- und Spaltennummer
      Return New Point(GetColumnFromField(x), GetLineFromField(y))
   End Function
 
   Private Function GetFieldRectangle(ByVal x As Integer, ByVal y As Integer) _
     As Rectangle
      ' Errechnet aus der X- und Y-Koordinate das entsprechende Rechteck
      Dim width As Integer = FieldSize.Width - 1
      Dim height As Integer = FieldSize.Height - 1
 
      Return New Rectangle((x \ FieldSize.Width) * FieldSize.Width, (y \ _
        FieldSize.Height) * FieldSize.Height, width, height)
   End Function
 
   Private Function GetFieldRectangle(ByVal FieldPosition As Point) As Rectangle
      ' Errechnet aus der Zeilen- und Spaltennummer das entsprechende Rechteck
      Dim width As Integer = FieldSize.Width - 1
      Dim height As Integer = FieldSize.Height - 1
 
      ' X und Y Koordinaten mit 1 subtrahieren, damit das Raster nicht 
      ' überzeichnet wird
      Return New Rectangle((FieldPosition.X - 1) * FieldSize.Width, ( _
        FieldPosition.Y - 1) * FieldSize.Height, width, height)
   End Function
 
   Private Function GetColumnFromField(ByVal x As Integer) As Integer
      ' Spalte berechnen und mit 1 addieren (verhindert null-basierte Spalte)
      Return x \ FieldSize.Width + 1
   End Function
 
   Private Function GetLineFromField(ByVal y As Integer) As Integer
      ' Zeile berechnen und mit 1 addieren (verhindert null-basierte Zeile)
      Return y \ FieldSize.Height + 1
   End Function
 
   Private Sub Field_Paint(ByVal sender As System.Object, ByVal e As _
     System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
      ' Berechne, wie viele vertikalen Linien gezeichnet werden können
      For i As Integer = 0 To Me.Width \ FieldSize.Width
         ' Vertikale Linie zeichnen
         e.Graphics.DrawLine(New Pen(pLineColor), i * FieldSize.Width - 1, 0, i _
           * FieldSize.Width - 1, Me.Height)
      Next
 
      ' Berechne, wie viele horizontalen Linien gezeichnet werden können
      For i As Integer = 0 To Me.Height \ FieldSize.Height
         ' Horizontale Linie zeichnen
         e.Graphics.DrawLine(New Pen(pLineColor), 0, i * FieldSize.Height - 1, _
           Me.Width, i * FieldSize.Height - 1)
      Next
 
      ' Anzahl der Einheiten (Felder) zeichnen
      For i As Integer = 0 To pUnits.Length - 1
         ' Rechteck zum ausfüllen berechnen und zeichnen
         e.Graphics.FillRectangle(New SolidBrush(pUnits(i).Color), _
           GetFieldRectangle(pUnits(i).Position))
      Next
   End Sub
 
   Private Sub Field_MouseClick(ByVal sender As System.Object, ByVal e As _
     System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseClick
      ' Überprüfe, ob jede Einheit (Feld) im Array gezeichnet wurde
      If pUnitsSet < pUnits.Length Then
         ' Wenn nicht, dann die Position für nächste Einheit (Feld) festlegen
         pUnits(pUnitsSet).Position = GetFieldPosition(e.X, e.Y)
         ' Zähler um 1 erhöhen
         pUnitsSet += 1
 
         ' Zu zeichnendes Rechteck neuzeichnen lassen
         Me.Invalidate(New Region(GetFieldRectangle(e.X, e.Y)))
      End If
   End Sub
Dabei ist pUnit ein Array von Objekten vom Typ Unit. Diese beinhalten eine Eigenschaft Position, welches die Zeilen- und Spaltennummer beinhaltet, wo dieses gezeichnet werden soll und eine Eigenschaft Color, die die entsprechende Farbe beinhaltet. Color ist hierbei aber unwichtig.

Wie kann ich also nun nach Zufallsprinzip diese Felder zeichnen lassen? Allerdings soll es nur auf der linken Hälfte des gesamten Controls passieren! Ich brauche also eine Funktion, die die Felder auf der linken Hälfte des Controls nach Zufallsprinzip ausmalt. Dabei kann die Anzahl aber variieren, also die Größe des Arrays pUnits. Vielleicht sollte die Funktion auch überprüfen, ob überhaupt soviele freie Felder dafür vorhanden sind. Bei Bedarf kann ich das Control auch in ein neues Projekt packen und als Archiv irgendwo hochladen (wobei das hier schon fast alle Methoden sind).

Danke schonmal
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Zufällige Rechtecke im Control ausmalen1.526keco20.09.08 15:45
Re: Zufällige Rechtecke im Control ausmalen720errt20.09.08 16:54
Re: Zufällige Rechtecke im Control ausmalen825keco20.09.08 17:08
Re: Zufällige Rechtecke im Control ausmalen740FlyingEagleLW20.09.08 18:40
Re: Zufällige Rechtecke im Control ausmalen758keco20.09.08 19:30
Re: Zufällige Rechtecke im Control ausmalen699keco20.09.08 19:44
Re: Zufällige Rechtecke im Control ausmalen1.102errt20.09.08 20:42
Re: Zufällige Rechtecke im Control ausmalen687keco20.09.08 20:45
Re: Zufällige Rechtecke im Control ausmalen829keco20.09.08 22:48
Lösung: Zufällige Rechtecke im Control ausmalen708keco20.09.08 23:22
Re: Lösung: Zufällige Rechtecke im Control ausmalen698FlyingEagleLW21.09.08 02:07
Re: Lösung: Zufällige Rechtecke im Control ausmalen689keco21.09.08 13:31
Re: Lösung: Zufällige Rechtecke im Control ausmalen682FlyingEagleLW21.09.08 14:32

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel