代码之家  ›  专栏  ›  技术社区  ›  dezkev

在WinForm上绘制对象时不滚动

  •  0
  • dezkev  · 技术社区  · 16 年前

    C 3.0,.NET框架3.5 我正在(使用图形类中的draw方法)在Windows窗体上垂直绘制大量实心矩形。表单从500 x 500 px开始,只有在从网络下载数据后才在运行时绘制矩形-矩形的数量取决于下载情况,所以我不知道它是在前面。

    因此,当窗体的大小固定时,只绘制几个矩形。 所以我搜索/狂饮(以免有人建议我这样做)并找到了一些提示,但在这种情况下它们不起作用——比如将Forms AutoScroll属性设置为true或尝试双重缓冲。我还尝试绘制一个列表框控件并设置它的滚动属性等,但没有骰子。

    我猜没有办法显示,比如说在Windows窗体上使用draw垂直显示200个矩形。我需要其他的解决办法…有什么想法吗?

    也许是一个图片框列表,然后用纯色填充每个图片框?

    谢谢

    1 回复  |  直到 16 年前
        1
  •  7
  •   Brian Rudolph    16 年前

    您在绘制事件期间在窗体上绘制gdi+矩形?窗体不知道您正在剪切空间之外创建对象,因此不知道您需要滚动。

    您需要向窗体中添加一个滚动条,然后计算滚动条的值\位置,并使用该值确定绘制事件时要绘制的矩形的哪个部分。这需要一些人工的努力。您可以将它们全部绘制成适当大小的内存位图,然后在绘制时将其部分复制到表单。

    或:

    如果希望窗体为您执行此操作,请创建一个自定义矩形控件,并在窗体上放置200个控件。由于它们是组件,并且具有具体的高度和宽度,因此表单将知道需要滚动,并且如果设置了AutoScroll,则会相应地进行滚动。

    可以这么简单:

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                this.DoubleBuffered = true;
                this.AutoScroll = true;
                for (int i = 0; i < 100; i++)
                    this.Controls.Add(new Rectangle() { Top = i * 120, Left = 10 });
    
            }
        }
    
        public class Rectangle : Control
        {
            public Rectangle()
            {
                this.Width = 100;
                this.Height = 100;
            }
            protected override void OnPaint(PaintEventArgs e)
            {
                e.Graphics.DrawRectangle(new Pen(Color.Black, 5), 0, 0, 100, 100);
            }
        }