2016-07-16 7 views
1

Ich versuche, ein Formular zu zeichnen, das einen transparenten Hintergrund und einen verschwommenen Schlagschatten von einem Hauptkörper hat.Winforms transparentes Formular Problem

Die Art, wie ich dies getan habe, ist das Formular als Begrenzungsrahmen zu verwenden, dann den Körper des tatsächlichen Formulars mit dem Rand auf den Seiten zu zeichnen, damit der Schatten angezeigt wird. Der Schatten dehnt sich hinter dem gezeichneten Körper aus.

Also, ich habe 1 Formular, in dem ich innen zeichnen. Ich möchte, dass der Hintergrund des Formulars transparent ist, sodass nur der gezeichnete Körper und der Schatten angezeigt werden.

Ich habe ein paar Probleme mit dem Schatten. Der Schatten ist eine Bitmap, in der ich AForges Gaußsche Unschärfe anwende, um den Schatteneffekt zu erzeugen. Die Bitmap wird hinter dem gezeichneten Körper platziert, sodass sie als Schatten erscheint.

Hier ist das Problem: Die Hintergrundfarbe des Formulars bleibt gezeichnet, wo der Schatten ist. Die Schatten-Bitmap ist bis auf die unscharfen Schwarztöne transparent.

Ich habe versucht, backcolor auf transparent, oder eine misc-Farbe und dann transparencykey auf die gleiche Farbe einzustellen. Ergebnisse bleiben gleich.

Bild von dem, was ich erreichen möchte: enter image description here

(hellrosa nicht Teil des Programms ist es, sich vorstellen, es als Desktop)

Bild von dem, was ich erhalte: enter image description here

(Ich zeichne nur den Schatten für dieses Beispiel, nicht den weißen Körper (was gut funktioniert), der Hintergrund des Formulars weigert sich transparent zu werden, wo der Schatten existiert ..)

Dies ist der Code zum Erstellen der Schatten-Bitmap.

private void _CreateShadow() 
    { 
     shadowImg = new Bitmap(m_ShadowRect.Width, m_ShadowRect.Height, PixelFormat.Format32bppArgb); 
     Graphics g = Graphics.FromImage(shadowImg); 
     int diameter = Math.Min(shadowImg.Width, shadowImg.Height); 
     g.DrawEllipse(m_ShadowPen, m_ShadowWidth, m_ShadowWidth, m_BodyRect.Width - m_ShadowWidth, m_BodyRect.Height - m_ShadowWidth); 
     filter.ApplyInPlace(shadowImg); 
    } 

    private void _DrawShadow(Graphics g) 
    { 
     g.DrawImage(shadowImg, m_ShadowRect.X, m_ShadowRect.Y); 
    } 

    protected override void OnPaint(PaintEventArgs pe) 
    { 
     base.OnPaint(pe); 

     _DrawShadow(pe.Graphics); 
     _DrawBody(pe.Graphics); 
    } 

Bitte, irgendwelche Hinweise?

+1

Sie können Layered Windows verwenden. Die Verwendung eines Ebenenfensters kann die Leistung und die visuellen Effekte für ein Fenster, das eine komplexe Form hat, seine Form animiert oder Alpha-Überblendungseffekte verwenden kann, erheblich verbessern. Hier ist ein Beispiel, das ein geformtes Formular mit einem PNG - Bild erstellt: [C# Windows Form Transparent Background Image] (http://StackOverflow.com/a/33531201/3110834) –

+0

@RezaAghaei Vielen Dank, dieser Ansatz ist der gleiche wie der eine kommentierte unten. Große Antwort –

Antwort

1

Werfen Sie einen Blick auf diese file in a github repository, vor allem die Leitungen 123 - 131, 253 - 415. Der Code GDI + Methoden verwendet transparente Bitmap zu zeichnen, die die Form Hintergrund ersetzt.

Sie kann nichts zeichnen transparent auf einem Form, weil alle Methoden (wie OnPaint) Verwendung Format24bppRgbnichtFormat32bppArgb, das ist, was Sie brauchen.

+0

Gibt es eine Möglichkeit, die ursprüngliche onpaint des Formulars (für andere Zeichnung als die Schatten-Bitmap) zusammen mit der vorgeschlagenen Methode zu verwenden?Ich habe versucht, beide zur gleichen Zeit zu verwenden, aber dann macht das Programm nur alles komplett transparent –

+0

Ich habe in der Vergangenheit mit 'OnPaint' experimentiert und die Ergebnisse hängen davon ab, welche OS-Version Windows 8 Alpha-Farben nicht zeichnen kann, aber Fenster 10, kann. Alpha Colors funktionieren nur, wenn Sie 'base.OnPaint (e);' nicht setzen. Außerdem müssen Sie beim Neuzeichnen alles löschen, sonst überlagern sich die transparenten Farben übereinander. –