Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 03, 2025 09:42

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: SDL: GUI nicht zu oft neu zeichnen
BeitragVerfasst: Mo Aug 15, 2011 07:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hi,

ich habe einen Videoplayer, welcher eine Funktion hat, welche regelmäßig das Bild im SDL-Fenster aktualisiert. Da der Player in meinen richtigen integriert wird, benötigt er die gleichen Komponenten wie das Hauptprogramm auch um seine GUI (GUI bezieht sich im Folgenden ausschließlich auf das Aussehen des Programms, Buttons etc. also, SDL dient nur als Schnittstelle zu Maus, Bildschirm und Tastatur für die GUI, für den Videoplayer ist SDL halt bedeutender) zu realisieren. Der Hauptplayer basiert auf einfachen Komponenten wie Panel, Button, Trackbar die einfach nur Farbverläufe darstellen können und aus simplen Canvas-Operationen gebaut sind an sich. Daher habe ich diese nach C übersetzt (dass es keine Klassen in C in der Form wie in Object Pascal gibt, nervt, aber bei drei Komponenten stört es nicht). Derzeit habe ich es so gelöst: Es wird an der Stelle an der der aktuelle Videoframe gezeichnet wird die drawskin-Prozedur der GUI aufgerufen. In der drawskin-Prozedur gibt es einen einfachen Counter, der dann nach einmaligen Zeichnen dafür sorgt, dass die GUI nicht erneut gezeichnet wird. Ansonsten würde die GUI zu oft gezeichnet werden (pro Frame einmal). Das geht auch ganz gut, aber es ist klar was passiert: Sobald ein Fenster dieses Fenster verdeckt, hat man in dem Bereich in dem es verdeckt wurde logischerweise keine GUI mehr. Mit minimieren, Arbeitsfläche wechseln etc. passiert genau das gleiche. Ich konnte bisher bei SDL kein Event finden, aber eigentlich müsste es so etwas geben: Wie kann man dafür sorgen, dass nur dann die GUI (=Aufruf von Prozedur drawskin) gezeichnet wird, wenn es nötig ist ?

Gruß,
Nils

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 15, 2011 11:30 
Offline
DGL Member

Registriert: Mi Sep 15, 2010 18:22
Beiträge: 59
Wohnort: Sachsen Meißen
Programmiersprache: Pascal, C(++), Java
Ich kann dir nur raten mal das SysWMEvent zu probieren, da alle anderen Events ausscheiden. Hier müsste eigentlich das vom Formular bekannte OnPaint vom Fenstermanager kommen.

_________________
bluesky


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 15, 2011 15:07 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
Setz doch den counter (den du da mitzählen lässt) wieder auf 0 und calle ein Invalidate; (SendMessage(Handle, WM_PAINT, ...)) (oder was auch immer du da in C gemacht hast...), damit wird deine GUI wieder neugemalt, den counter danach wieder wie gewohnt erhöhen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 15, 2011 15:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
http://www.libsdl.org/tmp/SDL-1.3-docs/ ... 7f358c063c hoffe das hilft...

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 15, 2011 20:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
yunharla: Das ist ein guter Ansatz, genügt aber nicht, da sich das nur auf das Minimieren und Wiederherstellen eines Fenster bezieht. Wenn ich also ein Fenster drüber- und wegschiebe dürfte das nicht mehr greifen.

phlegmatiker: Ginge, aber ich benutze SDL damit ich nicht so viel Fummelei habe um das Programm unter verschiedenen Systemen lauffähig zu kriegen, WM_PAINT ist da schon wieder so eine Sache.

yunharla: Guter Ansatz, hatte das Event mal reingesetzt und es zeichnete sechsmal von alleine neu, also ohne Verdecken, Minimieren des Fensters usw. und sechzehnmal gab wurde neu gezeichnet, wenn ich das Fenster einmal minimierte und wiederherstellte. Das ist neunmal zu viel also. Hier stehen die Ereignisse ganz brauchbar aufgelistet. SDL_VIDEOEXPOSE ist das gesuchte Ereignis. Die Anzahl wie oft neu gezeichnet wird beläuft sich pro Minimieren und Wiederherstellen auf einmal - also in Ordnung. Wenn ich ein Fenster in das Videofenster schiebe und wieder rausziehe (= gewisse Bereiche müssen neu gezeichnet werden), flackert es, da andauernd neu gezeichnet wird. SDL_DOUBLEBUF hilft da leider nicht. Man müsste wohl weitere Informationen erhalten von SDL damit nicht alles sondern nur Teilbereiche neu gezeichnet werden müssen. Falls da einer eine Idee hat, wäre das super, aber auch so kann ich schon zufrieden sein. Das bisschen Geflacker wenn man mal ein Fenster drüberschiebt stört kaum, da es nur flackert wenn das Fenster in Bewegung ist, welches man drüber zieht (und somit zum Neuzeichnen zwingt).

Wie immer danke für Eure Hilfe.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 17, 2011 09:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
hab SDL immer nur für Keyboard,Sound,Texturen usw genommen,
schau dir mal hier den source vom unofficial an und setz die events manuell für dein Fenster.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 16 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 15 Queries | GZIP : On ]