Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Gitternetz zeichnen und Mausrechteck im Gitternetz
spike1302
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

Gitternetz zeichnen und Mausrechteck im Gitternetz

beantworten | zitieren | melden

Hallo Community,

ich hätte eine Frage bezüglich des zeichnens eines Gitternetzes inkl., dass wenn man mit der Maus über die Felder fährt, dass sich ein weiteres Quadrat sichtbar macht.
Soweit habe ich das alle schon hinbekommen:
(Siehe Anhang)
Gitternetz:
das Gitternetz zeichne ich so auf:

public void zeichne_gitter(bool yesno)
        {
            Graphics g = this.CreateGraphics(); 
            Pen blackPen = new Pen(Color.Black, 1);
            Pen backColor = new Pen(BackColor, 1);

            if (yesno)
            {
                //Zeichne Horizontal (X) ->In Spalten nach unten
                for (int i = 0; i ≤ this.ClientSize.Height; i += gGr) g.DrawLine(blackPen, 0, i, this.ClientSize.Width, i);

                //Zeichne Vertikal (Y) ->In Spalten nach rechts
                for (int i = 0; i ≤ this.ClientSize.Width; i += gGr) g.DrawLine(blackPen, i, 0, i, this.ClientSize.Height);
            }
            else
            {
                //Lösche Horizontal (X) ->In Spalten nach unten
                for (int i = 0; i ≤ this.ClientSize.Height; i += gGr) g.DrawLine(backColor, 0, i, this.ClientSize.Width, i);

                //Lösche Vertikal (Y) ->In Spalten nach rechts
                for (int i = 0; i ≤ this.ClientSize.Width; i += gGr) g.DrawLine(backColor, i, 0, i, this.ClientSize.Height);
            }
        }

Wie würdet ihr das Gitternetz wieder löschen?
Ich habe es so gelöst, dass ich mit meiner BackColor Farbe einfach wieder drüber male.
Doch ist das auch sauber? Ist das zu Performancelastig? Würdet ihr es anders machen?


Mausquadrat im Gitternetz: (Da wo sich die Mausbefindet)

Dort Frage ich per Mouseover ab wo sich die Mausbefindet und mache
(X / Kästchengröße) * Kästchengröße+1 [k](+1 damit es nicht auf dem Gitternetz ist)[/k].

Das funktioniert auch ganz gut. Ist diese Methode ok so? Ist das zu Performancelastig? Würdet ihr es anders machen?

private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
                Graphics g = this.CreateGraphics();
                Pen bluePen = new Pen(Color.Blue, 1);
                Pen backColor = new Pen(BackColor, 1);
                bluePen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;

               //Lösche altes Mausrechteck
                if ((this.PointToClient(Cursor.Position).X / gGr) != (altMouseX / gGr) || (this.PointToClient(Cursor.Position).Y / gGr) != (altMouseY / gGr))
                {
                    g.DrawRectangle(backColor, (altMouseX / gGr) * gGr+1, (altMouseY / gGr) * gGr+1, gGr - 2, gGr - 2);
                }

                g.DrawRectangle(bluePen, (this.PointToClient(Cursor.Position).X / gGr) * gGr+1, (this.PointToClient(Cursor.Position).Y / gGr) * gGr+1, gGr - 2, gGr - 2);

                altMouseX = this.PointToClient(Cursor.Position).X;
                altMouseY = this.PointToClient(Cursor.Position).Y;
        }

Jetzt zu einem Problem und zwar dem löschen des blauen Quadrates, wenn ich in einem anderen Quadrat bin.
Da habe ich mir immer die alte Mausposition in eine Variable gespeichert und zu gebinn eines MouseMove gefragt, ob die alte Mauskoordinaten mit den jetztigen unterschiedlich sind und dann wieder per backColor das alte blaue Quadrat überschrieben.

Das funktioniert auch, doch sobald ich die Maus etwas schneller bewege, bleiben mehrere blaue Kästchen im Gitternetz. Dies passiert aber nicht immer.
(Siehe Poste 2->Anhang)


Ich hoffe ihr könnt mir helfen und mich evetuell noch zahlreiche Tipps geben, wie ich es anders, besser lösen kann.

Danke.

Viele Grüße.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von spike1302 am .
Attachments
private Nachricht | Beiträge des Benutzers
spike1302
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

Hier das 2. Bild als Anhang:
Attachments
private Nachricht | Beiträge des Benutzers
Aratar
myCSharp.de - Member



Dabei seit:
Beiträge: 126

beantworten | zitieren | melden

Hallo,

Du solltest dir vielleicht erstmals folgende Artikel durchlesen:

[FAQ] Flackernde Controls vermeiden / Schnelles, flackerfreies Zeichnen
Zeichnen in Windows-Programmen

Da wirst du auch sehen, dass man nicht this.CreateGraphics verwenden sollte, sondern in der OnPaint-Methode zeichnen sollte.
So löst sich schon mal dein Problem mit dem Übermalen mit der Hintergrundfarbe.

Mfg
Aratar
private Nachricht | Beiträge des Benutzers
spike1302
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

Hallo,
danke für die Links.
Doch das sieht wirklich sehr kompliziert aus und versteh tu ich den code auch nicht so auf Anhieb.
Vorher hatte ich 2-3Befehle und nun habe ich x verschiedene Klassen/unterklassen etc.

Ich versuch mich mal durchzufuchsen und hoffe auf ein Erfolgserlebnis.


Gruß
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo spike1302,

du brauchst nur eine Klasse, die für das Form. Auch die Menge an Code wird sich kaum ändern. Du musst dich nur auf die beschriebene Vorgehensweise einlassen. Wenn du das tust, ist nichts kompliziertes dran.

herbivore
private Nachricht | Beiträge des Benutzers