C# 要放置在picturebox中的透明控件

C# 要放置在picturebox中的透明控件,c#,winforms,user-controls,picturebox,C#,Winforms,User Controls,Picturebox,我有一个PNG文件,它在我的winform上的picturebox中显示十字光标。我创建了一个用户控件,其中包含另一个小图片框(绿点)和一个标签 我想做的是将用户控件放置在图片框上,以便只有点和标签可见。控件的方形边不可见 由于png实际上是方形的,所以点具有白色边缘,因此我尝试将透明度关键点设置为白色,但当我将控件添加到图片框中时,白色的所有内容都是透明的 我想如果我用一种颜色在点的边缘上色,那么我可以用透明键来匹配,但是颜色必须精确(对吗?),我唯一的绘画方法是在windows paint中

我有一个PNG文件,它在我的winform上的picturebox中显示十字光标。我创建了一个用户控件,其中包含另一个小图片框(绿点)和一个标签

我想做的是将用户控件放置在图片框上,以便只有点和标签可见。控件的方形边不可见

由于png实际上是方形的,所以点具有白色边缘,因此我尝试将透明度关键点设置为白色,但当我将控件添加到图片框中时,白色的所有内容都是透明的


我想如果我用一种颜色在点的边缘上色,那么我可以用透明键来匹配,但是颜色必须精确(对吗?),我唯一的绘画方法是在windows paint中,所以我不知道是否匹配了颜色。有什么帮助吗?

您遇到的问题是WinForms控件不支持真正的透明性,让它们这样做可能有点棘手。他们所做的是在自己下面绘制子控件(当透明度通过SetStyle启用时),但这有它自己的怪癖。您应该首先尝试以下内容:

// in your custom control class...
protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT

        return cp;
    }
} 
我发现此方法比以下方法更可靠,但您也应该尝试此方法:

public MyTransparentControl()
{
    SetStyle( ControlStyles.SupportsTransparentBackColor |     
              ControlStyles.AllPaintingInWmPaint |
              ControlStyles.UserPaint, true );

    BackColor = Color.Transparent;
}

作为一种替代方法,您是否考虑过使用WPF而不是WinForms?我知道这并不总是一个选项,但如果是这样的话,您的生活会变得更加轻松,因为WPF控件支持透明度和控件开箱即用的分层功能。

我需要担心父对话框上的透明度键吗?第一个例子比第二个好一点。标签的背景和我控件中图片框的背景仍然存在。控件的其余部分不可见。这个例子可以扩展到那些项目吗?@Jason:你不必担心使用这种方法的透明度。对于每个应该有“透明”背景的控件,都需要执行相同的操作。这意味着派生您自己的标签类等。但是,对于标签使用第二个示例(
SetStyle
是一个公共方法),对于主覆盖控件使用第一个示例就足够了。