1. 程式人生 > >【C#】透明控制元件的實現

【C#】透明控制元件的實現

  轉載 http://wtunuiyf.blog.163.com/blog/static/18003200871951529580/ 
  最近做的一個任務中需要用到透明控制元件,結果在網上找了好久,也沒有一個能真正實現的。當然,講透明form的到是很多,需要呼叫Windows API,但並不能滿足我的要求。於是一邊參考資料,一邊摸索,找出了一個折中的方法來實現透明控制元件。
  這裡,透明控制元件我指的是控制元件上還有其它圖形的透明,而不是單純把背景色設成透明,那就沒什麼意義了。下面以panel為例:
  過載panel的OnPaint()方法:

  private void pnlNavigate_Paint(object sender, PaintEventArgs e)
        {
            base.OnPaint(e);
    
            // 背景設成透明還是必要的,控制元件上的圖形在後面畫
            pnlNavigate.BackColor = Color.Transparent;
            Rectangle rect = e.ClipRectangle;
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    
            // 畫控制元件上的圖形,這裡以一個線性漸變的圖為例。
            // 注意此處,128是透明度,範圍是0-255。
            // 如果控制元件上放一個不透明的圖片,則須先將其處理為透明的。
            LinearGradientBrush baseBackground = new LinearGradientBrush(rect,
                        Color.FromArgb(128, 191, 191, 191),
                        Color.FromArgb(128, 255, 255, 255),
                        270, false);
           
            e.Graphics.FillRectangle(baseBackground, rect);
            e.Graphics.Flush();
        }

  編譯通過後,就可以看到一個透明的panel在form上了。
  然而,這裡還有一個問題,即此處的透明,只是相對於parent的背景而言,如果你想在panel的下面再放一個其它的控制元件,例如一個button,那麼這個button還是會被panel所覆蓋,而直接“透視”到背景上。
   這裡,便可以使用折中的辦法,將button也給畫到背景上,便可以解決了。至於如何把button畫到背景上,可以參考網上別的文章,此處不再贅述。 但有一點值得注意的是,我們應該新建一個bitmap,將圖都畫到bitmap上,然後設定,control.background = bitmap,而不是直接使用Graphics g = control.CreateGraphics(); g.Draw...因為這樣畫出的圖形會被重新整理的。