如何使PictureBox真正透明 - c#

我有一个PictureBox,可以垂直移动。 PictureBox中显示的图像是透明的GIF,因此在图像查看器中查看时,它没有背景。

问题是,当我在应用程序中移动PictureBox时,PictureBox的背景移动得很奇怪-几乎就像PictureBox本身具有背景一样。

之前:

之后(移动时):

一些代码:

path = "C:\\note.gif";
note.Image = Image.FromFile(path);
note.Visible = true;
note.BackColor = Color.Transparent;
panel.Controls.Add(note);

我也尝试过将Picturebox进行双重缓冲,但这也不起作用。

参考方案

尽管WinForms不太适合用户控件的透明性,但它是可能的。请参阅此处的this article。在本文中,作者建议从Panel而不是UserControl派生,并重写OnPaintBackground方法不执行任何操作。这将阻止您绘制背景

protected override void OnPaintBackground(PaintEventArgs pevent)
{
    //do nothing
}

protected override void OnMove(EventArgs e)
{
    RecreateHandle();
}

// Override the CreateParams property:
protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle = 0x00000020; //WS_EX_TRANSPARENT
        return cp;
    }
}

最后,覆盖OnPaint函数,您可以绘制图片框。

protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;

    //Do your drawing here
}

使用此功能,您可以创建一个具有透明度的自定义图片框,但请注意,如果将其实时在屏幕上移动,则会出现闪烁和模糊。

使用这种技术和类似技术,我们设法获得了一个WinForms应用程序Premex XPort,以与其网站相似的品牌进行渲染。这涉及多个透明控件,绘画技巧以及各种使其正确显示的方法。

总之,Winforms不能做到这一点的原因是在基于Win32的技术中,一个控件在屏幕上拥有一个像素。正如您在HTML或WPF中所期望的那样,没有办法真正实现透明性的像素合成。后来的Windows技术(WPF)尤其出色,因此,如果您真的希望在应用程序中大量使用透明性,我建议至少部分迁移到该平台(WPF可以托管在WinForms中,反之亦然)。

最好的祝福,

如何使用ASP.NET ViewState使用JavaScript - c#

我的页面中有UL,它为空。我开始使用JavaScript使用LI填充它。在回发阶段如何在asp.net中使用此新添加的动态数据?那是因为我的提交按钮是asp.net控件。我不想使用JS POST。谢谢 参考方案 我过去通过在隐藏字段中填充要发布的动态数据来完成此类操作,您可以-在回传之前触发JavaScript事件,该事件将数据从UL解析到隐藏字段中要么更新…

如何从.Net DLL获取公共出口列表? - c#

我可以使用“ dumpbin”和“ dll export”之类的工具来查看标准win32 DLL的公共入口点(“ exports”),例如Windows \ SYSTEM32 \ GDI32.dll。但是,当我在.Net DLL上使用这些相同的工具时,我看到的仅仅是 2000 .reloc 2000 .rsrc 48000 .text 我有一个C#/。Net…

将asp.net c#变量分配给javascript数组 - c#

我有2个工作部分的代码,需要将它们放在一起第1节-用户可以访问页面,查看和编辑数据库的内容,其中包括新闻文章,标题,相关链接等,我设法使其正常工作并将数据保存到数据库中第2条-该网站首页上的javascript新闻滚动器会写出一系列div,然后使用javascript和CSS对其进行旋转,使其看起来像在滚动,同样可以。新闻文章是从首页上硬编码的数组中提取的问…

如何在ASP.NET Core Web应用程序中增加JSON反序列化MaxDepth限制 - c#

我们正在将ASP.NET Core 2.1与.NET Framework 4.6.2结合使用。我们有一个客户需要向我们的Web应用程序发送一个很大程度上嵌套的json结构。当他们进行此调用时,我们将输出以下日志并返回错误: 读取器的MaxDepth超过了32。路径“ super.long.path.to property”,第1行,位置42111。”我浏览了…

ASP.NET MVC 5自定义登录,无需脚手架,数据库优先 - c#

我对asp.net和mvc还是很陌生,所以我正在努力学习尽可能多的知识...为此,我从头开始编写博客网站,但是我对身份验证和授权有些困惑。由于我倾向于不真正使用任何脚手架的东西,所以我首先要使用数据库,所以不希望asp.net身份为我创建表。我对散列和加盐密码很酷,并对照数据库检查用户,我遇到的麻烦是将用户设置为登录状态并检查他们应该能够访问什么。我真的很想…