我显示在面板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