原创
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
绘制内容超出Panel尺寸上限的解决办法
通常我们在Panel中绘制和显示内容,实现方式是把Panel的尺寸设置的足够大,并且在程序右侧增加一个垂直滚动条,当绘制内容超过窗口时,通过拖动滚动条来翻看Panel里的内容,这种方式使用起来也很方便。
但是上面的实现方式会存在两个致命的问题:
问题一、如果要显示的内容很多,并且要求Panel的尺寸必须很大,绘制的性能问题将会凸显出来。例如Panel里要绘制100张从上往下排列的图片,每张图片400*400像素,显然用户在屏幕上很可能只看到了两张图片却要在Panel上绘制全部的图片。
问题二、Panel的宽和高上限是65535像素,如果绘制的内容超过这个上限,这个方式将无法实现。
一个好的实现方法是:保持Panel的大小为整个显示区域,可能只有1024*768。然后将绘制内容与滚动条的值相关联,将最终调整后刚好要在Panel区域显示的内容在Panel里进行绘制显示。
简单例子:绘制的内容是从0开始的一系列连续的数字,在每个数字在垂直方向占据100像素,例如在(100,0)的位置绘制数字0在(100,100)的位置绘制数字1,数字每次递增1。
主要控件包括一个面板panel1和一个垂直滚动条vScrollbar1。滚动条滚动触发panel1重绘,panel1根据滚动条的值绘制特定内容。
private void Form1_Load(object sender,EventArgs e) { vScrollBar1.Minimum = 0; vScrollBar1.Maximum = 1000000; vScrollBar1.LargeChange = 100; vScrollBar1.SmallChange = 1; } private void panel1_Paint(object sender,PaintEventArgs e) { Font font = new System.Drawing.Font("宋体", 70,FontStyle.Bold); SolidBrush brush = new SolidBrush(Color.Black); Pen pen = new Pen(Color.Gray, 1); for (int i = 0; i