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.
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.