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 ?
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.
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.
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).
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.
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.