簡體   English   中英

如何使PictureBox真正透明

[英]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控件不是真正透明的。

您的選擇是:

  • 更改為WPF
  • 使用PictureBox.Region剪輯控件的不需要的(“透明”)區域
  • 看看是否有第三方控件可以做您想要的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM