You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# .NET中用线性渐变笔刷实现窗体边缘淡入淡出?代码异常求助

解决窗体边缘淡入淡出代码失效问题

原代码核心问题

  • TransparencyKey与半透明绘制冲突:设置TransparencyKey后,窗体GDI绘制会忽略Alpha通道,无法呈现渐变半透明效果。
  • 裁剪区域逻辑错误:使用CombineMode.Exclude排除整个窗体矩形,导致无有效绘制区域,渐变完全无法显示。
  • 渐变方向不符合需求:原代码是左上角到右下角的对角线渐变,而非边缘向内的淡入淡出效果。

修正后的实现步骤与代码

1. 替换窗体初始化设置

移除TransparencyKey配置,启用窗体透明支持:

// 在窗体构造函数或设计器代码中设置
this.AllowTransparency = true;
this.BackColor = Color.FromArgb(0, Color.Black); // 完全透明背景
this.FormBorderStyle = FormBorderStyle.None; // 可选,如需无边框效果;有边框时渐变会被边框遮挡
this.DoubleBuffered = true; // 开启双缓冲避免绘制闪烁

2. 重写OnPaint实现边缘淡入淡出

通过绘制四个边缘渐变区域,模拟边缘向内的淡入效果:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

    int edgeWidth = 50; // 边缘渐变宽度,可按需调整
    Color centerColor = Color.White; // 窗体中心不透明颜色
    Color edgeColor = Color.FromArgb(0, centerColor); // 边缘完全透明颜色

    // 顶部渐变
    using (var topBrush = new System.Drawing.Drawing2D.LinearGradientBrush(
        new Point(0, 0),
        new Point(0, edgeWidth),
        edgeColor,
        centerColor))
    {
        e.Graphics.FillRectangle(topBrush, new Rectangle(0, 0, this.Width, edgeWidth));
    }

    // 底部渐变
    using (var bottomBrush = new System.Drawing.Drawing2D.LinearGradientBrush(
        new Point(0, this.Height - edgeWidth),
        new Point(0, this.Height),
        centerColor,
        edgeColor))
    {
        e.Graphics.FillRectangle(bottomBrush, new Rectangle(0, this.Height - edgeWidth, this.Width, edgeWidth));
    }

    // 左侧渐变
    using (var leftBrush = new System.Drawing.Drawing2D.LinearGradientBrush(
        new Point(0, 0),
        new Point(edgeWidth, 0),
        edgeColor,
        centerColor))
    {
        e.Graphics.FillRectangle(leftBrush, new Rectangle(0, edgeWidth, edgeWidth, this.Height - 2 * edgeWidth));
    }

    // 右侧渐变
    using (var rightBrush = new System.Drawing.Drawing2D.LinearGradientBrush(
        new Point(this.Width - edgeWidth, 0),
        new Point(this.Width, 0),
        centerColor,
        edgeColor))
    {
        e.Graphics.FillRectangle(rightBrush, new Rectangle(this.Width - edgeWidth, edgeWidth, edgeWidth, this.Height - 2 * edgeWidth));
    }

    // 中心不透明区域
    using (var centerBrush = new SolidBrush(centerColor))
    {
        e.Graphics.FillRectangle(centerBrush, new Rectangle(edgeWidth, edgeWidth, this.Width - 2 * edgeWidth, this.Height - 2 * edgeWidth));
    }
}

额外说明

如果需要保留窗体边框,需调整渐变区域范围,避免被系统边框遮挡,或自行绘制自定义边框。

内容的提问来源于stack exchange,提问作者Frost Dream

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 09:32:49