| Autor |
Beitrag |
HenryHux
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 20.04.11 10:40
Hi,
ich habe ein Problem mit meinem Programm bei Aktionen wie neue Bilder in TImages laden oder beim Resizing.
Und zwar ein Flackern, welches jeden Epileptiker vom Stuhl haut.
Kurz zum Aufbau : ein gestrechtes Hintergrund TImage mit Align auf alClient. Darauf mehrere durchsichtige DoubleBuffered TPanel, welche mit dynamisch geladenen TImages gefüllt sind.
Letzteres ist nicht das Problem, wenn ich sie beim Start nicht erstelle, flackert es trotzdem.
Ich denke mal stark, dass es daran liegt, dass ich die Form nicht auf DoubleBuffered stellen kann, da sonst die Transparenz der Panels verloren geht..
Gibt es da eventuell ein paar gute Komponenten oder andere Problemlösungen, welche diese Schwierigkeiten nicht haben?
Vielen Danke,
lg
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 20.04.11 11:11
Screenshot grad mal da?
Die einfachste Lösung hattest Du aber bereits geschrieben: Auf die Transparenz der Panel verzichten und diese ggf. anderweitig emulieren.
Transparenz bei Windows ist immer etwas bescheiden.
Je nach Einsatzzweck deines Programms kann aber auch die Nutzung von z.B. DirectDraw oder OpenGL im 2D-Modus eine Idee sein. In beiden Fällen müsstest Du die GUI aber selbst bauen. Hier wäre eine Vorstufe, auf X Panel zu verzichten und diese durch eine TPaintBox zu ersetzen, bei der Du selber das Zeichnen übernimmst.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Für diesen Beitrag haben gedankt: HenryHux
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 20.04.11 11:31
BenBE hat folgendes geschrieben : | | Screenshot grad mal da?. |
Nein, das Teil klappt auf Screenshots immer bestens
Ein paar Panels durch PaintBoxen zu ersetzen wäre denke ich kein großes Ding, schließlich werden in die Panels nur Images gezeichnet, das könnte ich in die Paintbox ja auch mit Canvas machen.
Ansonsten gibt es doch eine Jedi-Komponente, welche ein durchsichtiges Panel beinhaltet, oder?
Wie sähe es denn mit der aus?
Mit DirectDraw und OpenGl usw. habe ich noch nicht gearbeitet, wäre aber evtl. eine Überlegung wert.
Immoment bin ich dabei eine Art Spiel zu machen, Bild liegt im Anhang.
Die Panels sind jeweils über den Seats, borders sind auf None, deswegen hier nicht zu sehen.
lg
Einloggen, um Attachments anzusehen!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 20.04.11 11:54
Ich nehm an, dass du für die 8 Spieler die Panels hast?
Zeichne den gesamten Hintergrund in einer TPaintbox und lege da nur unten für die 1-2 Anzeigen wo du unbedingt Controls brauchst, diese drüber. Die VCL ist in der Hinsicht relativ bescheiden zu nutzen. Aber wann immer man DoubleBuffered einschalten kann, sollte man es auch tun und dazu ggf. Transparenzen emulieren.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Für diesen Beitrag haben gedankt: HenryHux
|
|
jaenicke
      
Beiträge: 19333
Erhaltene Danke: 1750
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 20.04.11 12:32
Wenn es reicht, wenn es unter Windows 7 läuft, könntest du auch den Direct2D Canvas benutzen:
docwiki.embarcadero...._the_Direct2D_Canvas
In jedem Fall ist es wie BenBE schon schrieb keine gute Idee viele Images oder so zu benutzen, das kann nur schief gehen. Du kannst dann zwar hingehen und WM_ERASEBKGND abfangen, aber dann gibt es Grafikfehler statt Flackern, wenn man nicht aufpasst...
Ach ja, hier ein Beispiel (alles eine TPaintBox bis auf die Toolleiste oben):
www.delphi-forum.de/viewtopic.php?p=557541
Für diesen Beitrag haben gedankt: HenryHux
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 20.04.11 12:43
jaenicke hat folgendes geschrieben : | | Wenn es reicht, wenn es unter Windows 7 läuft |
Leider nein...
Wie sieht es denn mit der Paintbox aus?
Bis jetzt fand ich das Feature von den einzelnen Komponenten ganz gut - Beim Resize hat sich der Hintergrund gestretched und die Panels waren so verankert, dass die immer schön an der Position geblieben sind. Gibt es solche Effekte bei der Paintbox auch und wie schwer ist es damit ein gutes Größenverhältnis in dem Design darzustellen? Wahrscheinlich müsste ich ja dann bei jedem Resize alles neu malen?
Bei deinem Periodensystem (Super gelungen  , würd ich glatt benutzen, hätte ich Chemie nicht abgewählt  ) klappt die ganze Sache mit dem Resizing ja top.
Vielen Dank,
lg
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 20.04.11 12:51
Du musst dich zwar selber um die Positionierung der einzelnen Teilbilder kümmern, das ist aber gar nicht mal sooooooo schwer. Zudem ist es gegenüber den Align-Geschichten um einiges flexibler, da Du beliebige Ankerpunkte definieren kannst. Außerdem kannst Du die Paintbox selber "DoubleBuffered" betreiben, womit du das Flackern komplett vermeidest.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Für diesen Beitrag haben gedankt: HenryHux
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 20.04.11 12:53
Ok, hört sich gut an.
Ich werd hier noch ein paar andere Sachen machen und mich dann an die Paintbox begeben.
Ich bin sicher, dass ich mich nochmal melde
lg
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 20.04.11 14:17
Soo, sieht soweit schonmal gut aus.
Habe also wieder ein alClient Paintbox, wo ich das Bild so draufpinsel:
Delphi-Quelltext 1: 2: 3: 4: 5:
| SetStretchBltMode(pbBackGround.Canvas.Handle, HALFTONE);
StretchBlt(pbBackGround.Canvas.Handle, 0, 0, pbBackGround.Width, pbBackGround.Height, BackGround.Canvas.Handle, 0, 0, BackGround.Width, BackGround.Height, SRCCOPY); |
Habe hier versucht auf die VCL Funktionen zu verzichten.
Erste Frage :
Wann und wie zeichne ich am besten alles?
Immoment würde ich sagen, dass ich eine Prozedur machen, welche alles zeichnet. Die würde ich dann beim Create und OnResize aufrufen, oder gibts da bessere Möglichkeiten?
Zweite :
Mache ich für die einzelnen Objekte, die ich bisher als Panels gezeichnet habe auch Paintboxen oder lassen die sich anders verankern?
lg
|
|
jaenicke
      
Beiträge: 19333
Erhaltene Danke: 1750
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 20.04.11 15:48
HenryHux hat folgendes geschrieben : | | Immoment würde ich sagen, dass ich eine Prozedur machen, welche alles zeichnet. Die würde ich dann beim Create und OnResize aufrufen, oder gibts da bessere Möglichkeiten? |
Genau, und in OnPaint werden die davon generierten Daten nur noch aus der Hintergrundbitmap auf die PaintBox kopiert. (Ich hoffe doch der Quelltext dort steht in OnPaint.)
HenryHux hat folgendes geschrieben : | Zweite :
Mache ich für die einzelnen Objekte, die ich bisher als Panels gezeichnet habe auch Paintboxen oder lassen die sich anders verankern? |
Du hast doch schon eine PaintBox. Wenn du jetzt wieder mehrere PaintBoxen erstellst, hast du das selbe Problem in grün...
Du musst das schon in die selbe PaintBox zeichnen.
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 20.04.11 16:54
jaenicke hat folgendes geschrieben : | | Ich hoffe doch der Quelltext dort steht in OnPaint. |
Na kla =)
Jetzt habe ich direkt die nächsten beiden Probleme
Erst einmal die Transparenz.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| Ebene[1] := TBitmap.Create; with Ebene[1] do begin LoadFromFile('C:\Users\Tobias\Desktop\Seat.bmp'); Transparent := true; TransparentColor := clwhite; TransparentMode := TMFixed; end; |
-> Will nicht.
Wollte halt zuerst die Ebene[0] zeichnen, das HintergrundBild.
Dann wollte ich den ganzen Rest draufmachen, klappt auch aber leider ohne Transparenz.
Das nächste Problem ist die verankerung.
Wie mache ich das am besten?
Ich würde es jetzt immer relativ zur Größe der Paintbox machen, das scheint mir aber ein bisschen sehr viel arbeit...
Gibt es da ne einfachere Methode?
lg
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 20.04.11 16:55
Den Beitrag bitte einmal löschen, Danke =)
|
|
jaenicke
      
Beiträge: 19333
Erhaltene Danke: 1750
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 20.04.11 18:10
HenryHux hat folgendes geschrieben : | | Ich würde es jetzt immer relativ zur Größe der Paintbox machen, das scheint mir aber ein bisschen sehr viel arbeit... |
Das ist nur ein wenig einfache Mathematik.
Und wegen der Transparenz:
Es gibt auch bessere Möglichkeiten, auf eine Frage meinerseits hin findest du als Antwort auch ein Beispiel:
www.delphi-forum.de/viewtopic.php?t=102508
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 20.04.11 18:36
Danke, werde ich mir angucken, wenn ich es endlich geschafft habe die Zeichnungen richtig zu positionieren.
Wie müsste das denn mathematisch richtig aussehen? Habe auch hier keine Ahnung von
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure Zeichnen(Left, Up : Double); begin StretchBlt(pbBackGround.Canvas.Handle, trunc(pbBackGround.Width / Left), trunc(pbBackGround.Width / Up), trunc(pbBackGround.Width / 6), trunc(pbBackGround.Height / 9), Ebene[1].Canvas.Handle, 0, 0, Ebene[1].Width, Ebene[1].Height, SRCCOPY); end;; |
Ich dachte eigentlich ein Vielfaches würde es genauso in der Position halten wie gelöste Anchors also [],
doch leider habe ich mich da vertan.
Wie muss ich das denn dann mitberechnen?
lg
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 20.04.11 21:45
So, habe alles hinbekommen.
Mathematisch war meine ÜBerlegung mit dem Vielfachen schon richtig, waren nur Fehler drin.
Zu der Transparenz hat mir dein Thread leider nicht weitergeholfen, dafür aber das hier.
Hier falls es mal jemand brauchen sollte :
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| procedure DrawTransparentBmp(Cnv: TCanvas; x,y: Integer; Bmp: TBitmap; clTransparent: TColor); var bmpXOR, bmpAND, bmpINVAND, bmpTarget: TBitmap; oldcol: Longint; begin try bmpAND := TBitmap.Create; bmpAND.Width := Bmp.Width; bmpAND.Height := Bmp.Height; bmpAND.Monochrome := True; oldcol := SetBkColor(Bmp.Canvas.Handle, ColorToRGB(clTransparent)); BitBlt(bmpAND.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Bmp.Canvas.Handle, 0,0, SRCCOPY); SetBkColor(Bmp.Canvas.Handle, oldcol);
bmpINVAND := TBitmap.Create; bmpINVAND.Width := Bmp.Width; bmpINVAND.Height := Bmp.Height; bmpINVAND.Monochrome := True; BitBlt(bmpINVAND.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, bmpAND.Canvas.Handle, 0,0, NOTSRCCOPY);
bmpXOR := TBitmap.Create; bmpXOR.Width := Bmp.Width; bmpXOR.Height := Bmp.Height; BitBlt(bmpXOR.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Bmp.Canvas.Handle, 0,0, SRCCOPY); BitBlt(bmpXOR.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, bmpINVAND.Canvas.Handle, 0,0, SRCAND);
bmpTarget := TBitmap.Create; bmpTarget.Width := Bmp.Width; bmpTarget.Height := Bmp.Height; BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Cnv.Handle, x,y, SRCCOPY); BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, bmpAND.Canvas.Handle, 0,0, SRCAND); BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, bmpXOR.Canvas.Handle, 0,0, SRCINVERT); BitBlt(Cnv.Handle, x,y,Bmp.Width,Bmp.Height, bmpTarget.Canvas.Handle, 0,0, SRCCOPY); finally bmpXOR.Free; bmpAND.Free; bmpINVAND.Free; bmpTarget.Free; end; end; |
Quelle: www.delphi3000.com/a.../article_485.asp?SK= .
Lg
|
|
jaenicke
      
Beiträge: 19333
Erhaltene Danke: 1750
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 21.04.11 05:46
Klar, wenn dir eine transparente Farbe reicht, reicht das aus. Ich brauche aber in der Regel auch semi-transparente Bereiche, damit man den Hintergrund noch durchscheinen lassen kann.
Die Lösung mit Alphablend kann beides. 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 21.04.11 10:19
Statt Trunc(Foo / Bar) solltest Du lieber Foo div Bar schreiben. Das hat den gleichen Effekt UND ist sogar noch etwas schneller, weil das nicht erst Gleitkomma-Arithmetik macht. UND ist im Zweifelsfalle sogar auch noch präzise, wenn die Gleitkomma-Zahl mal versehentlich falsch abgeschnitten wird.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Do 21.04.11 10:55
BenBE hat folgendes geschrieben : | | Statt Trunc(Foo / Bar) solltest Du lieber Foo div Bar schreiben. Das hat den gleichen Effekt UND ist sogar noch etwas schneller, weil das nicht erst Gleitkomma-Arithmetik macht. UND ist im Zweifelsfalle sogar auch noch präzise, wenn die Gleitkomma-Zahl mal versehentlich falsch abgeschnitten wird. |
Mache ich normalerweise, aber mir kam es auf den Unterschied an, dass ich bei der Integerdivision keine Dezimalzahlen verwenden kann.
Sprich:
Delphi-Quelltext 1: 2:
| showmessage(inttostr(trunc(200 / 3.5))); showmessage(inttostr(200 div 3)) |
macht nen großen Unterschied.
lg
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Do 21.04.11 12:06
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Do 21.04.11 13:07
|
|
|