C#重叠PictureBox的透明度问题
我在一个面板PictureBox
重叠显示,因为每个PictureBox
都用作一个图层。 第一次定义PictureBox
并将其添加到面板时,它的背景颜色是透明的,并且它的图像是空的。
问题是,无法看到底层,透明图像显示面板的地面。 例外的是可以看到底部PictureBox
的图像。
我已尝试使用其他控件,如label。 问题无法解决:(
谢谢。
这是因为,如果我没记错的话,设置Transparent的背景颜色(它的实际值是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窗体应用程序中创建真正透明的面板。 我们用它来修复“右键单击上下文菜单出现在按钮控件之上”问题。
这是我的看法:
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);
所以你的图像不会被拉伸
上述就是C#学习教程:C#重叠PictureBox的透明度问题分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/961650.html