首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于WinForm控件重绘速度慢的有关问题

2013-09-06 
关于WinForm控件重绘速度慢的问题在一个WinForm项目中需要用到座席状态监控,我在一个Panel里放置了几百个

关于WinForm控件重绘速度慢的问题
在一个WinForm项目中需要用到座席状态监控,我在一个Panel里放置了几百个控件,每个控件对应一个座席,控件的位置就是座席人员的物理位置,所以在调整Form大小时,控件要按比例的放大和缩小(不能重排,否则位置信息就乱掉了)。
缩放效果(原始):
关于WinForm控件重绘速度慢的有关问题

缩放效果(缩小):
关于WinForm控件重绘速度慢的有关问题

缩放代码如下:


            float fWidthRate = (float)this.Size.Width / this._lastSize.Width;
            float fHeightRate = (float)this.Size.Height / this._lastSize.Height;

            this.toolStripContainer.ContentPanel.Scale(new SizeF(fWidthRate, fHeightRate));


获得调整后的窗口比例然后按照此比例调整Panel及其中的控件,功能上完全可以实现,但是改变大小时控件会有很明显的重绘过程(原有控件消失,新尺寸的控件重新出现),有没有什么办法让这种调整更加平滑,最好能做到像放大缩小图片那样没有刷新过程。GDI+可以做到吗?求各位大虾解答。 控件 重绘 刷新 GDI+ WPF
[解决办法]
增加缓冲啊
很早之前就有人讨论过这个了
你界面上的都是一些button吧,没细看,或者是你自己写的一个轻量级控件。

将这些button使用GDI+画在一个bitmap里面,然后将bitmap画出来,可以达到你要求的减少闪烁的要求。
[解决办法]
引用:
引用:引用:增加缓冲啊
很早之前就有人讨论过这个了
你界面上的都是一些button吧,没细看,或者是你自己写的一个轻量级控件。

将这些button使用GDI+画在一个bitmap里面,然后将bitmap画出来,可以达到你要求的减少闪烁的要求。
是自己实现的控件,GDI+我之前没用过,准备试一下,……

 int counttabPageTransducerTest = this.tabPageTransducerTest.Controls.Count * 2 + 2;
            float[] factortab2 = new float[counttabPageTransducerTest];
            int i = 0;
            factortab2[i++] = tabPageTransducerTest.Size.Width;
            factortab2[i++] = tabPageTransducerTest.Size.Height;
            foreach (Control ctr in this.tabPageTransducerTest.Controls)


            {
                factortab2[i++] = (ctr.Location.X) / (float)tabPageTransducerTest.Size.Width;
                factortab2[i++] = (ctr.Location.Y) / (float)tabPageTransducerTest.Size.Height;
                ctr.Tag = ctr.Size;
            }
            proptt = factortab2;

  private void tabPageTransducerTest_Resize(object sender, EventArgs e)
        {

            int i = 2;
            float[] scale = (float[])proptt;
            foreach (Control ctr in this.tabPageTransducerTest.Controls)
            {
                ctr.Left = (int)(tabPageTransducerTest.Size.Width * scale[i++]);
                ctr.Top = (int)(tabPageTransducerTest.Size.Height * scale[i++]);
                ctr.Width = (int)(tabPageTransducerTest.Size.Width / (float)scale[0] * ((Size)ctr.Tag).Width);
                ctr.Height = (int)(tabPageTransducerTest.Size.Height / (float)scale[1] * ((Size)ctr.Tag).Height);

                //每次使用的都是最初始的控件大小,保证准确无误。
            }
            scale = null;

        }
用这个缩放呢,直接修改panel中的缩放

热点排行