C# 绘制内容超出Panel尺寸上限的解决办法

绘制内容超出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 < 10; i++)
           {
                int value = vScrollBar1.Value +i;
                PointF point = new PointF(150,i * 100);
               e.Graphics.DrawString(value.ToString(), font, brush, point);
                e.Graphics.DrawLine(pen, newPoint(0, (i+1) * 100), new Point(panel1.Width, (i+1) * 100));
           }
       }
 
       private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
       {
           panel1.Refresh();
       }


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值