winforms C#中Overlapped PictureBox的透明度问题

更新时间:2024-04-26 下载TXT文档 下载Word文档

我在重叠的面板PictureBox中显示,因为使用了每个PictureBox
作为一层。 第一次定义PictureBox并将其添加到面板中时,它是背景色
是透明的,并且图像为空。

问题是,底层看不到,透明的图像,显示了
面板的地面。 唯一的区别是可以看到底部的PictureBox图像。

我已经尝试过使用其他控件(例如标签)。 问题无法解决:(

谢谢。

  • 这有点难以理解。 我认为,如果您以不同的方式解释它,您可能会得到一些答案。

这是因为,如果我没记错的话,将背景色设置为"透明"(其实际值为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)

  • 我怎么称呼它,以在Winforms中创建一个透明面板
  • 您可以将上面的类放入您引用的控件库项目中(这就是我们所做的),也可以将其作为.cs文件直接包含在您的项目中。 除非您添加它,否则它不会显示在您的工具箱中。 不过,您可以将常规面板拖动到设计区域中,然后打开designer.cs文件,然后将对象手动更改为特殊的TransparentPanel。
  • public const int WS_EX_TRANSPARENT = 0x20; cp.ExStyle | = WS_EX_TRANSPARENT;
  • @SeanHanley终于我找到了想要的东西,我找不到关于在另一个控件上制作透明面板的任何有用的文章。 谢谢你这么好的帖子

这是我的看法:

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
  • 该死的,这确实有效! 但是请注意,PictureBoxSizeMode.Zoom无法正常工作,并且如果允许基本图像缩放到父容器,则可能需要手动设置子PictureBox的尺寸。

你应该做

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

回到顶部