【C#】透明控制元件的實現
最近做的一個任務中需要用到透明控制元件,結果在網上找了好久,也沒有一個能真正實現的。當然,講透明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...因為這樣畫出的圖形會被重新整理的。