C# 如何在c语言中生成多幅图像的透明背景#

C# 如何在c语言中生成多幅图像的透明背景#,c#,winforms,customization,transparency,C#,Winforms,Customization,Transparency,我有一个windows窗体中的图像集合,希望将它们设置为“非矩形”-即透明背景 但是,当使用透明键时,“是”和“是”都会失去背景色。但是,我在任何时候都只能看到其中一个,而不能看到另一个(取决于哪个是“broughtToFront”) 有没有一种方法可以在表单上显示两个图像,它们都是“非矩形”,并且都有透明的背景 请注意:我已设法将背景设置为透明(TransparencyKey设置为灰色(RGB为66,66,66),并且两幅图像具有相同的背景 protected override void O

我有一个windows窗体中的图像集合,希望将它们设置为“非矩形”-即透明背景

但是,当使用透明键时,“是”和“是”都会失去背景色。但是,我在任何时候都只能看到其中一个,而不能看到另一个(取决于哪个是“broughtToFront”)

有没有一种方法可以在表单上显示两个图像,它们都是“非矩形”,并且都有透明的背景

请注意:我已设法将背景设置为透明(
TransparencyKey
设置为
灰色(RGB为66,66,66)
,并且两幅图像具有相同的背景

 protected override void OnPaintBackground(PaintEventArgs e)
 {
    //Do not paint background
 }
我听说过术语“
区域”
”,但据我所知,这对CPU来说通常是一种非常“沉重”的负担

非常感谢并乐于回答任何澄清问题的任何建议(因为我不太擅长解释自己)

注意:我试图达到的“效果”与项目启动时X战警门打开的效果相似——我的桌面在门后


此尝试使用UpdateLayeredWindow API:

我从Corylulu获得了这一灵感:

这两个位图是动态创建的,但您可以从文件系统或其他任何地方加载它们

覆盖窗口当前覆盖整个主屏幕,但您也可以选择将表单的位置和大小设置为您需要的任何位置和大小(例如,在另一个表单的顶部)

我为这两个位图实现了一个非常基本的动画,但这取决于你是否比我更有创意:)

看一看! 这是一个不同的问题,但在张贴在那里的图像上,你可以看到三个不同的图像,它们彼此之间以及背景之间都是透明的

您可以通过覆盖面板的某些方法来解决此问题,如下所示:

abstract public class DrawingArea : Panel
{
    protected Graphics graphics;
    abstract protected void OnDraw();

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x00000020; 
            return cp;
        }
    }

    protected override void OnPaintBackground(PaintEventArgs pevent)
    {

    }

    protected override void OnPaint(PaintEventArgs e)
    {
        this.graphics = e.Graphics;
        this.graphics.TextRenderingHint =
            System.Drawing.Text.TextRenderingHint.AntiAlias;
        this.graphics.InterpolationMode =
            System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
        this.graphics.PixelOffsetMode =
            System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
        this.graphics.SmoothingMode =
            System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        OnDraw();
    } 
}
您可以重用这个“DrawingArea”类,将其扩展到您的门或任何您想要的透明图像,例如以下示例:

public class TransparentImage : DrawingArea
{

    private bool draw = false;

    private Image Imagem;

    public Image imagem
    {
        get { return Imagem; }
        set
        {
            Imagem = value;
            draw = true;
            this.Size = Imagem.Size;
        }
    }

    protected override void InitLayout()
    {
        this.BringToFront();
    }


    public TransparentImage()
    {


    }


    protected override void OnDraw()
    {
        if (draw)
        {
            Rectangle location = new Rectangle(0, 0, Imagem.Width, Imagem.Height);
            this.graphics.DrawImage(Imagem, location);
        }
    }
}
这个“透明图像”将作为一个组件出现在工具箱窗口中,以便您可以从那里实例化它

在“门打开/关闭”动画中,您可能会发现一些闪烁,因此建议使用双缓冲来平滑动画


winforms显然不是这方面的最佳实践,我可以用自己的错误来说明:)

看起来您正在寻找一个简单的解决方案

看看这条线:

为了以“简单”的方式达到最终效果,我想你应该做以下几点

1-您需要创建一个新的启动屏幕窗体,以加载全屏。在主窗体上,当窗体正在加载时,可以将此启动屏幕窗体显示为“模式”窗体

2-尝试覆盖paintbackground上的
OnPaintBackground
,以便不为is background绘制任何内容

 protected override void OnPaintBackground(PaintEventArgs e)
 {
    //Do not paint background
 }
3-放置图像并随着时间的推移产生效果。看看我在顶部发布的链接。如果它困扰着你,它也可能有助于制作透明图像


4-动画结束时,启动屏幕自动卸载。

是否可以将两个(或多个)图像置于同一图像控件中,而不是对每个图像单独进行控制?你能解释一下X战警门打开或张贴一张能显示所需结果的图片是什么意思吗?@TomažTekavec,因为两个不同的门部件将朝不同的方向移动,并且不是“方形”的。我打算让门开始“关闭”,当系统加载后,让它们“打开”。我不确定它们是否可以放在一个picturebox中,但它们目前位于不同的picturebox中。您必须使用WinForms进行此项目吗?它有点过时,只提供有限的功能。我相信使用WPF可以更容易地实现您的场景。或者,您可以创建自己的类,从Panel派生,并使用Graphics对象自己绘制(如果您需要,我可以提供一个小片段)。嗯,看看这里,也许这可以解决您的问题:@WeSt它必须在winforms中(我知道这很痛苦)。Tomaz,这有点帮助,但是“背景图像”也需要透明(否则它仍然显示不正确)