我在重叠的面板
作为一层。 第一次定义
是透明的,并且图像为空。
问题是,底层看不到,透明的图像,显示了
面板的地面。 唯一的区别是可以看到底部的
我已经尝试过使用其他控件(例如标签)。 问题无法解决:(
谢谢。
这是因为,如果我没记错的话,将背景色设置为"透明"(其实际值为null,对吗?)并不是真正的透明。 Windows要做的是查看控件的父容器的背景色并将控件的背景色设置为该值。
您可以看到这种情况,特别是在面板上。如果没有内容,设置为"透明"的面板应该让您在它们后面看到,对吗?错误。如果将面板放置在许多文本框控件的顶部,并将该面板设置为"透明",则将无法看到其后面的文本框。
相反,要获得真正的透明性,您必须为有问题的控件重载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 Forms应用程序中创建了真正透明的面板。我们将其作为一种技巧来解决"右键单击上下文菜单出现在按钮控件顶部"的问题。 (短码网-duanma.net)
这是我的看法:
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方法。
我已经能够在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
你应该做
pe.Graphics.DrawImage(Image, 0, 0, Image.Width, Image.Height);
这样您的图像就不会被拉伸
以上就是短码网小编为大家整理的《winforms C#中Overlapped PictureBox的透明度问题》相关内容,希望大家喜欢。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将联系本站反馈,一经查实,立即处理!
《winforms C#中Overlapped PictureBox的透明度问题》文档下载仅供参考学习,下载后请在24小时内删除。
转载注明出处:https://www.duanma.net/article/21effd7a046.html