C# 透明键不适用于windows 7基本主题

C# 透明键不适用于windows 7基本主题,c#,winforms,.net-3.5,C#,Winforms,.net 3.5,我有一张表格。我将表单的backcolor和transparency键设置为limeGreen以使表单透明 this.TransparencyKey = System.Drawing.Color.LimeGreen; this.BackColor = System.Drawing.Color.LimeGreen; 这在Windows7主题上运行良好,但当我将主题从Windows7更改为Windows7Basic时,它会显示窗体的背景吗?我有办法解决这个问题吗 Windows7主题 Windo

我有一张表格。我将表单的backcolor和transparency键设置为limeGreen以使表单透明

this.TransparencyKey = System.Drawing.Color.LimeGreen;
this.BackColor = System.Drawing.Color.LimeGreen;
这在Windows7主题上运行良好,但当我将主题从Windows7更改为Windows7Basic时,它会显示窗体的背景吗?我有办法解决这个问题吗

Windows7主题

Windows7基本主题


未在未启用Aero的情况下在Windows 7上进行测试,但这将在Windows XP上100%有效:

public class XForm : Form
{

    #region Default value overrides

    [DefaultValue(FormStartPosition.Manual)]
    public new FormStartPosition StartPosition
    {
        get { return base.StartPosition; }
        set { base.StartPosition = value; }
    }

    [DefaultValue(FormBorderStyle.None)]
    public new FormBorderStyle FormBorderStyle
    {
        get { return base.FormBorderStyle; }
        set { base.FormBorderStyle = value; }
    }

    [DefaultValue(false)]
    public new bool ShowInTaskbar
    {
        get { return base.ShowInTaskbar; }
        set { base.ShowInTaskbar = value; }
    }

    [DefaultValue(typeof(Color), "LavenderBlush")]
    public new Color TransparencyKey
    {
        get { return base.TransparencyKey; }
        set { base.TransparencyKey = value; }
    }

    [DefaultValue(typeof(Color), "LavenderBlush")]
    public new Color BackColor
    {
        get { return base.BackColor; }
        set { base.BackColor = value; }
    }

    #endregion

    public XForm()
        : base()
    {
        // set user paint style
        SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
        // override
        FormBorderStyle = FormBorderStyle.None;
        StartPosition = FormStartPosition.Manual;
        ShowInTaskbar = false;
        TransparencyKey = BackColor = Color.LavenderBlush;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        // do nothing
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        // half opaque background
        using (HatchBrush brush = new HatchBrush(HatchStyle.Percent50, this.TransparencyKey))
            e.Graphics.FillRectangle(brush, ClientRectangle);
    }
}
它并不能使它完全透明,但有阴影,但应该很容易找到修复它的方法=p


注意:提示,不要使用平滑(使用不同的颜色),否则图像周围会有难看的边框(除非是有意的)。

在应用程序运行时,您是否正在更改主题?我很确定透明键只是Aero功能。我记得在过去尝试过使用它,我选择覆盖表单的onpaint以根据需要进行切割。Aero在windows基本主题上被禁用。只是尝试了一个快速测试,在我的windows XP虚拟机上,透明键不起作用,它在windows 7 pro上基本主题上也不起作用,但在windows 7 pro上启用Aero的标准主题上起作用。所以,是的,这似乎是Aero功能,但除了这些指向这一点的快速3测试之外,我找不到任何支持。那么@Franck的解决方案是什么呢?你的顶部屏幕截图暗示了核心问题,请注意绿色条纹是如何可见的。这是由于您的绘画程序使用每像素alpha模拟抗锯齿造成的。这会改变背景像素的颜色,它不再匹配颜色键,并使绿色条纹可见。如果在绘制时拉伸整个图像,这将延伸到整个图像。插值导致不匹配。只有在修复图像和/或绘制与设计尺寸完全相同的图像时,它才能正常工作,因此无需插值。