2015-09-04 42 views
5

我最近開始探索Visual Studio。 我試圖創建一個幻燈片菜單。更具體地說,當用戶按下按鈕時,子菜單將彈出到右側。爲了實現這個目標,我放置了Panel來調整自己的大小。除了功能之外,我想添加更多設計,並使Panel看起來有點褪色。在Visual Studio窗體窗體的面板上使用不透明度的技巧?

我知道在Visual Studio中的​​沒有不透明性,但我在想如果有人知道如何實現它的方式欺騙​​的想法。我嘗試了Picture Box,但也沒有將不透明度作爲屬性。我避免使用視覺工作室提供的常規Menu對象,因爲我想添加更多設計。有任何想法嗎?

+0

的[我如何可以設置的WinForms面板的透明度或透明度?(HTTP可能重複: //stackoverflow.com/questions/4463363/how-can-i-set-the-opacity-or-transparency-of-a-panel-in-winforms) –

+0

我已經看到了這個,但這不適合我,這就是爲什麼我問。 Thx –

+1

我不認爲這是重複的。海報知道沒有不透明的控件。 – taffer

回答

2

要使控件「透明」,您應該將其父項的右側區域繪製到控件上。這是Button在繪製其內容之前所做的,因此圓角將是透明的。

要模仿半透明度,你可以畫的形式到面板上,然後畫一些與阿爾法:

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    PaintTransparentBackground(panel1, e); 
    using (Brush b = new SolidBrush(Color.FromArgb(128, panel1.BackColor))) 
    { 
     e.Graphics.FillRectangle(b, e.ClipRectangle); 
    } 
} 

private static void PaintTransparentBackground(Control c, PaintEventArgs e) 
{ 
    if (c.Parent == null || !Application.RenderWithVisualStyles) 
     return; 

    ButtonRenderer.DrawParentBackground(e.Graphics, c.ClientRectangle, c); 
} 

Semi-transparent panel

請注意ButtonRenderer.DrawParentBackground不畫的控制的形式,它與面板重疊,但只有形式的背景。

+0

如果有控件需要重疊,則仍然可以使用drawtobitmap在位圖中獲取目標。雖然動畫在winforms中會看起來像shite .. – TaW

10
  1. 創建一個繼承自Panel的類。
  2. 爲構造函數中的控件設置樣式ControlStyle.Opaque

如果爲真,控制繪製不透明的背景是不是 畫。

  • 覆蓋CreateParams並設置WS_EX_TRANSPARENT風格它。
  • 指定使用此樣式創建的窗口是透明的。 也就是說,窗口下面的任何窗口都不會被窗口遮擋。使用此樣式創建的窗口只有在所有兄弟窗口已更新後纔會收到WM_PAINT 消息。

  • 創建接受值從0到100,其將被用作背景的α通道的Opacity屬性。
  • 覆蓋OnPaint並使用從BackGroundColorOpacity創建的啓用alpha的Brush填充背景。
  • 完整代碼

    public class ExtendedPanel : Panel 
    { 
        private const int WS_EX_TRANSPARENT = 0x20; 
        public ExtendedPanel() 
        { 
         SetStyle(ControlStyles.Opaque, true); 
        } 
    
        private int opacity = 50; 
        [DefaultValue(50)] 
        public int Opacity 
        { 
         get 
         { 
          return this.opacity; 
         } 
         set 
         { 
          if (value < 0 || value > 100) 
           throw new ArgumentException("value must be between 0 and 100"); 
          this.opacity = value; 
         } 
        } 
        protected override CreateParams CreateParams 
        { 
         get 
         { 
          CreateParams cp = base.CreateParams; 
          cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT; 
          return cp; 
         } 
        } 
        protected override void OnPaint(PaintEventArgs e) 
        { 
         using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 255/100, this.BackColor))) 
         { 
          e.Graphics.FillRectangle(brush, this.ClientRectangle); 
         } 
         base.OnPaint(e); 
        } 
    } 
    

    截圖

    enter image description here

    +0

    不錯的解決方案。我用一個定時器實現它,所以不透明度將從100開始,然後降低到0.然而,它是瘋狂的閃爍。任何想法如何獲得流暢的動畫? – ChrisB

    +1

    @ChrisB我會使用計時器檢查它,但也許你會發現[這篇文章](http://stackoverflow.com/a/34338985/3110834)有用。 –

    +0

    @ChrisB順便說一句,我使用[此解決方案](http://stackoverflow.com/a/39068779/3110834)的情況下,我需要在Windows窗體中的半透明覆蓋。 (這可能聽起來毫不相關,但在某些情況下使用表格作爲疊加層是一種更可靠的解決方案。) –