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

C# Windows Forms滚动闪烁问题求助

C# WinForms 滚动闪烁问题解决方案

一、修复现有代码中的核心错误

1. 修正OnScroll方法的无效逻辑

你的OnScroll方法存在重复调用、时机错误的样式设置,以及强制全窗体重绘的问题,这些都会加重闪烁。修改为仅保留必要的基类滚动逻辑:

protected override void OnScroll(ScrollEventArgs se)
{
    base.OnScroll(se);
}

2. 在构造函数中一次性配置双缓冲样式

将所有优化样式移到窗体初始化阶段设置,避免滚动时重复操作:

public MiTA()
{
    InitializeComponent();
    // 启用所有必要的双缓冲优化
    SetStyle(ControlStyles.UserPaint | 
             ControlStyles.AllPaintingInWmPaint | 
             ControlStyles.ResizeRedraw | 
             ControlStyles.OptimizedDoubleBuffer, true);
    UpdateStyles();
    CheckForIllegalCrossThreadCalls = false;
}

3. 修复CreateParams的逻辑错误

原代码中第一个return cp导致阴影设置永远无法执行,同时启用WS_EX_COMPOSITED可以优化子控件绘制顺序,减少闪烁:

private const int CS_DROPSHADOW = 0x00020000;
protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        // 启用子控件分层绘制优化
        cp.ExStyle |= 0x02000000;
        // 添加窗体阴影
        cp.ClassStyle |= CS_DROPSHADOW;
        return cp;
    }
}

4. 修复自定义控件的属性拼写错误

自定义控件中DoubleBuffered属性拼写错误(少了一个e),修正后才能生效:

MiTAPictureBox修复:

public class MiTAPictureBox : Guna.UI2.WinForms.Guna2PictureBox
{
    public MiTAPictureBox()
    {
        DoubleBuffered = true;
        ResizeRedraw = true;
        SetStyle(ControlStyles.UserPaint | 
                 ControlStyles.OptimizedDoubleBuffer | 
                 ControlStyles.AllPaintingInWmPaint | 
                 ControlStyles.SupportsTransparentBackColor, true);
    }
}

MiTAPanel修复:

public partial class MiTAPanel : Guna2Panel
{
    public MiTAPanel() : base()
    {
        DoubleBuffered = true;
        ResizeRedraw = true;
        SetStyle(ControlStyles.UserPaint | 
                 ControlStyles.OptimizedDoubleBuffer | 
                 ControlStyles.AllPaintingInWmPaint | 
                 ControlStyles.SupportsTransparentBackColor, true);
    }
}

二、额外优化措施(若仍有闪烁)

  • 滚动时临时禁用重绘:通过Win32 API减少滚动过程中的重绘次数:
    [DllImport("user32.dll")]
    private static extern int SendMessage(IntPtr hWnd, int wMsg, bool wParam, int lParam);
    private const int WM_SETREDRAW = 0x000B;
    
    protected override void OnScroll(ScrollEventArgs se)
    {
        SendMessage(this.Handle, WM_SETREDRAW, false, 0);
        base.OnScroll(se);
        SendMessage(this.Handle, WM_SETREDRAW, true, 0);
        this.Refresh();
    }
    
  • 关闭非必要的透明背景:透明背景会强制控件频繁重绘父区域,若无需透明,移除ControlStyles.SupportsTransparentBackColor设置
  • 检查Guna控件内置优化:确认Guna2控件的DoubleBuffered属性已启用,部分控件有专属渲染开关可在属性面板中开启

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:00:16