Frage

Wir sind auf den meisten seiner Fenster einen enthäuteten App mit verschiedenen abgerundeten Kanten zu entwickeln. Ich verwende Fensterbereiche nicht rechtwinkelig zu definieren, aber fast alle Objekte auf den gezackten Aliasing bewirkt dies, weil Pixel nur entweder vollständig deckend oder vollständig transparent sein können.

Ich habe mit einer Lösung dieses Problems mit Ebenen-Fenster kommen, aber wir wollen sicherstellen, dass dies ausgeführt wird (und hoffentlich gut laufen) auf einer Vielzahl von Systemen, und ich möchte sehen, ob jemand eine bessere Idee hat, oder Möglichkeiten zu optimieren, was ich tue. Ich weiß, Ebenen-Fenster erfordert Win2000 oder später, und das ist in Ordnung, so dass bereits eine Anforderung aus anderen Gründen. Von einigen grundlegenden Tests sieht es ok auf Vista, aber das ist keine Garantie noch.

Hier ist, was ich tue: Ich habe ein Fenster, nenne es ein, mit Kontrollen und Text und was auch immer umfasst das Fenster. Ich habe Fenster B als Kind von Fenster A, außer es die WS_POPUP Stil statt WS_CHILD hat, so kann es sich in der Region außerhalb einer Position und wird auf der A der Kontrollen gezogen. Fenster B hat auch den WS_EX_LAYERED Stil, und bei der Initialisierung, ich nenne UpdateLayeredWindow mit der ULW_ALPHA Flagge und eine Gleichstromquelle mit einem 32-Bit-Bitmap mit einem Alphakanal, um es mit pro-pixel-alpha zu ziehen.

Das Bitmap in der Quelle DC für Fenster B verwendet wird, ist so ziemlich genau die Pixel um den Rand des Fensters, das ich in der volle Transparenz glatt aus dem Fenster des Hintergrund mischen will. Ich würde den ganzen zwei Fenster Ansatz überspringt und nur ein einziges geschichtetes Fenster, mit der Ausnahme, dass verwenden, wenn Sie verwenden UpdateLayeredWindow, es gezeichnet wird von einem Puffer im Speicher gehalten, anstelle der typischen WM_PAINT Nachrichten und all das, und zu versuchen, zu erhalten interaktive Kinder Kontrollen (und Kind-Fenster), gut mit, dass wie ein bemerkenswerter Ärger klingt (und wahrscheinlich würde für alles, was nicht einmal funktionieren).

Also, es ist im Grunde Fenster A mit den all untergeordneten Steuerelemente und was auch immer, mit Fenstern B direkt auf ihn schwimmen, eine schöne glatte Grenze zu ziehen. Ich reagiere Nachrichten an WM_MOVE und so weiter durch Fenster B bewegen zusammen mit ihm, und ich habe Fenster B deaktiviert, so dass es nie oder Eingabe scharf eingestellt werden kann (Klicks bereits durchlaufen, da Teile davon, die von Null Opazität sind, wie die Mehrheit seine inneren Teile, bereits von der Kommissionierung) ausgeschlossen.

Für Kicks, hier ist es, was die Stücke aussehen, zu zeigen, was ich meine, ein wenig besser.

So funktioniert es, aber ich kann es wirklich der beste Weg, dies zu tun, nicht sicher sein. Ich habe zwei Fragen:

  • Klingt das akzeptabel ist, oder gibt es etwas grell schrecklich darüber?
  • Wie es zur Zeit arbeitet, wie es scheint, ist es ein Offscreenbuffer die Größe des Fensters mit (die bis zu 1024x768 sein kann), obwohl nur sehr wenige Pixel davon jede Nicht-Null Opazität Daten haben - wäre es lohnt sich der Aufwand und zusätzliche Komplexität davon in einzelne Randstücke schneiden und Compositing sie zusammen?
War es hilfreich?

Lösung

Ihr Produkt nutzt überlappende Fenster die kleinen Laschen zu zeichnen ich zu jedem Fenster anbringen. Ich benutzen Ebenen-Fenster, um die glatte Rundung zu erhalten, ohne Aliasing. Das einzige unangenehme Problem, das ich in so weit laufen habe, ist, dass einige OpenGL Fenster kritzeln auf den Ebenen-Fenster unter Windows XP und Vista ohne DWM. Es ist ein niedriges Niveau Problem und Microsoft war nicht sehr hilfreich. Sie können es reproduzieren von Google Earth öffnen und Ihre Anwendung über das Haupt-Rendering-Fenster ziehen, Ihre schichtet Fenster verschwinden.

Andere Tipps

Ich habe eine Sache herausgefunden: Stücke separate Rahmen mit schneller macht deutlich als ein einziges riesiges Rahmenfenster hat, mit einer großen Weite des leeren Pixels in der Mitte. Ich habe keine tatsächlichen Zahlen, sondern nur von einem schnellen Test beide versuchen, es gab eine merkliche Latenz, wenn mehrere Fenster mit Full-Frame-Fenster einander überlappen, aber wenn deren Rahmen wurden in kleinere Bestandteile zerlegt, es war viel zackiger . Was auch immer Overhead mit mehreren Ebenen-Fenster mit einer eigenen Gerätekontexten trägt nicht viel, und mit großen Weiten von Pixeln (leer oder nicht!) Noch trägt viel mehr Belastung.

  1. Vergessen Sie nicht, unter RDP und VM (Hyper-V & VMWare)
  2. zu testen
  3. Versuchen Sie, mehrere Grafikkarten und auf Netbooks und Laptops (falls zutreffend).
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top