AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Canvas aktualisieren ohne flackern

Canvas aktualisieren ohne flackern

Ein Thema von Frühlingsrolle · begonnen am 2. Dez 2019 · letzter Beitrag vom 4. Dez 2019
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49565
268 Beiträge
 
Delphi 2009 Professional
 
#11

AW: Canvas aktualisieren ohne flackern

  Alt 3. Dez 2019, 10:51
Nur so als Idee: Hast du schon mal geprüft, wie viele OnPaint-Ereignisse o. ä. da einprasseln und etwas neuzeichnen wollen ?
Bastel dir doch mal einen Message-Handler und logge mal mit (z.B. in ein Memo schreiben).
Ich hatte das neulich mal beim sortieren einer Listbox per Maus - da kamen ewig viele Mausereignisse, die alle was machen wollten.... das unwichtige geblockt und schon war Ruhe im Karton
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: Region Bern CH
328 Beiträge
 
Delphi 10.3 Rio
 
#12

AW: Canvas aktualisieren ohne flackern

  Alt 3. Dez 2019, 11:21
Dein Code unter #1 flackert, weil du in Einzelschritten immer direkt auf den Canvas malst.

Nimm wie bereits vorgeschlagen wurde eine BitMap und zeichne im Hintergrund.

Deine Komponente malt die Uhr in verschiedenen Prozeduren. Spendiere deiner Komponente deshalb nicht nur eine sondern zwei Bitmaps B1 (wird fürs Malen im Hintergrund verwendet) und B2 (enthält immer die fertige Uhr).

Wenn der Timer ausgelöst wird, malst du die Uhr neu; dabei zeichnest du in B1. Sobald die Uhr fertig gemalt ist, kopierst du B1 in B2.

In DoPaint gibst du ausschliesslich B2 aus - sonst machst du dort nix.

Dann wird nix flackern.

(Nebenbei: Mit Firemonkey oder in der VCL mit https://github.com/graphics32 sieht deine Uhr eventuell schöner aus.)
Michael Gasser

Geändert von Michael II ( 3. Dez 2019 um 11:25 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.501 Beiträge
 
Delphi 2007 Enterprise
 
#13

AW: Canvas aktualisieren ohne flackern

  Alt 3. Dez 2019, 11:34
Du denkst zu kompliziert. Pseudocode:

Delphi-Quellcode:
procedure DoPaint;
begin
  BitBlt(PufferBitmap auf Canvas);
end;

procedure OnTimer;
begin
  LeerePufferBitmap; // Nur nötig, wenn der Hintergrund kleiner als die Elemente ist, die noch drüber gemalt werden
  BitBlt(HintergrundBitmap auf PufferBitmap);
  MaleZiffernblattAuf(PufferBitmap);
  MaleZeigerAuf(PufferBitmap);
  Paint;
end;
Da kann nichts mehr flackern dann.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)
Online

Registriert seit: 29. Mai 2002
37.361 Beiträge
 
Delphi 2006 Professional
 
#14

AW: Canvas aktualisieren ohne flackern

  Alt 3. Dez 2019, 12:02
Du denkst zu kompliziert. Pseudocode:

Delphi-Quellcode:
procedure DoPaint;
begin
  BitBlt(PufferBitmap auf Canvas);
end;

procedure OnTimer;
begin
  LeerePufferBitmap; // Nur nötig, wenn der Hintergrund kleiner als die Elemente ist, die noch drüber gemalt werden
  BitBlt(HintergrundBitmap auf PufferBitmap);
  MaleZiffernblattAuf(PufferBitmap);
  MaleZeigerAuf(PufferBitmap);
  Paint;
end;
Da kann nichts mehr flackern dann.
Und genau das macht mein Beispiel Code. Nur scheint er ihn falsch umgesetzt zu habe, da es bei ihm flackert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.501 Beiträge
 
Delphi 2007 Enterprise
 
#15

AW: Canvas aktualisieren ohne flackern

  Alt 3. Dez 2019, 12:12
Und genau das macht mein Beispiel Code.
Im Grunde meinen wir alle genau dieses seit Seite 1
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)
Online

Registriert seit: 29. Mai 2002
37.361 Beiträge
 
Delphi 2006 Professional
 
#16

AW: Canvas aktualisieren ohne flackern

  Alt 3. Dez 2019, 12:48
Ich weiß nicht was er gemacht hat. Aber im Krankenhaus mit dem Tablet ist es etwas doof zu gucken.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Frühlingsrolle

Registriert seit: 31. Aug 2019
100 Beiträge
 
#17

AW: Canvas aktualisieren ohne flackern

  Alt 3. Dez 2019, 15:13
Habt Dank! Ich gebe mir Mühe es so umzusetzen.
Gute Besserung Luckie!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)
Online

Registriert seit: 29. Mai 2002
37.361 Beiträge
 
Delphi 2006 Professional
 
#18

AW: Canvas aktualisieren ohne flackern

  Alt 3. Dez 2019, 15:30
Danke.

Tipp. Mach es in kleinen Schritten. Erst mit einen Kreis, dann die Striche, dann die Ziffer (Das könnte schon schwerer werden.) Und zum Schluss die Zeiger. Und für jeden Schritt eine eigene Prozedur. Dann brauchst du am Ende nur noch die Prozeduren nacheinander aufrufen und du hast deine Uhr.

Mal grob skizziert:
Code:
procedure DrawClock();
begin
  DrawCircleToBmp;
  DrawNumbersToBmp;
  DrawArmsToBmp;
end;

Procedure OnTimer
begin
  DrawClock;
  Paint;
end;

Procedure OnPaint();
be in
  BitBlt(...);
end;
Jetzt musst du eigentlich nur noch die obigen Prozeduren mit Leben füllen. Man kann das schön in eine Klasse verpacken, der im Konstruktor der Ziel-Canvas und die Größe mitgegeben wird. Schon hast du eine Uhren-Klasse, die du immer wieder verwenden kannst.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Frühlingsrolle

Registriert seit: 31. Aug 2019
100 Beiträge
 
#19

AW: Canvas aktualisieren ohne flackern

  Alt 3. Dez 2019, 16:29
Das hat wunderbar funktioniert.
Jetzt habe ich nur noch ein Problem mit dem Hintergrund, der auf der Bitmap permanent weiß ist.
Ich bekomme die Transparenz nicht hin, auch nicht mit den zugehörigen Transparent-Eigenschaften. Hat jemand eine Anregung dazu?

Neue Anpassungen:
Delphi-Quellcode:
private
  FBitmap: TBitmap;

// constructor
FBitmap := TBitmap.Create;
//

procedure TfrCustomClock.DoPaint;
begin
  // Bitmap auf Komponente übertragen
  BitBlt(Canvas.Handle, 0, 0, Width, Height, FBitmap.Canvas.Handle, 0, 0, SRCCOPY);

  if Assigned(FOnPaint) then
    FOnPaint(self);
end;

procedure TfrCustomClock.DoTimer(Sender: TObject);
var
  pt: TPoint;
  radius: Integer;
begin
  pt.X := Width div 2;
  pt.Y := Height div 2;
  radius := Min(Width, Height) div 2; // DEMO value

  if not(csDesigning in ComponentState) then
    FCurrentTime := now;

  // Bitmap-Größe aktualisieren
  FBitmap.Width := Width;
  FBitmap.Height := Height;
  // Bitmap-Zeichenfläche zurücksetzen
  FBitmap.Canvas.FillRect(Rect(0, 0, Width, Height));
  // Zifferblatt und Zeiger auf das Bitmap zeichnen
  DrawClockFace(FBitmap.Canvas, pt.X, pt.Y, radius);
  DrawClockHands(FBitmap.Canvas, pt.X, pt.Y, HourHand, MinuteHand, SecondHand, FCurrentTime);
  // Komponente neu zeichnen
  Repaint;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)
Online

Registriert seit: 29. Mai 2002
37.361 Beiträge
 
Delphi 2006 Professional
 
#20

AW: Canvas aktualisieren ohne flackern

  Alt 3. Dez 2019, 18:22
Richtig. Hands und nicht Arms.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf