[英]How to make a PictureBox truly transparent
我有一個PictureBox,可以垂直移動。 PictureBox中顯示的圖像是透明的GIF,因此在圖像查看器中查看時,它沒有背景。
問題是,當我在應用程序中移動PictureBox時,PictureBox的背景移動得很奇怪-幾乎就像PictureBox本身具有背景一樣。
之前:
之后(移動時):
一些代碼:
path = "C:\\note.gif";
note.Image = Image.FromFile(path);
note.Visible = true;
note.BackColor = Color.Transparent;
panel.Controls.Add(note);
我也嘗試過將Picturebox設置為雙緩沖,但這也不起作用。
盡管WinForms不太適合用戶控件的透明性,但它是可能的。 在這里看到這篇文章 。 在本文中,作者建議從Panel而不是UserControl派生,並重寫OnPaintBackground方法以不執行任何操作。 這將阻止您繪制背景
protected override void OnPaintBackground(PaintEventArgs pevent)
{
//do nothing
}
protected override void OnMove(EventArgs e)
{
RecreateHandle();
}
// Override the CreateParams property:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = 0x00000020; //WS_EX_TRANSPARENT
return cp;
}
}
最后,覆蓋OnPaint函數,您可以繪制圖片框。
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
//Do your drawing here
}
使用此功能,您可以創建一個具有透明度的自定義圖片框,但請注意,如果將其實時在屏幕上移動,則會出現閃爍和模糊。
使用這種技術和類似技術,我們設法獲得了WinForms應用程序Premex XPort,以與他們的網站類似的品牌進行渲染。 這涉及多個透明控件,繪畫hack和各種使其正確顯示的方法。
總之,Winforms不能做到這一點的原因是在基於Win32的技術中,一個控件在屏幕上擁有一個像素。 正如您在HTML或WPF中所期望的那樣,無法通過透明度真正地合成像素。 后來的Windows技術(WPF)表現特別出色,因此,如果您真的希望在應用程序中大量使用透明性,我建議至少部分遷移到該平台(WPF可以在WinForms中托管,反之亦然)。
最好的祝福,
Win32控件不是真正透明的。
您的選擇是:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.