Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Canvas Rectangle mit MouseMove, MouseDown und MouseUp (https://www.delphipraxis.net/51428-canvas-rectangle-mit-mousemove-mousedown-und-mouseup.html)

Nils_13 12. Aug 2005 10:27


Canvas Rectangle mit MouseMove, MouseDown und MouseUp
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ich zeichne ein Viereck wenn ich die Mouse drücke. Wenn ich die Mouse bewege, dann soll das Viereck erweitert werden. Wenn ich die Mouse zurück bewege, passiert ein Grafikfehler: die anderen Rectangles sind noch vorhanden.
1. wie kann ich das beheben ?
2. wie kann ich es Regeln, den Startwert von der MouseDown-Position aus (wie in einem Strategiespiel) festzulegen, damit das Viereck auch von dem gewünschten Punkt aus gezeichnet wird ?

Der bisherige Code:
Delphi-Quellcode:
  private
    { Private-Deklarationen }
    mbdown : Boolean;

{ ... }

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
mbdown := true;
end;

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
mbdown := false;
PaintBox1.Repaint;
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if mbdown = True then
  begin
    PaintBox1.Canvas.Brush.Color := clBlack;
    PaintBox1.Canvas.Brush.Style := bsSolid;
    PaintBox1.Canvas.Pen.Color  := clWhite;
    PaintBox1.Canvas.rectangle(Rect(0,0,x,y));
  end;
end;
Wenn ich PaintBox1.Repaint verwende, dann flackert es.

Khabarakh 12. Aug 2005 11:02

Re: Canvas Rectangle mit MouseMove, MouseDown und MouseUp
 
Zitat:

Zitat von Nils_13
[...], passiert ein Grafikfehler: die anderen Rectangles sind noch vorhanden.

Fehler? Dein Code ist doch korrekt :mrgreen: . Du musst vor dem Zeichnen des nächsten Rechtecks schon das alte wieder löschen, indem du z.B. per Delphi-Referenz durchsuchenFillRect den gesamten Bitmapinhalt löschst.
Um Flimmern zu vermeiden, solltest du mit Hier im Forum suchenOffScreenBitmaps arbeiten.

Zu 2.: Die Position im OnMouseDown speichern :gruebel: ?

Keldorn 12. Aug 2005 13:41

Re: Canvas Rectangle mit MouseMove, MouseDown und MouseUp
 
Verwende bei Zeichnen als penmode pmnotxor. Und schau mal in dein Demo-Verzeichnis, unter Demos/Doc findest du GraphEx, das wird das auch demonstriert.

Mfg Frank

Jarmen_Kell 12. Aug 2005 14:58

Re: Canvas Rectangle mit MouseMove, MouseDown und MouseUp
 
tada
Delphi-Quellcode:
var
  moused:TPoint;
  current:TPoint;

procedure TForm1.PaintBoxMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  moused.x:=x;
  moused.y:=y;
  current.x:=x;
  current.y:=y;
end;

procedure TForm1.PaintBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer); // Alternativ ImageMouseMove o.ä.
begin
  if SSLeft in Shift then imgpaint(pmnotxor,current.X,current.Y);
  current.x:=x;
  current.y:=y;
  if SSLeft in Shift then imgpaint(pmnotxor,current.x,current.y);
end;

procedure TForm1.imgpaint(mode:TPenMode;x,y:Integer);
begin
  PaintBox.canvas.Pen.Mode:=mode; // Wieder Image.Canvas o.ä.
  PaintBox.Canvas.Rectangle(moused.x,moused.y,x,y);
end;
Hat den Vorteil, dass du auch noch ruckzuck andere Sachen wie Dreiecke, Rauten, Striche etc einfügen kannst.

Khabarakh 12. Aug 2005 15:13

Re: Canvas Rectangle mit MouseMove, MouseDown und MouseUp
 
Und was macht ihr beiden, wenn Nils keinen einfarbigen Hintergund hat :wink: ?

Keldorn 12. Aug 2005 15:47

Re: Canvas Rectangle mit MouseMove, MouseDown und MouseUp
 
Zitat:

Zitat von Khabarakh
Und was macht ihr beiden, wenn Nils keinen einfarbigen Hintergund hat :wink: ?

genau das gleiche ;)

Khabarakh 12. Aug 2005 15:49

Re: Canvas Rectangle mit MouseMove, MouseDown und MouseUp
 
Ja, Falschfarbenbilder sind was Schönes :wink: .

Nils_13 12. Aug 2005 18:46

Re: Canvas Rectangle mit MouseMove, MouseDown und MouseUp
 
Das Viereck soll innen Transparent sein.

Keldorn 12. Aug 2005 20:16

Re: Canvas Rectangle mit MouseMove, MouseDown und MouseUp
 
Zitat:

Zitat von Khabarakh
Ja, Falschfarbenbilder sind was Schönes :wink: .

ok, das meinst du. Aber das wirkt sich ja nur auf den Markierungsrahmen aus. Dort finde ich es aber eher praktisch, da du den Rahmen immer sehen wirst. Schwarzer Rahmen auf einem schwarzem Bereich macht sich auch nicht so gut ;).
Man kann statt pmnotxor noch pmnot und unterschiedlichen Farben probieren.
Aber wenns wirklich eine bestimmte Farbe sein soll, dann gehts nur mit Neuzeichnen.

Zitat:

Zitat von Nils_13
Das Viereck soll innen Transparent sein.

das wird es auch sein

Jarmen_Kell 12. Aug 2005 20:26

Re: Canvas Rectangle mit MouseMove, MouseDown und MouseUp
 
"Wir beiden" lassen das einfach so und machen dann nur noch mal beim OnMouseUp

Delphi-Quellcode:
imgpaint(pmcopy,current.x,current.y);
Fertig ist die Wurst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz