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
相关产品推荐
相关产品推荐

