Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Paintbox Zeichnung löschen (https://www.delphipraxis.net/74755-paintbox-zeichnung-loeschen.html)

ferby 8. Aug 2006 12:01


Paintbox Zeichnung löschen
 
Hallo,

Ich zeichne auf einen TBitmap und lasse es dann im OnPaint ereignis auf eine TPaintBox Zeichnen.

Meine Frage: Wie bekomme ich die Zeichnung wieder weg???
Wenn ich PaintBox.Visible:=false setze, dann bleibt die Zeichnung noch immer....

Ich nehm mal an ich muss den Inhalt vom Bitmap löschen, aber wie?

Xyres 8. Aug 2006 12:05

Re: Paintbox Zeichnung löschen
 
also ich habe da immer einfach ein rechteck über die ganze zeichenfläche in der hintergrundfarbe gezeichnet. dann ist alles weg ^^.

mfg xyres

ferby 8. Aug 2006 12:10

Re: Paintbox Zeichnung löschen
 
Hallo,

ja die Möglichkeit habe ich auch gesehen,
aber es muss doch eine Möglichkeit geben einfach den Inhalt zu löschen,
ohne ihn zu überzeichnen... oder nicht?


Bzw. Was ist wenn ich den INhalt wirklich nur "unsichtbar" machen will, und nicht löschen, weil ich den Inhalt später noch brauche. Dann kann ich nicht einfach drücber Zeichnen.

Xyres 8. Aug 2006 13:15

Re: Paintbox Zeichnung löschen
 
sry.... da weiß ich jetzt auch nich weiter, dass wird aber sicher nich so einfach sein, denn du musst ja irgendwie dann auf die einzelnen zeichnungen ansprechen können .

oki 8. Aug 2006 13:23

Re: Paintbox Zeichnung löschen
 
Hi,

löschen mit Canvas.Fillrect(Rect) und Hintergrundfarbe. Neu anzeigen mit neu zeichnen; wie beim ersten mal.
"Unsichtbar machen" und neu anzeigen heißt auch nur neu zeichnen.

Gruß oki

ferby 8. Aug 2006 13:48

Re: Paintbox Zeichnung löschen
 
Hallo,

ok wenns anders nicht geht dann mach ich es so.

Habe es jetzt so gelöst

Delphi-Quellcode:
bm.Canvas.Brush.Color:=clblue;
bm.Canvas.Fillrect(bm.Canvas.ClipRect);


bm = TBitmap
clblue = Hintergrundfarbe

mimi 30. Sep 2006 18:02

Re: Paintbox Zeichnung löschen
 
es geht noch anders: einfach die größe der paintbox oder image auf 1,1 setzten und dann wieder zurück *G*

Muetze1 30. Sep 2006 19:46

Re: Paintbox Zeichnung löschen
 
Zitat:

Zitat von ferby
Delphi-Quellcode:
bm.Canvas.Brush.Color:=clblue;
bm.Canvas.Fillrect(bm.Canvas.ClipRect);

Das ist nicht ok - weil ClipRect den neu zu zeichnenden Bereich des Canvas angibt und dieses ist auch öfters kleiner als die Paintbox selber. Z.b. wenn du nur eine Ecke eines Fensters auf deine PaintBox schiebst und dann wieder wegbewegst oder minimierst. Nutze lieber bm.BoundsRect.

beastofchaos 26. Dez 2010 16:11

AW: Paintbox Zeichnung löschen
 
Das Thema ist vll sehr alt, aber das Problem ist das selbe.
Ich arbeite mit Delphi 7 und will für mein MSA-Referat in Informatik (bin Schüler) mit meinem Freund ein Minigolfprogramm bauen.

Mein Ziel ist es, zur Richtung- und Geschwindigkeitsberechnung eine Linie von der Maus zur Kugel zu erzeugen. Bisher hab ich immer mit einem image gearbeitet. Jetzt versuch ich es, wegen besserer Handhabung mit Bitmap und Paintbox. Bei image gab es den Befehl "image.picture:=Nil;". Gibnt es wirklich keinen Befehl heutzutage, der das auch mit einer Bitmap/Paintbos macht?
Hier mal der Quelltext:

Delphi-Quellcode:
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if not Timer1.Enabled then begin
bmp.Canvas.Pen.Color:=ClWhite;
bmp.Canvas.brush.Color:=ClWhite;
bmp.Canvas.MoveTo(trunc(d-PaintBox1.Left),trunc(e-PaintBox1.top));
bmp.Canvas.LineTo(Maus.x,Maus.y);
PaintBox1.Repaint;
bmp.Canvas.Brush.Color:=clBlue;
bmp.Canvas.Pen.Color:=ClBlack;
Maus:=PaintBox1.ScreentoClient(Mouse.CursorPos);
d:=(x1+x2)/2;
e:=(y1+y2)/2;
bmp.Canvas.MoveTo(trunc(d-PaintBox1.Left),trunc(e-PaintBox1.top));
bmp.Canvas.LineTo(Maus.x,Maus.y);
bmp.Canvas.Ellipse(x1,y1,x2,y2);
PaintBox1.Repaint;
end;
end;
Wie ihr seht, übermalt er mit Weiß die alte Linie und berechnet die neue. Leider blinkt die Linie imemr wieder und auch ein kleiner Teil in der Kugel (auch in Paintbox gezeichnet). Die Kugel ist innen Blau und dauernd geht halt ein weißer Strich über eine bestimmte Stelle. Könnt euch das auch mal selbst anschauen, hier eine Zip-Satei mit allen Dateien: http://rapidshare.com/files/439357797/Test.zip

Bummi 26. Dez 2010 16:21

AW: Paintbox Zeichnung löschen
 
Ales was in einer Paintbox gemalt wir wird im OnPaint gemalt, dies ist im Idealfall ein Offscreenbitmap.
Das Malen kann mit Paintbox1.invalidate ausgelöst werden.

beastofchaos 26. Dez 2010 16:28

AW: Paintbox Zeichnung löschen
 
Ich male mit Paintbox1.Repaint statt invalidate und funktioniert ;) Frage ist ja eher, ob es einen Befehl gibt, der vll so aussieht: PaintBox1.Clear;
Wenn ich Paintbox1:=Nil mache, kommt während dem Programm (gleich wenn eine MouseMove-prozedur erzeugt wird) eine Fehlermeldung.

Vll gibt es statt Löschen oder Überzeichnen noch eine Lösung, mit der ich eine einzige akkutalisierende Linie zwischen Linie und Kugel habe.

Bummi 26. Dez 2010 19:01

AW: Paintbox Zeichnung löschen
 
wenn Du invalidate aufrufst und im OnPaint nichts gemalt wird, ist die Paintbox doch leer:?::?:

hathor 26. Dez 2010 19:09

AW: Paintbox Zeichnung löschen
 
Nicht optimiert, aber geht:

Delphi-Quellcode:
Procedure Bmp1Clear;
var i : Integer;
BEGIN
for i:= 0 to bmp1.Width do
BEGIN
 with Bmp1.Canvas do
 Begin
 pen.color:= 0;
 moveto(i,bmp1.Height); lineto(i,0);
 end;
END;
END;

himitsu 26. Dez 2010 19:12

AW: Paintbox Zeichnung löschen
 
Delphi-Referenz durchsuchenTCanvas.FillRect oder Delphi-Referenz durchsuchenTCanvas.Rectangle

beastofchaos 26. Dez 2010 22:14

AW: Paintbox Zeichnung löschen
 
Zitat:

Zitat von himitsu (Beitrag 1070530)

Bei beiden Proceduren muss etwas fehlen. Mein Program hat Problem mit dieser procedure zum Beispiel: "procedure Rectangle(X1, Y1, X2, Y2: Integer); override;". Da fehlt schon noch irgendetwas, oder?


Zitat:

Zitat von hathor (Beitrag 1070529)
Nicht optimiert, aber geht:
Delphi-Quellcode:
Procedure Bmp1Clear;
var i : Integer;
BEGIN
for i:= 0 to bmp1.Width do
BEGIN
 with Bmp1.Canvas do
 Begin
 pen.color:= 0;
 moveto(i,bmp1.Height); lineto(i,0);
 end;
END;
END;

Ist die Farbe 0 = Durchsichtig oder weiß? weil Übermalen hatten wir schon und statt der for-Schleife und Linienerzeugen, kann man auch einfach ein Rectangle zeichnen von oben links bis unten rechts ;)

beastofchaos 26. Dez 2010 22:25

AW: Paintbox Zeichnung löschen
 
Zitat:

Zitat von Bummi (Beitrag 1070527)
wenn Du invalidate aufrufst und im OnPaint nichts gemalt wird, ist die Paintbox doch leer:?::?:

Mein Problem liegt wirklich zwischen/in den Ohren(hier wohl eher in den Augen) xD Ich dachte invalidate ist ein andere Befehl für Repaint... Hab mal bei leo.org invalidate nachgeguckt und versteh, dass es es annulliert ;)



edit1: So Leute, saß heute 5 Stunden dran und habs nicht hinbekommen. War den ganzen Abend weg, komm wieder und es funktioniert. Weiß auch wie jetzt :p
In meinem MouseMove-Ereignis hat er ja erst die alte Linie übermalt "Repaint" ausgeführt. die neue gezeichnet und nochmal "Repaint" gemacht. Wenn ich das erste weglasse, ist auch das Blinken weg. Ich brauche nämlich einfach nur in der Bitmap die alte Linie übermalen ( nicht in der Paintbox zusätzlich, da die sowieso jedesmal die Bitmap neuzeichnet ).

hathor 27. Dez 2010 07:15

AW: Paintbox Zeichnung löschen
 
Zitat:

Zitat von beastofchaos (Beitrag 1070549)
...Ist die Farbe 0 = Durchsichtig oder weiß? weil Übermalen hatten wir schon und statt der for-Schleife und Linienerzeugen, kann man auch einfach ein Rectangle zeichnen von oben links bis unten rechts ;)

clBlack = 0

Ich habe das einfach aus einem Programm von mir herauskopiert und da passt es - denn Rectangle oder was anderes würde den ganzen Bereich übermalen...

beastofchaos 27. Dez 2010 09:00

AW: Paintbox Zeichnung löschen
 
Zitat:

Zitat von hathor (Beitrag 1070562)
Zitat:

Zitat von beastofchaos (Beitrag 1070549)
...Ist die Farbe 0 = Durchsichtig oder weiß? weil Übermalen hatten wir schon und statt der for-Schleife und Linienerzeugen, kann man auch einfach ein Rectangle zeichnen von oben links bis unten rechts ;)

clBlack = 0

Ich habe das einfach aus einem Programm von mir herauskopiert und da passt es - denn Rectangle oder was anderes würde den ganzen Bereich übermalen...

Du malst doch auch in deinem Programm alles, bloß malst du einzelne Linien. Ich mach das ganze halt mit Rectangle -> Ergebnis ist doch das gleiche ;)
Und da mein Hintergrund weiß ist, hiflt mir schwarz an der Stelle wenig. Lieber ClWhite xD

hathor 27. Dez 2010 09:19

AW: Paintbox Zeichnung löschen
 
bmp1.Width und bmp1.Height habe ich nachträglich eingefügt - im Original steht bei mir was anderes...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:57 Uhr.

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