Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi canvasobject..alte position löschen (https://www.delphipraxis.net/3145-canvasobject-alte-position-loeschen.html)

Haegar 25. Feb 2003 19:49


canvasobject..alte position löschen
 
hallo,

ich habe ein image...den hinterhrund lade ich aus einer
*.bmp-datei. jetzt bewege ich in object auf dem Canvas der image-komponente! das problem.....das canvas wird zwar immer schön neu gezeichnet (position ändert sich), doch muss ich ja auch die alte position löschen, wie mach ich das denn?? (also so das dann wieder der hintergrund zu sehen ist)

gruss haegar

Haegar 25. Feb 2003 21:47

mal ne idee von mir, umsetzen is ja ne andere sache :D

is vielleicht nicht grad originell, aber vielleicht ne temporäre lösung!
- dort wo objekt gezeichnet wird vorher ausschnitt vom hintergrundbild kopieren (selbe größe wie objekt)
-nach weiterbewegen des objektes, die kopie wieder einfügen.

was sagt ihr dazu??
:roll:

grus haegar

nailor 25. Feb 2003 22:34

Richtig, sag ich da. Jetzt ist nur die Frage, ob man nicht schlauer grade den ganzen Hintergrund nimmt, oder ob man nicht einfach zwei Images übereinander legen sollte, wodurch Delphi die Sache von alleine macht.

lodda 26. Feb 2003 09:50

Hallo Haegar
probier mal die API-Funktion BitBlt.
Der Aufruf müsste ungefähr so gehen:

Delphi-Quellcode:
BitBlt(Canvas.Handle, Canvas.Left, Canvas.Top, Image.Width, Image.Heigth, Image.Handle, altx, alty, SCRINVERT);
Canvas ist in dem Fall die Zeichenfläche auf die du zeichnen willst, altx und alty sind die alten Koordinaten. Der Parameter SCRINVERT sorgt für einen XORPut. Wenn du das Bild mit der Funktion auf den Hintergrund kopiert hast, dann müsste beim zweiten mal drüberkopieren wieder das ursprüngliche Hintergrundbild rauskommen

Haegar 26. Feb 2003 11:00

wie versteh ich das mit dem canvas.handle??
was soll denn da hin?
ausserdem kennt er dieses SCRINVERT nicht!?

lodda 26. Feb 2003 11:21

1.) Wie schon gesagt, Canvas ist die Zeichenfläche auf die du zeichnen willst. Also entweder direkt auf das Formular mit Form1.Canvas.Handle oder auf ein zweites Image. Also z.B BackGroundImage.canvas.Handle
2.) :oops: hab mich verschrieben es muss SRCINVERT heißen.

Haegar 26. Feb 2003 11:44

und das image.handle...mit image ist dann das zu zeichnende object gemeint???

lodda 26. Feb 2003 11:56

Genau!

Haegar 26. Feb 2003 11:59

aha, und was mach ich wenn das ne eigene klasse vom typ TObject abgleitet is??

lodda 26. Feb 2003 14:57

Dieses Object muss ja ein Canvas haben auf dem es zeichnet. Dieses Canvas
hat ein Handle, dass du angeben musst.

Haegar 26. Feb 2003 15:17

hmm..naja, so ganz hab ich das noch nicht gepackt - also hier mal was ich alles benutze:
-ein Image (image1) auf Form1
-eine Klasse (TAuto=class(TObject))
-ne Variable (auto1:Tauto)
-den Befehl: BitBlt(Canvas.Handle, Canvas.Left, Canvas.Top, Image.Width, Image.Heigth, Image.Handle, altx, alty, SCRINVERT);
da kommt rein (reihenfolge wie befehl):
Form1.image1.canvas.handle,0,0,40,20,.....,auto1.x ,
auto1.y,SRCINVERT

tja wenn ich nu auto1.handle dahin schreibe, meckert er rum.

vielleicht mal die Klasse aus unit auto;
Delphi-Quellcode:
type TAuto=class(TObject)
  private
  public
   v:Single;             //Geschwindigkeit
   x, y:integer;         //Position
   farbe:longint;        //Lackierung
   constructor erzeugen(xpos,ypos:integer; color:longint);
   procedure schneller(dv:real);
   procedure bremsen (dv:real);
   procedure zeichnen(canvas:TCanvas); //noch drehung/Lenkung
 end;
muss ich denn irgendwie noch eine handle prozedur oder so in der eigenen klasse erwähnen??
*verzweifeln tu* :nerd:

gruss haegar

lodda 26. Feb 2003 15:28

Jetzt versteh ich dein Problem. Also wenn du die Funktion BitBlt nehmen willst, dann musst du in deinen privat-Teil noch eine TCanvaskomponente einfügen. Auf diese musst du dann zeichnen. Das fertig gezeichnete Object kannst du dann mit der BitBlt-Funktion auf dein Image kopieren.

Haegar 26. Feb 2003 15:40

sry, ich schon wieder :))
jetzt hab ich nur das problem, das ich das auto net mehr sehe! kann das sein, das das zu malende image jetzt hinter dem hintergrundbild ist??

lodda 26. Feb 2003 15:52

Das kann eigentlich nicht sein. Schick mir mal den Quelltext als e-mail. Dann schau ich mir das mal an.

Haegar 26. Feb 2003 16:04

getätigt


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:37 Uhr.

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