2017-03-20 2 views
1

Ich habe ein Formular, das transparent ist. (einfach durch Anpassen der Hintergrundfarbe und des Transparenzschlüssels.Zeichnen Opazität auf einem transparenten Formular C#

Beim Versuch, Dinge zu zeichnen, die transparent sind, funktioniert es einfach nicht. Wenn die Alpha-Variable näher an 0 kommt, nähert sich die gezeichnete Farbe einfach dem Original Hintergrundfarbe des Formulars.

SolidBrush opaqueBrush = new SolidBrush(Color.FromArgb(255, 0, 0, 255)); 
SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 255)); 
SolidBrush superTransBrush = new SolidBrush(Color.FromArgb(10, 0, 0, 255)); 

diese 3 Bürsten auf einer regelmäßigen Form in den gewünschten Effekt würde zu ziehen. Aber mit ihm auf meinem transparenten Form einfach passt superTransBrush mit meinem TransparencyKey/Hintergrundfarbe und die semiTransBrush ist irgendwo zwischen meiner Wunschfarbe und dem Hintergrund, jedenfalls um diese herum?

+0

Um zu verdeutlichen - wenn Sie Ihre Bg/transparente Farbe auf grün setzen und Ihr Pinsel blau ist, ergibt ein Alpha-Wert von 128 eine Mischung aus Blau und Grün? – Phylyp

+0

Worauf zielen Sie ab: Winforms, WPF, ASP ..? __Always__ tag Ihre Frage richtig! - _Als die Alpha-Variable näher an 0 kommt, nähert sich die gezeichnete Farbe einfach der ursprünglichen Hintergrundfarbe der Form an._ Tatsächlich ist es so; Wie sonst wäre es? Nur die genaue Transparenzschlüsselfarbe__ wird transparent gemacht. Alle anderen Pixel sind nicht. Umsonst. Du könntest versuchen, eine Farbe wie (254,254,254,254) als Schlüsselfarbe auszuwählen, aber dann wird immer noch Weiß in die Mischung eingehen. - Außerdem: Warum hast du 'GDI' statt' GDI +' markiert? – TaW

+0

Sieht aus, als würdest du auf WPF zielen? Nur ein Punkt, der dir nützlich sein könnte. Ich hatte einmal ein Problem mit der Transparenz und das Rätsel, das ich vermisste, war folgendes: Die scheinbare Farbe des Dinges oben ist die Summe dessen, was darunter ist. Die endgültige Farbe, die Sie sehen, ist eher so, als ob Sie farbige Glasstücke übereinander legen würden, anstatt nur eine Ebene über die nächste zu legen. –

Antwort

0

Hintergrund

Windows Forms baut auf GDI und GDI + auf.

GDI ist eine sehr alte Technik weit zurück in der Geschichte von Windows stammt, und wurde nicht alpha bewusst sein entworfen.

GDI + Das mit WindowsXP und Nachfolgern gelieferte GDI + wurde entwickelt, um GDI mit Alpga-Blending, Anti-Aliasing und anderen Funktionen zu ergänzen, die Sie von einer modernen 2D-Grafikbibliothek erwarten.

Leider GDI + nicht GDI Alpha bewusst machen, es täuscht nur alpha in einigen Fällen.

Ihr Szenario

In Ihrem Fall, den Alpha-Kanal ist fälschen und die SolidBrush Farbe auf das Formular zeichnen, bevor die Transparenz Betrieb der Form durchgeführt wird, damit der Renderer eine andere Farbe der sieht eine, die Sie für die Transparenz angegeben haben, und ignoriert sie.

Mein Szenario

In meinem Fall, ich versuche, einen Schlagschatten auf eine randlose Form zu zeichnen. Es funktionierte. aber es war buggy wie die Hölle.

Ich habe erreicht, was Sie zu tun versuchen, aber Sie werden es nicht mit Managed C#/NET tun rein. Sie müssen mit P/Invoke direkt in GDI/GDI + anrufen.

1

Es scheint nicht ein Weg, um dieses von .NET Forms selbst zu sein.

Die Definition von alpha blending in .NET Zustände:

Der Alpha-Wert gibt die Transparenz der Farbe - das Ausmaß zu dem die Farbe vermischt mit der Hintergrundfarbe ist. Alpha-Werte reichen von 0 bis 255, wobei 0 für eine vollständig transparente Farbe steht und 255 für eine vollständig deckende Farbe steht.

Alpha-Blending ist ein Pixel-für-Pixel-Blending von Quellen- und Hintergrundfarbdaten.Jede der die drei Komponenten (rot, grün, blau) eine gegebene Quellenfarbe ist gemischt mit der entsprechenden Komponente des Hintergrundfarbe nach folgenden Formel:

displayColor = sourceColor × alpha/255 + backgroundColor × (255 – alpha)/255 

Hinweis gibt es keine Berücksichtigung der Transparenz des Hintergrunds bei der Berechnung der Alpha-Mischung.

wäre die nächste Problemumgehung die CompositingMode zu Quellkopie zu setzen: anstelle einer Mischung aus blau + Hintergrund

e.Graphics.CompositingMode = CompositingMode.SourceCopy; 

Dies verhindert, dass die transparente Farbe mit der Hintergrundfarbe Mischen werden so Ihre Pinsel blau sein, Farbe. Ihr Pinsel wird jedoch immer noch undurchsichtig sein.

Verwandte Themen