日期:2014-05-17  浏览次数:21232 次

Winform【半透明】用户控件开发,承载窗体“透明”导致半透明锯齿,如何解决?翻过很多帖子(包括CSDN)都无解,祥见内图
现在我想开发一个Winform的用户控件,可以配置一张png图作为背景图,并且支持半透明的效果(不仅仅是透明!)
但实际开发中发现,如果这个用户控件的承载窗体“透明”了,控件的半透明效果会锯齿。。见图:



PS 1. 控件OnPaint时设置高质量、抗锯齿,无解。
g.CompositingMode = CompositingMode.SourceOver;
g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.SmoothingMode = SmoothingMode.AntiAlias;(SmoothingMode.HighQuality; 无解)

PS 2. 设置控件支持透明背景,无解。
SetStyle(ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true);
this.BackColor = Color.Transparent;

PS 3. 设置控件支持透明背景方法2,无解。
protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
        return cp;
    }
}

唯一能让控件的png半透明正常的方式,只能是使承载窗体不要透明,或者使控件本身不透明,可惜这是必须的。。

试过很多方法,翻过很多帖子(包括CSDN),都无解,还望有人能指点下啊。。谢谢。。。

------解决方案--------------------
不要怪别的,原始图片问题,背景不是纯正的
------解决方案--------------------
无解,绝对无解,唯有DX有解。。。。我猜的。。。
------解决方案--------------------
应该是图的问题,找个高清的最好是黑白的
------解决方案--------------------
你到网上搜搜相关锯齿的插件吧,VS能够把这些搞懂真不错
------解决方案--------------------
我最近也做过类似的,问题解决了。你可以试试把图片的四个角设定一个颜色,假如是Red。。在你的窗体的BackColor和TransparencyKey都设为Red,后座是将窗体上指定的颜色透明。。。。
------解决方案--------------------
期待,同样的问题没有结果。
------解决方案--------------------
你的图片太大了.看不清楚.建议使用Updatelayeredwindow来做.
------解决方案--------------------
    Protected Overloads Overrides ReadOnly Property CreateParams() As CreateParams
        Get
            Dim cp As CreateParams = MyBase.CreateParams
            cp.ExStyle = cp.ExStyle Or &H80000 '应用层样式
            Return cp
        End Get
    End Property