当前位置: 代码迷 >> .NET组件控件 >> C# winform GDI+编程有关问题,求高手
  详细解决方案

C# winform GDI+编程有关问题,求高手

热度:6913   发布时间:2013-02-25 00:00:00.0
C# winform GDI+编程问题,求高手!
我在一个panel里面直接画了很多图形,打开整个图形需要3秒左右,这个不是最大的问题,最大的问题是,当鼠标移动到这个panel上面的那些菜单栏,菜单栏下拉之后,由于下拉列表伸到了panel里面,因此调用了panel的paint方法,进行了整个panel的重绘,因此造成了用户想点击菜单时,每次都卡在那好一会才能动,即等panel重绘完了才能动,像假死一样。

不知道各位高手有没有遇到过类似的问题,在线求解决方法,先谢谢了!

protected override void OnPaint(PaintEventArgs e)
        {
                Graphics g = e.Graphics;
                
                PaintMyInfo(g);

            base.OnPaint(e);
        }

我想设置一个全局变量bool类型的,控制其只重绘一次,这样虽然解决了菜单下拉的问题,但是菜单下拉缩上去之后,菜单那快就是白色的背景,我原先画的panel就像缺了一块一样,同样从其他窗口切换过来这个程序的窗口,panel里面的东东也会全部变白,这意味着不调用PaintMyInfo了,烦恼啊~

protected override void OnPaint(PaintEventArgs e)
        {
                if (m_isRepaintMyInfo)
{
                Graphics g = e.Graphics;
                
                PaintMyInfo(g);
                m_isRepaintMyInfo=false;
}

            base.OnPaint(e);
        }
------解决方案--------------------------------------------------------
加双缓冲,然后OnPaint中可以对被改写区域进行重绘,不必整个重绘  看PaintEventArgs 的ClipRectangle 的相关资料
------解决方案--------------------------------------------------------
自己弄双缓冲吧。系统的双缓冲已经不够你用的了。
------解决方案--------------------------------------------------------
这不是闪烁的问题,况且……我双缓冲也加过了,效率反而更低,原因是通过bitmap绘制上去的比直接在pannel里面绘图更多了一步骤,所以我还是只加了一个缓冲。

先试试1楼大哥说的办法,局部绘制看看……
------解决方案--------------------------------------------------------
改用局部刷新效果好了点,至少不会假死,不过还是在刷新的时候有一点延时,另外,发现了一个很奇怪的问题,同样的程序,在我自己的机器上调试就没问题,到了其他一些电脑上面运行就有问题,
譬如我在onpaint里面加了断点调试,在我的本本上运行如上面描述的测试,点击菜单栏,它就没有进去onpaint,也就是它不会刷新,但在同事的本本上运行,他就进去了。我们的本本是同一款,而且装的是同一个操作系统win7,不单是这样,我发现身边有的同事的会刷新,有的不会,不刷新的就显示很正常,没有一点延时,很奇怪,不知道什么原因,求高人解答……
------解决方案--------------------------------------------------------
你都画了什么东西啊,需要三秒,检查一下你的算法,看是否有改进的地方。我以前画一个很复杂的界面也不需要三秒。
------解决方案--------------------------------------------------------
我知道啊,我也在检查算法,但是上面的问题很奇怪,我在自己的机器上调试不了,每次都更新了跑到同事那测试,很麻烦,不知道什么原因。
我画的东西跟数据库有关,但都是先取出来数据放到内存的DataTable之后,再进行select处理,或者使用RowFilter处理。
------解决方案--------------------------------------------------------
机子的问题无能为力。
等待的时间我估计是你处理数据的时间,从数据库获取到得到你需要的数据占用了太多的时间,建议能不能用缓存什么的。而且你获取数据,处理数据可以重开一个线程。
------解决方案--------------------------------------------------------
该回复于2012-03-02 12:59:31被版主删除
  相关解决方案