winforms 控件上的透明图像

cnh2zyt3  于 2023-02-09  发布在  其他
关注(0)|答案(4)|浏览(211)

我在做一个有闪屏的应用程序。
我有一个图像,我想把下面的进度条一样:

    • 示例**

我已经成功地使位图透明。但是,现在,图像在进度条后面
"现在"

有没有办法让图像出现在进度条前面?谢谢。
代码:

public partial class Form1 : Form
{
    Bitmap m_l;
    public Form1()
    {
        InitializeComponent();

        m_l = Properties.Resources.LU;

        m_l.MakeTransparent(Color.Transparent);
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawImage(m_l, new Rectangle(new Point(0, -40), new Size(200, 264))); progressBar1.Refresh();
    }
}
x759pob2

x759pob21#

您可以将PictureBoxRegion配合使用来完成此操作。
在窗体中添加一个PictureBox。它将保存图像。根据需要将其放置为与ProgressBar重叠。将Image属性设置为覆盖图像。
在表单构造函数中,我们将设置PictureBoxRegion,区域定义控件的形状,我们将设置Region等于图像的非透明部分。

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
    pictureBox1.Region = CreateRegion(Properties.Resources.LU);
  }

  private static Region CreateRegion(Bitmap maskImage)
  {
    // We're using pixel 0,0 as the "transparent" color.
    Color mask = maskImage.GetPixel(0, 0);
    GraphicsPath graphicsPath = new GraphicsPath();
    for (int x = 0; x < maskImage.Width; x++)
    {
      for (int y = 0; y < maskImage.Height; y++)
      {
        if (!maskImage.GetPixel(x, y).Equals(mask))
        {
          graphicsPath.AddRectangle(new Rectangle(x, y, 1, 1));
        }
      }
    }

    return new Region(graphicsPath);
  }
}

这些代码大部分来自here

hgncfbus

hgncfbus2#

5****6个选项:
1.您可以将ProgressBar'sBackColor设置为Transparent。结果:

译文:
属性值无效。此控件不支持透明背景色。
对于子类也是如此。
1.你可以嵌套一个透明的Panel,将图像作为它的BackgroundImage

正如您所看到的,尽管面板和大部分图像是透明的,进度条仍然在它下面有一个矩形,它自己的BackColor;如上图所示,它不可能是透明的
1.您可以用面板覆盖
结果:

看起来很相似。但是这次背景色是面板在覆盖之前的原始背景。这就是winforms伪造透明度的方法;这个伪造的透明只适用于nested控件,而不是所有..
1.您可以在进度条的Paint事件中绘制图像。它没有一个,如果你把它子类化,它就不会为你工作。
总结一下:所有这些尝试都失败了结论很简单:ProgressBar是一个动画控件,不支持任何干扰。
1.最后一个选项:* * 编写你自己的**。你可以子类化一个PanelLabel,并编写你自己的进度条。许多人谁想要有一个自定义的外观,已经这样做了,你可以找到许多现成的例子。

    • 更新:看起来你可以有第六个选项,它将工作当且仅当你不需要半透明,如抗锯齿等。:你可以创建一个GraphicsPath来创建一个Region,它会用图像屏蔽**一些控件。所以虽然我的例子不起作用,OP的图像看起来可能很好。
zfciruhq

zfciruhq3#

作为方式,人是开发商,但接缝有一个真正薄弱的逻辑,邮政编码和链接其余的网站,可以死在任何时候,这里的2失踪行的答案

public static System.Drawing.Drawing2D.GraphicsPath Transparent(Image im)  
    {  
        int x;  
        int y;  
        Bitmap bmp = new Bitmap(im);  
        System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();  
        Color mask = bmp.GetPixel(0, 0);  

        for (x = 0; x <= bmp.Width - 1; x++)  
        {  
            for (y = 0; y <= bmp.Height - 1; y++)  
            {  
                if (!bmp.GetPixel(x, y).Equals(mask))  
                {  
                    gp.AddRectangle(new Rectangle(x, y, 1, 1));  
                }  
            }  
        }  
        bmp.Dispose();  
        return gp;

use:

System.Drawing.Drawing2D.GraphicsPath gp = Resources.Images.Transparent(pictureBox1.Image);  
pictureBox1.Region = new System.Drawing.Region(gp);
hs1rzwqc

hs1rzwqc4#

(对不起,因为误用了答案函数,但答案是渴望评论)
@TaW看起来你还不太理解这种方法,所以我会尝试更详细地解释它
OP询问他是否可以在另一个控件(进度条)上制作透明图像
我假设这个透明的图像在一个PictureBox中,你似乎假设了一些其他的控件
要定位控件,如果我的假设是正确的,在进度条前面的图片框,他所要做的就是右键单击,然后单击图片框上的“置于最前面
在进度条前面有一个“透明”的PictureBox-但正如您在回答中提到的,我们不能就此停止,因为“透明”不是我所期望的,但显然您知道-WinForms执行的是这种“父背景颜色选择”,我们最终在进度条前面得到一个不完全透明的图像,而是一个灰色背景
现在发布的网址已经到位:http://www.richardhyland.com/diary/2009/05/26/how-to-truely-make-a-picturebox-background-transparent/
这是所提供的代码,并在该url中解释:

public static System.Drawing.Drawing2D.GraphicsPath Transparent(Image im)
{
    int x;
    int y;
    Bitmap bmp = new Bitmap(im);
    System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();
    Color mask = bmp.GetPixel(0, 0);

    for (x = 0; x <= bmp.Width - 1; x++)
    {
        for (y = 0; y <= bmp.Height - 1; y++)
        {
            if (!bmp.GetPixel(x, y).Equals(mask))
            {
                gp.AddRectangle(new Rectangle(x, y, 1, 1));
            }
        }
    }
    bmp.Dispose();
    return gp;
}

有了这个,我们可以实现一个完全透明的图片框前面的进度条。
所以没有这个准则,我们就有了这个:

但有了这个准则:

注意,这种方法有一些缺点:
1.不能完美地工作--你可以看到图像边缘的灰色像素
1.在大图像上表现不佳-因为使用GetPixel获取每个像素是一个“挑战”
(请忽略图片显示“JPG”的事实,我说的是透明图片-这只是谷歌搜索呈现给我的第一张图片,是的,文件是透明的PNG)

相关问题