Ich habe mehrere TForms die eigene GUI Komponenten enthalten, jeder dieser Komponenten zeichnet mit OnPaint. Alle dieser Komponenten behandeln Maus ereignisse wie MouseMove etc.
Nun lege ich über ein bestimmtes Form bei bedarf ein "Unsichtbares" TForm darüber, das Transparent ist (TransparentColor = true) und die Position mit dem Unterform Syncronisiert.
Das Unsichtbare Form zeichnet dann in eine Paintbox kram wie z.b. Texte mit Canvas. Diese Form ist auch immer OnTop (FormStyle = fsStayOnTop)
Wenn nun diese Unsichtbare Form, nennen wir sie OSD aktiv ist, dann werden einige OnPaint ereignisse die eigentlich passieren müssen nicht mehr ausgeführt, was nicht so schön ist.
Ich bin z.b. mit der Maus über einem Button, welches mittels MouseEnter/Leave den State ändert, und es passiert aber nix. Oder ich verändere gerade in einer Seekbar die Position mit MouseMove, es zeichnet nix.
Warum das ist so ist, weiss ich nicht und verstehe ich auch nicht. Definitiv wird immer ein Repaint der Komponente erzwungen während dem MouseMove.
Was ich aber weiss:
Das OSD Form wird ja bei beidarf angezeigt oder ausgeblendet. Beim Einblenden enthält das Form sofort den Fokus und wird somit aktiviert. Selbst wenn eine andere Form gerade den Fokus hat, dann bekommt das OSD den fokus.
Eigentlich will ich das das OSD Form zwar immer über einem Form immer fest ist, aber nie den Fokus bekommen kann und auch die aktionen wenn man z.b. draufklickt auf das andere Form weiterleitet.
Wer das nun nicht versteht, der soll bitte folgendes tun:
- Die aktuelle Xenorate 2.6.2 Beta us dem Projekt Thread herunterladen und installieren - Xenorate starten und ein Video laden. - Während das video im fenster läuft, die Volume bar aus dem Hauptfenster verändern, mit gedrückter Maustaste verändert sich die Bar nie und es sieht so aus als würde es nie übernehmen, was falsch.
Defakto schickt das verändern der Volume bar eine (ShowOSD) message an das OSD Form, welches die aktuelle Lautstärke im OSD anzeigen soll, was auch funktioniert, nur das aktuallisieren der eigentlichen VOlume bar geht nicht mehr, weil das OSD aktiv ist.
Was hier passiert ist genau das was ich oben beschrieben habe.
Ich habe ein Form (OSD Form) das über die Video Komponente bei Bedarf über das Video Form gelegt und angezeigt wird. Die Positionen des VideoForm werden dem OSDForm zugewiesen, jedesmal bei Postionsveränderung oder Resize.
Hätte hier wer einen Lösungsvorschlag, wie man z.b. ein TForm über ein anderes TForm darüber legt, das Unsichtbar ist aber bei bedarf Text enthalten kann, das mit einem Label oder Paintbox angezeigt wird, aber nicht verhindert das andere Paint oder Message operationen ignoriert werden.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hast du mal versucht, im MouseMove (bzw den anderen relevanten Events) explizit Invalidate aufzurufen?
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Hast du mal versucht, im MouseMove (bzw den anderen relevanten Events) explizit Invalidate aufzurufen?
greetings
Das ist leider ein problem, weil ich bisher es so mache:
- Neue Position des Controls bestimmen, z.b. bei Trackbar - Danach wird direkt ein TBitmap auf das Image gezeichnet.
Ich weiss das ist nicht so toll und man sollte eigentlich nur bei OnPaint zeichnen, aber so ist nun mein komplettes GUI System aufgebaut, das mittlerweile über 220 KB source enthält. Die codebasis ist halt von 1999, aber sehr robust und schnell.
Ein Invalidate hilft da leider nicht, habe es ausprobiert. Direkt in das MouseMove eingebaut, nachdem die GUI Gezeichnet und das OSD aktuallisiert wurde. Macht leider keinen Unterschied.
Threading kann mir an der Stelle nicht helfen oder ? Da TForms ja ansich nicht mit Threads arbeiten und diese auch explicit im Thread erstellt werden müssen. Ansonsten hätte man ja meine Cross-Thread Operation probleme. *vermut*
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Finalspace hat geschrieben:
Threading kann mir an der Stelle nicht helfen oder ? Da TForms ja ansich nicht mit Threads arbeiten und diese auch explicit im Thread erstellt werden müssen. Ansonsten hätte man ja meine Cross-Thread Operation probleme. *vermut*
Youp, Threads und VLC mixen ist ne ganz böse Sache.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Ich habe mehrere Sachen ausprobiert, z.b. einen Timer der mein OSD immer aktuallisiert alle 40 ms und somit nur im Form selbst was macht.
Das Form von Stay on Top auf Normal umzustellen hat auch nicht geholfen.
Was den Fehler auslöst ist ein "Invalidate" des OSD Forms, das ich für jede OSD Änderung ausrufe.
Wenn ich dieses weglasse, dann geht der rest, nur das OSD wird nicht mehr aktuallisiert
Es werden nicht nur Mouse oder Paint Messages verschluckt, sondern auch Key Messages. Also wenn ich z.b. Taste Hoch/Runter betätige welches in meinem programm Lautstärke reguliert und dann das OSD anzeigt. Sobald das OSD aktiv ist, dann wird alles gefressen.
Selbst wenn ich im Video formular bin, wo das OSD drüber liegt
Ich brauche da definitiv eine andere Lösung
Hatte vorher immer direkt auf das Video Fenster gezeichnet, und einfach den Colorkey verwendet sofern Overlay aktiv war.
Das geht jetzt leider nicht mehr, da ich eigentlich bessere Video Renderer Techniken verwende, da aber kein Colorkey mehr unterstützten
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Nun, für die Key-Events, kannst du die nicht weiterleiten lassen an deine Hauptform? (Aufruf von DispatchMessage oder sowas)
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Nun, für die Key-Events, kannst du die nicht weiterleiten lassen an deine Hauptform? (Aufruf von DispatchMessage oder sowas)
greetings
Das mit den Key Events habe ich in den Griff bekommen. Das lag daran das meine Tastatur implementierung das OSD Form nicht als "Aktives" Fenster erkannt hatte. Mein Key event kam zwar an, aber nur bis zum Tastaturmanager.
Bin grad systematisch am Umstellen des OSD´s. Ich bin nun soweit, das ich hergehen will und kein Transparentes OSD machen mache, sondern ein normales TForm das dem Skin Design entspricht, aber entsprechend dem OSD Text Gross/Kleiner wird.
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.