Registriert seit: 22. Dez 2009
5 Beiträge
|
Polygon ziehen
30. Dez 2009, 05:55
Guten Morgen,
ja Probleme sind gelöst, das hier kann jetzt jeder verwenden, der ein Vieleck, wie MS-Paint zeichnen möchte...
hier sind die relevanten Codeauschnitte:
Delphi-Quellcode:
private
var Zeichenart : Integer; // damit das Programm weiß welcher button grade geklickt ist
Stiftart : TPenStyle; // Speichert die Stiftart zwischen
Pinselart : TBrushStyle; // Speichert die Brushart zwischen
Zeichnen : Boolean; // legt fest ob bei Mausbewegung gezeichnet werden soll
Stiftfarbe,Pinselfarbe : TColor; // Farbe von Pinsel(Ausfüllen) und Stift
x0,y0,x1,y1 : Integer; // ist für das Zeichnen wichtig (x,y Positionen)
...
Anfangen : boolean; // für Vielecke zeichnen wichtig
Punktezahl : integer; // für Vielecke zeichnen wichtig
Punkte : array[0..100] of TPoint; // für Vielecke zeichnen wichtig (theoretisch bis zu einem 100-Eck, ist so gewählt, damit es nie passieren wird, da 100-eck sehr unwahrscheinlich ist
Punkt : TPoint; // zum Auslesen eines Punktes aus dem Array nötig, da man die Koordinaten nicht direkt bekommt
Punktezeichnen : array of TPoint; // dynamisches Array ist notwendig fürs Vieleck zeichnen
Delphi-Quellcode:
procedure TForm2.SpeedButton25Click(Sender: TObject); // Vieleck
begin
Speedbutton25.Down; // Button soll unten bleiben beim Drücken
Zeichenart := 10; // legt die Zeichenart fest
Unsichtbar; // Labels und Editfleder unsichtbar machen
end;
Delphi-Quellcode:
procedure TForm2.Image1MouseDown(Sender: TObject; Button: TMouseButton; // Wenn man die Maus über Image1 drückt
Shift: TShiftState; X, Y: Integer);
var i,j : integer; // Lokale Zählvariablen
begin
x := round(x/Zoomfaktor); // wenn das Bild gezoomt ist müssen die Koordinaten entsprechend angepasst werden
y := round(y/Zoomfaktor); // wenn nicht, dann ist der Faktor = 1
Zeichnen := true; // Es soll gezeichnet werden
x0 := x; y0 := y; x1 := x; y1 := y; // X- und Y-Werte merken
with Image1.Canvas do // Verkürzung
begin
Pen.Color := Stiftfarbe; // Pinselfarbe, Style usw übergeben
Pen.Style := Stiftart;
Brush.Color := Pinselfarbe;
Brush.Style := Pinselart;
case Zeichenart of // if Abfrage mit sehr vielen Möglichkeiten (welche Zeichenart?)
// zeichenmodus für die einzelenn Zeichenarten festlegen
...
10: begin
Pen.Mode := pmNotXor; // Vielecke ( Mode = mit Pixeln verknüpfen)
if Anfangen = false then
begin
Punkt := Punkte[Punktezahl]; // letzten Punkt auslesen
x0:= Punkt.X; // x und y-Wert des letzten Punktes auslesen
y0:= Punkt.Y;
Moveto(x0,y0);
Lineto(x,y);
end;
end;
...
Delphi-Quellcode:
procedure TForm2.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, // wenn man die Maus über Image1 bewegt
Y: Integer);
var i,j : integer; // Lokale Zählvariablen
begin
x := round(x/Zoomfaktor); // wenn das Bild gezoomt ist müssen die Koordinaten entsprechend angepasst werden
y := round(y/Zoomfaktor); // wenn nicht, dann ist der Faktor = 1
if Zeichnen then
begin
with Image1.Canvas do
begin
case Zeichenart of // if Abfrage mit sehr vielen Möglichkeiten (wie soll gezeichnet werden?)
...
10: begin // Vieleck
Moveto(x0,y0); // Es wird mit den alten werden gelöscht (durch erneutes Zeichnen)
Lineto(x1,y1);
Moveto(x0,y0); // Es wird mit den neuen Werten gezeichnet
Lineto(x,y);
end;
...
Delphi-Quellcode:
procedure TForm2.Image1MouseUp(Sender: TObject; Button: TMouseButton; // wenn man die Maustaste über Image1 wieder loslässt
Shift: TShiftState; X, Y: Integer);
begin
x := round(x/Zoomfaktor); // wenn das Bild gezoomt ist müssen die Koordinaten entsprechend angepasst werden
y := round(y/Zoomfaktor); // wenn nicht, dann ist der Faktor = 1
Zeichnen := false; // nachdem die Maustaste losgelassen wurde soll nicht mehr gezeichnet werden
with Image1.Canvas do //mit Image1.Canvas tue..
begin
Pen.Mode := pmCopy; // das, was nun gezeichnet wird, soll auf Image1 überschrieben werden
case Zeichenart of // fragt ab, wie gezeichnet werden soll
...
10: begin // Vieleck
if Anfangen then // wenn man beginnt das Vieleck zu zeichnen (in dem Moment ist es dasselbe, wie ein Linie ziehen)
begin
Moveto(x0,y0); // Es wird mit den alten werden gelöscht (durch erneutes Zeichnen)
Lineto(x1,y1);
Moveto(x0,y0); // Es wird mit den neuen Werten gezeichnet
Lineto(x,y);
Anfangen := false; // Erste Linie ist gezogen
Punkte := Point(x0,y0); // Ursprungspunkt speichern
Punktezahl := Punktezahl + 1; // jetzt gibt es einen Punkt mehr
Punkte[Punktezahl] := Point(x,y); // letzten Punkt abspeichern
end else
begin
Moveto(x0,y0); // Es wird mit den alten werden gelöscht (durch erneutes Zeichnen)
Lineto(x1,y1);
Moveto(x0,y0); // Es wird mit den neuen Werten gezeichnet
Lineto(x,y);
Punktezahl := Punktezahl + 1; // jetzt gibt es einen Punkt mehr
Punkte[Punktezahl] := Point(x,y); // letzten Punkt abspeichern
end;
end;
...
Delphi-Quellcode:
procedure TForm2.Image1DblClick(Sender: TObject); // Beim Doppelklick
var i :integer;
begin
if Zeichenart = 10 then // wenn ein Vieleck gezeichnet wird
begin
Lineto(x0,y0); // Letzte Linie, die durch den Doppelklich entstanden ist löschen
// es ist immernoch pmNotXor aktiv
setLength(Punktezeichnen, (Punktezahl)); // Dynamisches Array wird auf die richtige Länge gesetzt
for i := 0 to Punktezahl - 1 do
begin
Punktezeichnen[i] := Punkte[i];
end;
with Image1.Canvas do // Verkürzung
begin
Pen.Mode := pmCopy; // jetzt fest zeichnen
Pen.Color := Stiftfarbe; // Pinselfarbe, Style usw übergeben
Pen.Style := Stiftart;
Brush.Color := Pinselfarbe;
Brush.Style := Pinselart;
Polygon(Punktezeichnen);
Anfangen := true;
Punktezahl := 0;
end;
end;
end;
mfg
Alex
//edit1: ein Fehler gefunden selten dämlich, aber der übrige ist mir leider komplett schleierhaft
// edit2: code geupdatet genauso verwende ich ihn
// edit3: code geupdatet
//edit4: so funktioniert es jetzt, wie es soll sorry das ich hier nen beitrag schreibe und es dann kurze zeit später selber gelöst bekomme...
und weiter
|