Autor Beitrag
FatalError
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64

WIN ME
D6 Pers
BeitragVerfasst: Sa 20.12.03 16:14 
Hi,

wenn in Image-Fenstern schnell hintereinander z.B über eine Timer-procedure immer neue Kreise od.Linien eingezeichnet werden, kommt es bei mir immer zu "flimmern" des images, d.h. man sieht z.B. auf schwarzem Himtergrund immer wieder kurz graue Streifen.

Wie kann man das verhindern?

Grüße
Andy :wink:

p.S.hat nichts mit besoffensein zu tun :lol:
Gandalfus
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 129



BeitragVerfasst: Sa 20.12.03 17:19 
Backpuffer

_________________
Wennn man feststellt, dass es drei Moeglichkeiten gibt, die einen Vorgang schiefgehen lassen koennen und man diese ausschaltet, entstehen automatisch drei neue Moeglichkeiten.
FatalError Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64

WIN ME
D6 Pers
BeitragVerfasst: Sa 20.12.03 18:19 
danke :D mal sehen ob ichs hinbekomme..


Andere Frage:

warum bekomme ich mit diesem Code(unten) automatisch einen weißen Hintergrund?
Wie kann ich den Rest des images (um den Kreis herum) durchsichtig erscheinen lassen?


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
begin with image1.canvas do
        begin
          Brush.Color:=clgreen;
          Ellipse(40,100,0,60);
        end;


Grüße
Andy
StefanH
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1144

Win XP
D5 Standard, D7 Pers, D2005 Pers
BeitragVerfasst: Sa 20.12.03 18:25 
wie wärs mit Image1.Transparent???

_________________
"Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
FatalError Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64

WIN ME
D6 Pers
BeitragVerfasst: Sa 20.12.03 19:21 
Hi,

danke,genau was ich suchte aber nicht fand :D

Zum Backpuffer:

was genau macht diese Codezeile? Versteh ich irgendwie nicht :roll: Kann mir das jemand erklären?

ausblenden Delphi-Quelltext
1:
BitBlt(backpuffer.canvas.handle,50,50,105,105,image1.Canvas.handle,0,0,srccopy);					


Gruß
Andy
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Sa 20.12.03 20:48 
FatalError hat folgendes geschrieben:
was genau macht diese Codezeile? Versteh ich irgendwie nicht :roll: Kann mir das jemand erklären?
ausblenden Delphi-Quelltext
1:
BitBlt(backpuffer.canvas.handle,50,50,105,105,image1.Canvas.handle,0,0,srccopy);					

Das ist eine Funktion aus der Windows-API. Sie kopiert (verhältnismäßig schnell) zwei Bilder ineinander (macht praktisch das, was Canvas.Draw() auch macht). Der erste Parameter ist das Handle des Zieles (der Backpuffer). Dann folgen X, Y Breite und Höhe und das Handle der Quelle (das Image). Dann kommen die X- und Y-Koordinaten des Fensters, daß aus der Quelle kopiert werden soll (wenn man nicht das ganze Bild kopieren will). Zum Schluß der Kopiermodes, in diesem Fall einfaches Überschreiben mit den Daten der Quelle.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Gandalfus
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 129



BeitragVerfasst: Sa 20.12.03 20:59 
alles zeichnen erfolgt auf einem Hintegrund bild

ausblenden Delphi-Quelltext
1:
2:
var 
  backpuffer: TBitmap


das bild muss noch erstellt werden:

ausblenden Delphi-Quelltext
1:
2:
3:
backpuffer := TBitmap.create;
backpuffer.width := XXX; 
backpuffer.height := XXXX:


alle zeichen operationen erfolgen jetzt auf diesem backbild

z.B.: Backpuffer.canvas.pixels[10,10] :)= clred;

noch abschluss aller zeichen operationen wird das gesamte bild auf den BIldschirm(Formular) kopiert

ausblenden Delphi-Quelltext
1:
BitBlt(Form1.canvas.handle,0 ,0 ,backpuffer.width ,backpuffer.height ,backpuffer.Canvas.handle,0,0,srccopy)					


zum besseren verständnis der BitBlt Funktion:
BitBlt(Handle des Zieles,XPosition,YPosition,Breite,Höhe,Handle der Quelle,Position des Ausschnits der kopiert werden sollX,Y,Modus in dem kopiert wird{normal ist srccopy});

_________________
Wennn man feststellt, dass es drei Moeglichkeiten gibt, die einen Vorgang schiefgehen lassen koennen und man diese ausschaltet, entstehen automatisch drei neue Moeglichkeiten.
FatalError Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64

WIN ME
D6 Pers
BeitragVerfasst: Sa 20.12.03 23:15 
Hi,

thks für die Erklärungen, klappt schon, das meiste...

zwei Fragen noch:

1. Wie kann man jedesmal auf einer neuen Grundlage zeichen(neues Canvas?)
Gibt es sowas wie Clrscr (clearscreen) in Pascal auch in Delphi?

2.wie kann man das mit Operationen (ellipse, rectangle, etc.) auf dem Canvas erzeugte Bild pixelweise abspeichern?
Ich will jeweils das letzte Bild als Backpuffer für das nächste nehmen...

Grüße
Andy :lol: