![]() |
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 |
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 |
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.
|
Hallo Haegar
probier mal die API-Funktion BitBlt. Der Aufruf müsste ungefähr so gehen:
Delphi-Quellcode:
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
BitBlt(Canvas.Handle, Canvas.Left, Canvas.Top, Image.Width, Image.Heigth, Image.Handle, altx, alty, SCRINVERT);
|
wie versteh ich das mit dem canvas.handle??
was soll denn da hin? ausserdem kennt er dieses SCRINVERT nicht!? |
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. |
und das image.handle...mit image ist dann das zu zeichnende object gemeint???
|
Genau!
|
aha, und was mach ich wenn das ne eigene klasse vom typ TObject abgleitet is??
|
Dieses Object muss ja ein Canvas haben auf dem es zeichnet. Dieses Canvas
hat ein Handle, dass du angeben musst. |
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:
muss ich denn irgendwie noch eine handle prozedur oder so in der eigenen klasse erwähnen??
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; *verzweifeln tu* :nerd: gruss haegar |
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.
|
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?? |
Das kann eigentlich nicht sein. Schick mir mal den Quelltext als e-mail. Dann schau ich mir das mal an.
|
getätigt
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15: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