Wie zeichne Rechteck auf MouseDown / Move c #

8

Ich bin mir nicht ganz sicher, wie man ein Rechteck (nicht ausgefüllt) zeichnet, wenn ich den Mauszeiger nach unten ziehe, während ich mit der linken Maustaste klicke.

Ich habe das bisher

%Vor%

Aber die Probleme, die ich nicht alle Rechtecke anzeigen möchte

    
Burnzy 30.10.2010, 20:04
quelle

4 Antworten

19

Ein Code, der zu Eds korrekter Antwort passt:

%Vor%

Um ein "canevas" zu erhalten, das Doppelpufferung aktiviert hat, damit es nicht flackert, verwenden Sie Projekt + Neues Element hinzufügen, wählen Sie "Klasse" und fügen Sie diesen Code ein:

%Vor%

Kompilieren. Ziehen Sie das neue Steuerelement von der Oberseite der Toolbox auf Ihr Formular und ersetzen Sie die ursprünglichen "Canevas". Aktualisieren Sie die Ereignishandler entsprechend.

    
Hans Passant 30.10.2010, 20:30
quelle
5

Rufen Sie CreateGraphics nicht auf. Speichern Sie in MouseDown die Startposition und ein Flag, um anzuzeigen, dass Sie zeichnen. In MouseMove, überprüfen Sie die Flagge. Wenn Sie zeichnen, erstellen Sie das Rechteck relativ zur Startposition und speichern Sie es (was Sie bereits tun), und rufen Sie dann Invalidate () auf. Ihr gesamter Zeichencode wird in OnPaint () (canvas.Paint von außerhalb der Klasse sein, obwohl ich wahrscheinlich meine eigene Klasse dafür erstellen würde, um zu vermeiden, dass Ihr Formularcode mit diesem Zeug übersät ist).

Das Zeichnen sollte in Ihrem Malprogramm (OnPaint) erfolgen. Wenn Sie darüber hinaus zeichnen, wird Ihr Grafikobjekt nicht gelöscht (daher die mehreren Rechtecke) und alles, was Sie zeichnen, kann / wird zu scheinbar ungleichen Zeiten gelöscht, wenn Ihr Fenster eine WM_PAINT-Nachricht erhält.

EDIT: Nun, da Sie Leistungsprobleme haben, gibt es ein paar einfache Möglichkeiten, um die Malerei ein wenig zu optimieren. Zuerst nimmt Invalidate optional ein Rectangle als Argument, sodass Sie das gesamte Steuerelement nicht neu streichen müssen. Zweitens, wenn Sie auf MouseMove zeichnen, werden Sie ziemlich viel zeichnen. Das Verwenden der doppelten Pufferung wird ebenfalls sehr hilfreich sein. Setzen Sie einfach die DoubleBuffered-Eigenschaft auf true oder fügen Sie sie dem ControlStyles-Wert hinzu, indem Sie SetStyle für das Steuerelement aufrufen.

    
Ed S. 30.10.2010 20:07
quelle
0

Okay, jetzt habe ich das, es funktioniert, aber es flackert viel, sogar mit doppelter Pufferung.

%Vor%

Und dann auf malen

%Vor%     
Burnzy 30.10.2010 20:30
quelle
0
%Vor%

Fügen Sie diesen Code zu Ihrem Formular hinzu. Dies kann das Flackern reduzieren!

    
raghu 17.06.2011 07:44
quelle

Tags und Links