2012-04-22 47 views
7

更新:我從透明的東西休息了幾天休息。我今晚開始再次搞砸了。我使用了漢斯帕桑特的解決方案有新的結果: new result http://img3.imageshack.us/img3/4265/icontransp.jpg http://img3.imageshack.us/img3/4265/icontransp.jpg如何在保持控件可見的情況下向c#表單添加透明度?

帕桑特的解決方案並解決透明背景漸變的問題。但是,我仍然遇到了與圖形的BackColor混合的圖標中的透明顏色問題。您可以在上圖中看到圖標各個部分的紫紅色。

原創內容:

我在這個已經持續了幾個小時,現在,我還沒有多少運氣。我搞砸了Control.Region,Form.TransparencyKey,Form.Opacity和一些其他隨機事物,帶有一些時髦的效果。

最近我一直在試圖定製我的桌面,並決定與應用程序碼頭混亂。在看到Mac Dock和幾個第三方Windows實施必須提供的內容之後,我決定自己創建自己的。

最終我想繼續使用Win32 API。現在我只想盡可能使用盡可能多的C#和.Net框架功能。

有幾件事情我希望能夠在這個應用程序執行:

  • 顯示的形式/有一個漸變背景菜單。
  • 允許表單/菜單具有透明度,同時保持圖標不透明。
  • 顯示包含透明背景的圖標。
  • 菜單和圖標應該能夠接收鼠標相關的事件(懸停,離開,點擊,dragover,dragdrop,和其他一些)。

這是我拍攝的效果: Desired Effect http://img207.imageshack.us/img207/5716/desired.jpg http://img207.imageshack.us/img207/5716/desired.jpg

此圖像顯示了視覺效果我想實現的。這是我爲一個名爲Rainmeter的程序製作的皮膚。該圖像顯示了皮膚後面的Notepad ++,其中一些皮膚文件在編輯器中打開。該菜單是透明的,但圖標保持不透明。

我的方法:

使用窗體來充當菜單似乎是一個邏輯的第一選擇我。我對事件有基本的瞭解。我不太清楚如何創建自己的點擊事件,因此表單可以使事件工作變得更輕鬆。我考慮了一些圖標的選項。我決定使用圖片框作爲圖標,因爲它們可以保存圖像並接收事件。

一旦我完成了我菜單中所有結構邏輯的代碼,我就開始玩弄它,試圖獲得我想要的視覺效果。 Form.Opacity影響了表單上所有內容的透明度。由於我希望圖標完全不透明,因此我獨自離開了此屬性。我嘗試將BackColor設置爲Color。透明,但是會給出錯誤。我打得四處數組合... Combination Effects http://img204.imageshack.us/img204/757/effectsi.jpg http://img204.imageshack.us/img204/757/effectsi.jpg

我畫的梯度與Drawing2D.LinearGradientBrush成位圖。然後將此位圖放置爲Form.BackgroundImage或PictureBox.Image。如果使用,PictureBox的大小可覆蓋整個表單併發送到後面。

我注意到一些Form.BackgroundColor會與我的圖標輪廓混合在一起。這些圖標沿邊緣具有透明度,以獲得更平滑的外觀。由於圖標正在拾取窗體的BackgroundColor,這使我認爲PictureBox在圖標加載到窗體中時正在創建新圖像。然後圖像的半透明部分與Form的BackgroundColor合併,當它們與表單後面的任何顏色合併時。

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

在此圖像中可以看到紫紅色的圖標存在即使窗體的紫紅色現在是完全透明的。我忘了指出,在每種情況下都使用了Alpha值爲150的相同綠色至黃色漸變。在漸變看起來不綠的圖像中,這是因爲透明色與紫紅色背景混合在一起。

我不確定該從這裏做什麼。如果我能以某種方式使表單完全透明,我覺得我可以得到我想要的。我也在想我可能會有更好的運氣而不是使用PictureBox來繪製圖標。接下來的問題是設置圖標來接收鼠標事件。 (我從來沒有做過自己的事件,我認爲它會涉及到一些Win32 API調用。)

是否還有其他事情我可以使用PictureBox來做到我想要的效果?無論如何,我願意爲我想要達到的整體效果提供任何想法或建議。

回答

0

好吧,我有點失落了,但從原始段落的描述中,我會確保背景矩形不是圖片框的視覺父母。使它們重疊的兄弟姐妹,使用Panel.Zindex前面的圖片框。

然後你可以改變矩形的不透明度,而不會影響圖標。還要確保圖標源圖像文件具有透明背景。

我應該工作。

+0

注意我的答案應該在WPF工作。不知道Winforms中的東西是否有所不同。 – 2012-04-22 10:56:18

+0

啊,我只是想說,我已經很好地處理了你在評論中描述的內容。我的問題是,我無法透過表單完成透明度。我可以在表單頂部獲取各種元素以表現我想要的方式。但是,表單的背景一直給我提供問題,以使整個應用程序具有我想要的透明度。 – Cheese 2012-04-22 16:42:26

+0

(我按回車開始一個新的段落的可讀性,但它結束了評論,我會剛剛開始這個新的。)我還沒有嘗試過WPF中的任何東西。在處理某些圖形方面,我發現它比以往更經常使用。我認爲它的xml(xaml?)部分應該使設置更容易一些。一旦我得到我的項目的這個版本的工作,我可以嘗試一下。 – Cheese 2012-04-22 16:45:26

11

這在Winforms中很容易實現。你需要的是三明治兩種的形式。底部應該提供透明的漸變背景,頂部應該繪製圖標並處理鼠標點擊。一些示例代碼:

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 
    } 
} 

看起來像這樣與有些隨機顏色和圖標我選擇:

enter image description here

+0

我寫了一個非常類似於你的Paint事件,但它不起作用。所以我嘗試了你的活動,但它不起作用。這是一個非常奇怪的行爲。 – 2012-04-22 11:15:23

+0

這是沒有設置FormBoderStyle的結果。 [SnapShot](http://i41.tinypic.com/2lwb21k.jpg) – 2012-04-22 11:36:36

+0

那麼,三明治的底部形式是可見的。您沒有實現Paint來繪製漸變背景,並且沒有頂層窗體的跡象,可能是因爲它沒有實現Paint。如果您需要幫助,請開始您自己的問題。 – 2012-04-22 11:42:14

相關問題