【问题标题】:Transparent Control to be placed of a picturebox要放置的图片框的透明控件
【发布时间】:2011-08-19 18:30:31
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# winforms user-controls picturebox


    【解决方案1】:

    您遇到的问题是 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:你不用担心TransparencyKey使用这个方法。您需要对每个应该具有“透明”背景的控件执行相同的操作。这意味着派生您自己的 Label 类等。但是,将第二个示例用于标签(SetStyle 是公共方法)并将第一个示例用于主覆盖控件可能就足够了。
    猜你喜欢
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多