Transluzente / transparente Überlagerung rendern

8

Ich brauche eine schnelle Möglichkeit, ein Overlay auf einem Bildschirm mit Transparenzunterstützung zu zeichnen. Ich habe viel gesucht und eine mögliche Lösung gefunden (die ihre eigenen Probleme hat) und eine andere Lösung, die nicht meinen Anforderungen entspricht; insbesondere Transparenz-Unterstützung.

Ich beginne mit dem Letzteren und berühre dann den ersteren.

Lösung 1

Wenn Sie ein randloses Formular mit einem TransparencyKey verwenden, ist dies eine der am meisten empfohlenen Lösungen, die ich gefunden habe und die am wenigsten hilfreich ist.

Diese Lösung funktioniert, indem Sie ein neues Formular haben, es randlos machen, den Hintergrund auf etwas wie Colour.White setzen und TransparencyKey auf die gleiche Farbe setzen, es im Vollbild und am höchsten haben und vielleicht einige andere Optionen einstellen Lassen Sie es für Maus und Tastatur unsichtbar wirken.

Das Problem mit dieser Lösung ist, dass sie keine Transparenz unterstützt; es wird nur Farben genau gleich wie das TransparencyKey "ausknocken" und als solches wird alles mit dem geringsten Unterschied gezeigt, was die Idee verursacht, durchsichtige Objekte auf dem Bildschirm aus dem Fenster zu haben.

Lösung 2

Verwenden Sie P / Invoke und GDI +, um ( GetDC & amp; Graphics.FromHdc ) zu erhalten, zeichnen Sie den Desktop und geben Sie ihn dann frei ( ReleaseDC ).

Dafür funktioniert es ganz gut, leider gibt es aber einige Probleme.

Zunächst einmal; wenn man es einmal aufruft, wird es ganz offensichtlich nur einmal gezeichnet, und wenn der Bildschirm überhaupt aktualisiert wird, verschwindet er. Ich verstehe nicht, wie ich das beheben kann. Wenn das die beste Lösung ist, brauche ich definitiv Hilfe Problem.

Zweitens von allen; GDI + ist wahnsinnig langsam mit dieser Methode mit einem transluzenten Pinsel und FillRectangle und ich kann es ehrlich gesagt nicht tadeln, aber ich fordere es ziemlich schnell; eine Anforderung, die GDI + offensichtlich nicht erfüllen kann.

Abschließend; Ich benötige eine Methode zum Zeichnen einer Überlagerung über einen Bildschirm, der Transparenz unterstützt, wenn die zweite Methode die Methode ist, die ich verwenden sollte Wie kann ich mit einem transluzenten Pinsel schnell genug zeichnen, dass es kein Problem ist und wie würde ich es so aktualisieren dass es nicht verschwindet, nachdem der Bildschirm aktualisiert wurde, und wenn es nicht die Methode ist, die ich verwenden soll, geben Sie bitte an, welche Methode ich verwenden sollte

    
AlphaDelta 17.06.2014, 10:50
quelle

1 Antwort

2

Die Lösung ist nicht in Ihrer Liste. Lösung # 3 ist UpdateLayeredWindow mit einer Bitmap mit einem Alpha-Kanal. Beim Aktualisieren der Bitmap müssen Sie nur die Bereiche zeichnen, die aktualisiert werden müssen, und das schnellste Bitmap-Format verwenden (zuvor multipliziertes ARBG). Hier ist ein Beispiel für einige Grafiken, die ich mit der Lösung 2 erstellt habe, die schnell genug scheint: Translucent Clock and Calculator

Hier sind einige weitere Details. Wir haben eine Klasse namens GdiBuffer, die ein GDI-Handle-Feld und ein DC-Handle-Feld enthält (beide gekapselt in Klassen, GdiHandle und DCHandle). Es wird folgendermaßen initialisiert:

%Vor%

Die Bitmap ist eine GDI + -Bitmap. Das bedeutet, dass wir _deviceContext jetzt sowohl die GDI + -Bitmap als auch etwas, das wir in GDI verwenden können, darstellen.

Wenn es Zeit ist, den Bildschirm zu aktualisieren, übergeben wir ein Formular an die Methode in GdiBuffer, die den Bildschirm aktualisieren kann:

%Vor%

Um unseren GdiBuffer intern zu benutzen:

%Vor%

Im Feld _graphics zeichnen wir tatsächlich.

    
Frank Hileman 17.06.2014 15:37
quelle

Tags und Links