Laden...

Gitternetz zeichnen und Mausrechteck im Gitternetz

Erstellt von spike1302 vor 12 Jahren Letzter Beitrag vor 12 Jahren 5.033 Views
Thema geschlossen
S
spike1302 Themenstarter:in
17 Beiträge seit 2011
vor 12 Jahren
Gitternetz zeichnen und Mausrechteck im Gitternetz

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.

S
spike1302 Themenstarter:in
17 Beiträge seit 2011
vor 12 Jahren

Hier das 2. Bild als Anhang:

A
118 Beiträge seit 2009
vor 12 Jahren

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

S
spike1302 Themenstarter:in
17 Beiträge seit 2011
vor 12 Jahren

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ß

49.485 Beiträge seit 2005
vor 12 Jahren

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

Thema geschlossen