[Win32] große Uhr im Vordergrund, transparent

  • Ich möchte gerne eine Uhr schreiben, die nicht in einem Fenster dargestellt wird, sonder transparent über den kompletten Bildschirm gezeichnet wird. Digital am liebsten, so dass dann einfach in der mitte des Bildschirms z.b. 10:39 steht. Sollte, wie der Mauszeiger funktionieren und oberhalb von allem anderen gezeichnet werden.

    Mein Problem ist jetzt, dass ich überhaupt keine Ahnung von Treiberprogrammierung, falls ich ne art maustreiber-ähnlichen treiber schreiben müsste, bzw. hab ich keine Ahnung, ob ich irgendwie anders auf den Bildschirminhalt zugreifen kann, ohne gleich directx beherrschen zu müssen.

    Also, wenn da jemand ne Idee hätte, wie ich das am einfachsten realisieren kann, dann bin ich dankbar für jede Hilfe. Ergebnisse werden natürlich wieder kostenlos hier veröffentlich, damit andere User, die sowas auch haben wollen, einfach downloaden können, bzw. jemand am quellcode rumbasteln kann.

  • Ich wüsst drei Möglichkeiten, die aber alle nicht so toll sind. Einerseits kannst dir mit GetDC den Device Context von einem Window holen, und wenn du 0 übergibst, den vom Screen (wies mit mehreren Screens ist, weiß ich nicht).
    Da kannst dann auch mit bitblt oder ähnlichem relativ angenehm oldschoolig reinmalen. Bei Delphi kann man sich für diesen DC auch einen Canvas erzeugen, wies bei C+WinAPI am besten geht, weiß ich jetzt nicht auswendig.
    Problem: Du müsstest dir den Originalscreen kopieren, damit du den wiederherstellen kannst. Die Fenster kriegen das nicht mit, dass sie übermalt werden. Und wenn die Fenster sich selbst irgendwie ändern, und du stellst das Originalbild wieder her, ist was anderes am Screen, als da sein sollte. Da kann schnell alles vermurkst sein.

    Zweite Möglichkeit: Teiltransparentes Fenster, allerdings kannst du dann nicht durch deinen Krams durchklicken.

    Dritte Möglichkeit: Overlay, und damit z.B. das Wallpaper ersetzen. Das geht aber halt auch nicht gut über alle Fenster drüber.

    In einen FBO rendern ist wie eine Schachtel Pralinen - man weiß nie, was man kriegt.

  • Also, wenn ich in GetDC(0) reinzeichne, dann sehe ich davon nix. Scheint nicht so einfach zu gehen.
    Wie macht man ein Teiltransparentes Fenster? (das mit dem durchklicken würde ich dann mit einem Tray lösen, welches ein TrackPopupMenu aufmacht bei rechtsclick)

    edit: GetWindowDC(0) liefert das gewünschte ergebnis.

    Einmal editiert, zuletzt von djtraumwelt (6. Mai 2010 um 12:19)

  • Zweite Möglichkeit: Teiltransparentes Fenster, allerdings kannst du dann nicht durch deinen Krams durchklicken.

    Das ist in Wahrheit die einzig brauchbare. Soweit ich mich erinnern kann, kann man aber sehr wohl durch solche Fenster durchklicken, und zwar sowohl mit der alten Methode mit einer Region als auch mit den "neuen" (seit Windows 2000) Layered Windows.

  • Also, das mit den LayeredWindows hab ich "ausgecheckt" und die Uhr funktioniert soweit. Aber ein großes Problem an dieser Lösung ist, dass das clicken in die Ziffern ein clicken ins Fenster bedeutet. Das soll so nicht sein. Ich möchte die Uhr zwar angezeigt haben, aber sie nicht anklicken können, steuern über das tray (wenn ich denn auser beenden was zum steuern brauchen würde). Weil man ja alles auf seinem bildschirm anklicken können soll, müsste man durch das fenster durch clicken können. Das scheint mir aber nicht realisierbar zu sein. Falls es das doch sein sollte, dann bitte hier posten wie, dann ist die uhr auch schon fertig. Ansonsten bräuchte ich ne, vermutlich viel kompliziertere, möglichkeit, diese uhr zu realisieren.

    edit: jetzt wird mir erst klar, was ihr mit durchklicken gemeint habt. ich bin halt manchmal n bissl bescheuert. jedenfalls, durch die transparenten teile kann man durchklicken, nur durch die gezeichneten teile, die ziffern, eben nicht.

    edit 2: hab das problem lösen können: WS_EX_TRANSPARENT

    das ergebnis gibt es unter http://www.wundervollemusik.de/Uhr.zip

    3 Mal editiert, zuletzt von djtraumwelt (6. Mai 2010 um 21:05)

  • Ok, wenn du durch die gezeichneten Teile eh nicht durchklicken willst, passts natürlich.

    In einen FBO rendern ist wie eine Schachtel Pralinen - man weiß nie, was man kriegt.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!