【问题标题】:Transparency Key not working on windows 7 basic theme透明度键不适用于 Windows 7 基本主题
【发布时间】:2014-05-05 11:33:18
【问题描述】:

我有一个表格。我将表单的背景颜色和透明度键设置为limeGreen,以使表单透明。

this.TransparencyKey = System.Drawing.Color.LimeGreen;
this.BackColor = System.Drawing.Color.LimeGreen;

这在 windows 7 主题上运行良好,但是当我将主题从 windows 7 更改为 windows 7 basic 时,它会显示窗体的背景?有什么办法可以解决这个问题吗?

Windows 7 主题

Windows 7 基本主题

【问题讨论】:

  • 您是否在应用运行时更改主题?
  • 我很确定 TransparencyKey 只是 Aero 功能。我记得过去曾尝试使用它,我选择覆盖表单的 onpaint 以将其切割到我的需要。 Aero 在 Windows 基本主题上被禁用。
  • 刚刚尝试了一个快速测试,在我的 Windows XP VM 上,TransparencyKey 不起作用,它在基本主题的 Windows 7 Pro 上也不起作用,但它在具有启用 Aero 的标准主题的 Windows 7 Pro 上起作用.所以是的,它似乎是 Aero 功能,但除了这些指向这一点的快速 3 测试之外,我找不到任何支持它的东西。
  • 那么@Franck 的解决方案是什么?
  • 您的顶部屏幕截图暗示了核心问题,请注意绿色边缘是如何可见的。由您的绘画程序通过使用每像素 Alpha 模拟抗锯齿引起。这会改变背景像素的颜色,它不再匹配颜色键并使绿色边缘可见。如果在绘制时拉伸,这将扩展到整个图像。插值导致不匹配。只有修复图像和/或将图像绘制得与设计的一样大,这样就不需要插值,它才能正常工作。

标签: c# winforms .net-3.5


【解决方案1】:

尚未在未启用 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

P.S.:提示,不要使用平滑(通过使用不同的颜色),否则你的图像周围会有丑陋的边框(除非是有意的)。

【讨论】:

    猜你喜欢
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2011-12-18
    相关资源
    最近更新 更多