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

ScrollableControl的OnPaint机制是怎样的?滚动后绘制内容残缺如何解决?

问题根源

ScrollableControl开启滚动后,控件可见区域左上角对应的逻辑坐标会跟随滚动位置发生偏移,你在OnPaint中直接使用绝对坐标(0,0)、(100,100)绘制,没有适配滚动偏移量,会导致线条绘制位置错位;同时滚动操作默认仅重绘新露出的区域,原本被隐藏后重新显示的区域没有触发完整重绘,最终就会出现线条残缺的问题。

修复方案

只需修改绘制逻辑适配滚动偏移,同时添加滚动时的强制重绘逻辑即可,修改后的完整代码如下:

public partial class CustomControl1 : ScrollableControl
{
    public CustomControl1()
    {
        InitializeComponent();
        AutoScroll = true;
        AutoScrollMinSize = new Size(1000, 1000);
        // 可选:开启双缓冲避免滚动时闪烁
        DoubleBuffered = true;
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);
        // 适配当前滚动偏移,修正Graphics坐标系
        pe.Graphics.TranslateTransform(AutoScrollPosition.X, AutoScrollPosition.Y);
        pe.Graphics.DrawLine(Pens.Black, 0, 0, 100, 100);
    }

    // 滚动时触发控件全区域重绘,避免刷新不及时
    protected override void OnScroll(ScrollEventArgs se)
    {
        base.OnScroll(se);
        Invalidate();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:27:03