我顯示在面板PictureBox
重疊,因爲每個PictureBox
使用 作爲一個層。第一次定義了PictureBox
並將其添加到面板後,它的背景顏色是 是透明的,它的圖像是空的。透明度問題重疊PictureBox在C#
問題是,底層無法看到,透明圖像顯示面板的地面 。例外是看到底部PictureBox
的圖像。
我試圖用其他控件像標籤。這個問題不能得到解決:(
感謝。
我顯示在面板PictureBox
重疊,因爲每個PictureBox
使用 作爲一個層。第一次定義了PictureBox
並將其添加到面板後,它的背景顏色是 是透明的,它的圖像是空的。透明度問題重疊PictureBox在C#
問題是,底層無法看到,透明圖像顯示面板的地面 。例外是看到底部PictureBox
的圖像。
我試圖用其他控件像標籤。這個問題不能得到解決:(
感謝。
這是因爲,如果我沒有記錯,設置的透明背景顏色(它的實際值是空,是吧?)是不是真的透明 .Windows的功能是查看控件的父容器的背景顏色,並設置控件的背景顏色。
您可以看到這種情況尤其出現在面板上,如果沒有內容,設置爲透明的面板應該讓你看到它們後面,對不對如果你把面板放在一堆文本框控件的頂部,並將面板設置爲透明,你將無法使用e背後的文本框。
相反,爲了獲得真正的透明度,你必須重載OnPaintBackground來處理有問題的控件,並且基本上什麼都不做(不要讓它調用base.OnPainBackground!)......除此之外,大概,但這裏是我們這裏使用一個工作TransparentPanel控制的一個例子:
public class TransparentPanel : System.Windows.Forms.Panel
{
[Browsable(false)]
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;
}
}
protected override void OnPaintBackground(PaintEventArgs e)
{
// Do Nothing
}
}
我們使用這個類成功過去的Windows窗體應用程序創建真正透明面板。我們用它來修復「右鍵單擊上下文菜單出現在按鈕控件上」問題。
我該怎麼稱呼它,在Winforms中創建一個透明的面板 – user335160 2010-09-02 14:59:18
您可以將上面的類放到您引用的控件庫項目中(這就是我們所做的),或者您也可以直接將它作爲一個.cs文件文件。但是,除非您添加它,否則它不會顯示在您的工具箱中。不過,您仍然可以將常規面板拖入設計區域,然後打開designer.cs文件並手動將對象更改爲特殊的TransparentPanel。 – 2010-09-02 16:07:35
public const int WS_EX_TRANSPARENT = 0x20; cp.ExStyle | = WS_EX_TRANSPARENT; – Hbas 2012-08-04 15:25:51
這是我對吧:
class TransPictureBox : Control
{
private Image _image = null;
public Image Image
{
get
{
return _image;
}
set
{
_image = value;
}
}
public TransPictureBox()
{
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
}
protected override void OnPaint(PaintEventArgs pe)
{
if(Image != null)
pe.Graphics.DrawImage(Image, 0, 0);
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;
}
}
}
你應該多增加一些邏輯,如你所願,並相應修改OnPaint方法的形象定位。
你應該做
pe.Graphics.DrawImage(Image, 0, 0, Image.Width, Image.Height);
讓你的圖片不會被streched
我已經能夠在VB中做到這一點。但有一些技巧。首先,你必須添加圖片框到對方。其次,圖片框中的圖像必須是PNG。
對於這個應用程序,我必須在背景圖層上顯示3個不同的圖層,並使用複選框打開和關閉它們。如果它不起作用,請仔細研究如何保存您的PNG,對此有點挑剔。
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System
Public Class Form1
Dim MarkerBox1 As New PictureBox
Dim MarkerBox2 As New PictureBox
Dim MarkerBox3 As New PictureBox
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
PictureBox1.Image = New Bitmap("C:\BackGround.bmp")
MarkerBox1.Image = New Bitmap("C:\TestOverlay1.png")
MarkerBox1.BackColor = System.Drawing.Color.Transparent
MarkerBox1.Visible = True
MarkerBox1.SizeMode = PictureBoxSizeMode.AutoSize
PictureBox1.Controls.Add(MarkerBox1)
MarkerBox2.Image = New Bitmap("C:\TestOverlay2.png")
MarkerBox2.BackColor = System.Drawing.Color.Transparent
MarkerBox2.Visible = True
MarkerBox2.SizeMode = PictureBoxSizeMode.AutoSize
MarkerBox1.Controls.Add(MarkerBox2)
MarkerBox3.Image = New Bitmap("C:\TestOverlay3.png")
MarkerBox3.BackColor = System.Drawing.Color.Transparent
MarkerBox3.Visible = True
MarkerBox3.SizeMode = PictureBoxSizeMode.AutoSize
MarkerBox2.Controls.Add(MarkerBox3)
End Sub
Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
If CheckBox1.Checked Then
MarkerBox1.Visible = True
Else
MarkerBox1.Visible = False
End If
Visibilitychanged()
End Sub
Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged
If CheckBox2.Checked Then
MarkerBox2.Visible = True
Else
MarkerBox2.Visible = False
End If
Visibilitychanged()
End Sub
Private Sub CheckBox3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox3.CheckedChanged
If CheckBox3.Checked Then
MarkerBox3.Visible = True
Else
MarkerBox3.Visible = False
End If
Visibilitychanged()
End Sub
Private Sub Visibilitychanged()
PictureBox1.Controls.Clear()
MarkerBox1.Controls.Clear()
MarkerBox2.Controls.Clear()
MarkerBox3.Controls.Clear()
Dim PB As PictureBox = PictureBox1
If MarkerBox1.Visible Then
PB.Controls.Add(MarkerBox1)
PB = MarkerBox1
End If
If MarkerBox2.Visible Then
PB.Controls.Add(MarkerBox2)
PB = MarkerBox2
End If
If MarkerBox3.Visible Then
PB.Controls.Add(MarkerBox3)
PB = MarkerBox3
End If
End Sub
該死的,這個真的有用!但請注意,PictureBoxSizeMode.Zoom **不能**,並且您可能需要手動設置子PictureBox的尺寸(如果允許基礎圖像縮放到父容器)。 – 2013-09-19 19:27:48
這是有點難以遵循。我想如果你以不同的方式解釋,你可能會得到一些答案。 – 2009-08-05 19:06:43