2012-04-22 4 views
7

UPDATE: Ich machte eine Pause von ein paar Tage mit dem Transparenz-Zeug zu mischen. Ich habe heute Abend wieder damit angefangen. Ich habe ein neues Ergebnis mit Hans Passant Lösung: new result http://img3.imageshack.us/img3/4265/icontransp.jpg http://img3.imageshack.us/img3/4265/icontransp.jpgWie kann ich einem C# -Formular Transparenz hinzufügen, während die Steuerelemente sichtbar bleiben?

Passanten Lösung der Frage des transparenten Hintergrund Gradienten löst. Ich bin jedoch immer noch mit dem Problem konfrontiert, dass die transparenten Farben in meinem Symbol mit der BackColor des Formulars verschmelzen. Sie können die Fuchsia um verschiedene Teile des Symbols im obigen Bild sehen.

ORIGINAL INHALT:

Ich habe jetzt mehrere Stunden bei dieser gehen, und ich habe nicht viel Glück gehabt. Ich habe mit Control.Region, Form.TransparencyKey, Form.Opacity und ein paar andere zufällige Dinge mit einigen funky Effekte vermasselt.

In letzter Zeit habe ich versucht, meinen Desktop anzupassen und beschloss, mit Application Docks zu verwirren. Nachdem ich gesehen hatte, was der Mac andocken und ein paar Windows-Implementierungen von Drittanbietern zu bieten hatte, beschloss ich, dass ich mein eigenes bauen wollte.

Schließlich möchte ich mit der Win32-API weitermachen. Für den Moment möchte ich nur etwas arbeiten mit so viel C# und .Net Framework-Fähigkeiten wie möglich.

Es gibt ein paar Dinge, die ich in dieser Anwendung zu tun in der Lage sein wollen:

  • Anzeige ein Formular/Menü mit einem Gradienten Hintergrund.
  • Lassen Sie das Formular/Menü Transparenz, während die Symbole undurchsichtig bleiben.
  • Zeigen Sie Symbole an, die transparente Hintergründe enthalten.
  • Das Menü und die Symbole sollten in der Lage sein, mausbezogene Ereignisse zu empfangen (Hover, Leave, Click, Dragover, Dragdrop und einige andere).

Dies ist der Effekt für schieße ich: Desired Effect http://img207.imageshack.us/img207/5716/desired.jpg http://img207.imageshack.us/img207/5716/desired.jpg

Dieses Bild zeigt die visuellen Effekte, die ich zu erreichen bin versucht. Das war eine Haut, die ich für ein Programm namens Rainmeter gemacht habe. Das Bild zeigt Notepad ++ hinter dem Skin, wobei einige der Skin-Dateien im Editor geöffnet sind. Das Menü ist transparent, aber die Symbole bleiben opak.

Mein Ansatz:

ein Formular verwenden, um als das Menü wie eine logische erste Wahl schien mir. Ich habe ein grundlegendes Verständnis von Ereignissen. Ich bin mir nicht ganz sicher, wie ich meine eigenen Klickereignisse erstellen soll, daher würde ein Formular das Arbeiten mit Ereignissen ein wenig erleichtern. Ich habe einige Optionen für die Symbole betrachtet. Ich entschied mich, PictureBoxen für die Symbole zu verwenden, da sie Bilder speichern und Ereignisse empfangen können.

Sobald ich den Code für die gesamte strukturelle Logik meines Menüs fertig war, begann ich damit herumzuspielen, um den gewünschten visuellen Effekt zu erzielen. Form.Opacity beeinflusste die Transparenz von allem auf dem Formular. Da die Symbole vollständig undurchsichtig sein sollen, habe ich diese Eigenschaft in Ruhe gelassen. Ich habe versucht, die BackColor auf Farbe einzustellen.Transparent, aber das gibt einen Fehler. Ich spielte mit einigen Kombinationen um ... Combination Effects http://img204.imageshack.us/img204/757/effectsi.jpg http://img204.imageshack.us/img204/757/effectsi.jpg

ich die Steigung mit einem Drawing2D.LinearGradientBrush in eine Bitmap zog. Diese Bitmap wurde dann als Form.BackgroundImage oder als PictureBox.Image platziert. Wenn die PictureBox verwendet wurde, wurde sie so dimensioniert, dass sie das gesamte Formular abdeckte und an die Rückseite gesendet wurde.

Ich bemerkte, dass einige der Form.BackgroundColor mit den Umrisse meiner Symbole gemischt werden würde. Die Symbole haben Transparenz entlang der Kanten für eine glattere Darstellung. Da die Symbole die BackgroundColor des Formulars aufnehmen, denke ich, dass die PictureBoxen neue Bilder erstellen, wenn die Symbole in das Formular geladen werden. Die halbtransparenten Teile des Bildes werden dann mit der Hintergrundfarbe des Formulars zusammengeführt, wenn sie mit den Farben, die sich hinter dem Formular befinden, zusammengeführt werden sollen.

effect with white desktop http://img838.imageshack.us/img838/8299/whitedesktop.jpg http://img838.imageshack.us/img838/8299/whitedesktop.jpg

In diesem Bild, das Sie die Fuchsia vorhandenen in den Symbolen sehen können, auch wenn das Fuchsia Farbe des Formulars jetzt vollständig transparent ist. Ich habe vergessen darauf hinzuweisen, dass in jedem Fall der gleiche grüne bis gelbe Farbverlauf mit einem Alpha-Wert von 150 verwendet wurde. In den Bildern, in denen der Farbverlauf nicht grün aussieht, liegt das daran, dass sich die transparenten Farben mit dem Fuchsia-Hintergrund vermischen.

Ich bin nicht wirklich sicher, was ich von hier aus tun soll. Ich habe das Gefühl, ich könnte bekommen, was ich will, wenn ich die Form irgendwie völlig transparent machen könnte. Ich dachte auch, dass ich vielleicht mehr Glück habe, wenn ich die Symbole zeichne, anstatt PictureBoxes zu verwenden. Das Problem wäre dann, die Symbole für den Empfang von Mausereignissen einzurichten. (Ich habe meine eigenen Ereignisse nie gemacht, und ich denke, dass es einige Win32-API-Aufrufe enthalten würde.)

Gibt es noch etwas, das ich mit den PictureBoxen tun kann, um den gewünschten Effekt zu erzielen? Was auch immer der Fall ist, ich bin offen für irgendwelche Ideen oder Vorschläge für den Gesamteffekt, den ich erreichen möchte.

Antwort

0

OK, ich habe ein bisschen verloren in all dem, aber von der Beschreibung im ursprünglichen Absatz würde ich sicherstellen, dass das Hintergrundrechteck NICHT das visuelle Elternteil der Bildboxen ist. Bilden Sie sie überlappende Geschwister, mit den PictureBoxen in Front mit Panel.Zindex.

Dann können Sie nur die Deckkraft des Rechtecks ​​ändern, ohne die Symbole zu beeinflussen. Stellen Sie außerdem sicher, dass die Bilddateien der Symbolquelle einen transparenten Hintergrund haben.

Sollte funktionieren, denke ich.

+0

Hinweis meine Antwort soll in WPF arbeiten. Nicht sicher, ob die Dinge in Winforms anders sind. –

+0

Ah, ich wollte gerade sagen, dass ich das, was Sie in Ihrem Kommentar beschrieben haben, schon ziemlich gut gehandhabt habe. Mein Problem ist, dass ich nicht die Transparenz erreichen kann, um das ganze Formular durchzugehen. Ich kann verschiedene Elemente oben auf dem Formular verwenden, um sich so zu verhalten, wie ich es möchte. Der Hintergrund des Formulars hat mir jedoch Probleme bereitet, um der gesamten Anwendung die Transparenz zu geben, die ich möchte. – Cheese

+0

(Ich drücke Enter, um einen neuen Absatz für die Lesbarkeit zu starten, aber es beendete den Kommentar. Ich fange einfach mit dem Neuen an.) Ich habe noch nichts in WPF probiert. Ich habe gesehen, dass es öfter benutzt wird als in früheren Jahren, wenn es um Grafikdesign ging. Ich denke, der xml (xaml?) Teil davon soll das Einrichten etwas einfacher machen. Ich kann es ausprobieren, sobald ich diese Version meines Projekts funktioniert habe. – Cheese

11

Dies ist in Winforms ziemlich einfach zu tun. Was Sie brauchen, ist ein Sandwich von zwei Formen. Der untere sollte den Hintergrund mit transparentem Verlauf liefern, der obere sollte die Symbole zeichnen und Mausklicks behandeln. Einiger Beispielcode:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     this.TopMost = true; 
     this.FormBorderStyle = FormBorderStyle.None; 
     this.TransparencyKey = this.BackColor = Color.Fuchsia; 
     this.Opacity = 0.3; 
     var overlay = new Form(); 
     overlay.FormBorderStyle = FormBorderStyle.None; 
     overlay.TransparencyKey = overlay.BackColor = Color.Fuchsia; 
     overlay.StartPosition = FormStartPosition.Manual; 
     overlay.Location = this.Location; 
     overlay.MouseDown += HandleIconClick; 
     this.Resize += delegate { overlay.Size = this.Size; }; 
     this.LocationChanged += delegate { overlay.Location = this.Location; }; 
     overlay.Paint += PaintIcons; 
     this.Paint += PaintBackground; 
     this.Load += delegate { overlay.Show(this); }; 
    } 
    private void PaintBackground(object sender, PaintEventArgs e) { 
     var rc = new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height); 
     using (var br = new LinearGradientBrush(rc, Color.Gainsboro, Color.Yellow, 0f)) { 
      e.Graphics.FillRectangle(br, rc); 
     } 
    } 
    private void PaintIcons(object sender, PaintEventArgs e) { 
     e.Graphics.DrawIcon(Properties.Resources.ExampleIcon1, 50, 30); 
     // etc... 
    } 
    void HandleIconClick(object sender, MouseEventArgs e) { 
     // TODO 
    } 
} 

, die wie dies mit den etwas zufälligen Farben und Symbol sieht die ich ausgewählt hat:

enter image description here

+0

Ich schreibe ein Paint-Event, das deinem sehr ähnlich ist, aber es funktioniert nicht. Also habe ich deine Veranstaltung ausprobiert und es funktioniert auch nicht. Es ist ein sehr merkwürdiges Verhalten. –

+0

Dies ist das Ergebnis ohne den FormBoderStyle zu setzen. [SnapShot] (http://i41.tinypic.com/2lwb21k.jpg) –

+0

Nun, die untere Form des Sandwich ist sichtbar. Sie haben Paint nicht implementiert, um den Farbverlaufshintergrund zu zeichnen, und es gibt keine Anzeichen für das oberste Formular, möglicherweise weil Paint nicht implementiert wurde. Bitte starten Sie Ihre eigene Frage, wenn Sie Hilfe benötigen. –

Verwandte Themen