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

C# 实现类Paint的绘图滚动功能:激活滚动条且滚动后保留绘制内容

问题核心原因&解决步骤

你现在遇到的两个核心问题分别是:

  • 开启AutoScroll后没有设置AutoScrollMinSize,窗体不知道你的完整可绘制区域多大,因此不会触发滚动条
  • 滚动后绘图没有应用滚动偏移,会出现内容错位,且没有缓存绘制内容,滚动重绘时容易丢失内容

修正后的完整代码

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Nodes
{
    public partial class Form1 : Form
    {
        // 定义画布总大小,可根据需求调整
        private readonly Size _canvasSize = new Size(1000, 1000);
        // 绘制缓存,所有绘图内容先画到这个Bitmap上,避免滚动重绘丢失
        private Bitmap _drawCache;

        public Form1()
        {
            InitializeComponent();
            this.DoubleBuffered = true;
            this.AutoScroll = true;
            // 关键:设置可滚动区域的最小尺寸,和画布大小保持一致
            this.AutoScrollMinSize = _canvasSize;

            // 初始化绘制缓存
            _drawCache = new Bitmap(_canvasSize.Width, _canvasSize.Height);
            using (var g = Graphics.FromImage(_drawCache))
            {
                // 填充画布默认背景为白色,和Paint软件逻辑一致
                g.Clear(Color.White);
                // 提前把要绘制的圆画到缓存里,你也可以在鼠标事件等位置动态绘制到缓存
                g.SmoothingMode = System.Drawing.Drawing2D.Smoothing.AntiAlias;
                g.DrawEllipse(Pens.Black, new Rectangle(0, _canvasSize.Height - 50, 50, 50));
            }

            // 滚动时触发重绘
            this.Scroll += (s, e) => this.Invalidate();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            // 关键:应用滚动偏移,让绘制内容跟着滚动位置移动
            g.TranslateTransform(this.AutoScrollPosition.X, this.AutoScrollPosition.Y);
            // 直接绘制缓存的内容,效率高且不会丢失已绘制内容
            g.DrawImage(_drawCache, Point.Empty);
        }
    }
}

额外说明

如果要实现类似Paint的手绘功能,只需要在鼠标事件(MouseDown/MouseMove/MouseUp)中把绘制内容写到_drawCache缓存Bitmap里,然后调用Invalidate()触发重绘即可,滚动过程中所有已绘制内容都会完整保留。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:00:01