Csharp/C#教程:C#重叠PictureBox的透明度问题分享


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

(0)
上一篇 2021年11月26日
下一篇 2021年11月26日

精彩推荐