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

rabbit_009 2012-02-01 11:16:36
我在一个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);
}
...全文
167 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
testtestett 2012-02-02
  • 打赏
  • 举报
回复
机子的问题无能为力。
等待的时间我估计是你处理数据的时间,从数据库获取到得到你需要的数据占用了太多的时间,建议能不能用缓存什么的。而且你获取数据,处理数据可以重开一个线程。
rabbit_009 2012-02-02
  • 打赏
  • 举报
回复
我知道啊,我也在检查算法,但是上面的问题很奇怪,我在自己的机器上调试不了,每次都更新了跑到同事那测试,很麻烦,不知道什么原因。
我画的东西跟数据库有关,但都是先取出来数据放到内存的DataTable之后,再进行select处理,或者使用RowFilter处理。
testtestett 2012-02-02
  • 打赏
  • 举报
回复
你都画了什么东西啊,需要三秒,检查一下你的算法,看是否有改进的地方。我以前画一个很复杂的界面也不需要三秒。
rabbit_009 2012-02-02
  • 打赏
  • 举报
回复
改用局部刷新效果好了点,至少不会假死,不过还是在刷新的时候有一点延时,另外,发现了一个很奇怪的问题,同样的程序,在我自己的机器上调试就没问题,到了其他一些电脑上面运行就有问题,
譬如我在onpaint里面加了断点调试,在我的本本上运行如上面描述的测试,点击菜单栏,它就没有进去onpaint,也就是它不会刷新,但在同事的本本上运行,他就进去了。我们的本本是同一款,而且装的是同一个操作系统win7,不单是这样,我发现身边有的同事的会刷新,有的不会,不刷新的就显示很正常,没有一点延时,很奇怪,不知道什么原因,求高人解答……
rabbit_009 2012-02-01
  • 打赏
  • 举报
回复
这不是闪烁的问题,况且……我双缓冲也加过了,效率反而更低,原因是通过bitmap绘制上去的比直接在pannel里面绘图更多了一步骤,所以我还是只加了一个缓冲。

先试试1楼大哥说的办法,局部绘制看看……
足球中国 2012-02-01
  • 打赏
  • 举报
回复
自己弄双缓冲吧。系统的双缓冲已经不够你用的了。
bdmh 2012-02-01
  • 打赏
  • 举报
回复
加双缓冲,然后OnPaint中可以对被改写区域进行重绘,不必整个重绘 看PaintEventArgs 的ClipRectangle 的相关资料

8,834

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 组件/控件开发
社区管理员
  • 组件/控件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧