CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

winform问题:在窗体上添加大量控件时,会造成在窗体切换时强烈的刷新感,怎么解决?

楼主fansenwei(绿茵萤火虫)2004-05-02 08:49:10 在 .NET技术 / C# 提问

在窗体上放置100个picture控件,窗体切换时,重绘感觉很明显,这种情况在vb里面是很不明显的,请问有办法解决么? 问题点数:100、回复次数:53Top

1 楼CSharp119(C#119)回复于 2004-05-02 09:32:11 得分 1

语言本身的问题,,不好解决。Top

2 楼sy246(C#梦想!)回复于 2004-05-02 09:36:18 得分 1

有些时候刷新太很!  
  气死我了!Top

3 楼fansenwei(绿茵萤火虫)回复于 2004-05-02 09:56:01 得分 0

是呀,操作系统是win2000   professionalTop

4 楼fan27(领悟)回复于 2004-05-02 10:18:20 得分 1

我也遇到这样的问题,怎么解决呀!是不是没有解决的方法,是语言或操作系统的问题那!Top

5 楼ejiue(阿喀硫斯的脚跟)回复于 2004-05-02 13:49:39 得分 1

没有好办法.不过可以锁住界面,等待一段时间,让这100个picture同时显示出来.  
   
  在主窗口类里导入一个API:  
  [DllImport("user32.dll")]  
  private   static   extern   bool   LockWindowUpdate(System.IntPtr   handle);  
   
  切换时,先锁住窗口不让其刷新,显示窗口,再解锁.  
  WForm2   wForm2   =   new   wForm2();  
  LockWindowUpate(wForm2.Handle);  
  wForm2.Show();  
  LockWindowUpate(System.IntPtr.Zero);  
   
  Top

6 楼fansenwei(绿茵萤火虫)回复于 2004-05-02 14:44:54 得分 0

这个对于摆放在窗体上的控件好像是不管用,它不能控制他们的重绘吧?Top

7 楼wwhile(while)回复于 2004-05-02 16:08:26 得分 1

up,等待ing!!!!!Top

8 楼fansenwei(绿茵萤火虫)回复于 2004-05-02 16:41:23 得分 0

顶,明天结帖,希望多给些意见Top

9 楼ejiue(阿喀硫斯的脚跟)回复于 2004-05-02 16:59:18 得分 1

你试过了没有,可以的.Top

10 楼q7a(wy)回复于 2004-05-02 17:14:57 得分 1

学习ingTop

11 楼lxcc()回复于 2004-05-02 17:21:45 得分 1

刷新前把所有控件的visible=false,刷新完后visible=trueTop

12 楼fansenwei(绿茵萤火虫)回复于 2004-05-02 17:25:46 得分 0

楼上说的只能解决form初始化的情况,对于你拖动form,或者form被其他窗体覆盖又恢复显示造成的控件重绘还是没有效果的~Top

13 楼ljyzc(展翅)回复于 2004-05-02 17:26:19 得分 1

關注,我為這問題煩!Top

14 楼fansenwei(绿茵萤火虫)回复于 2004-05-02 17:26:45 得分 0

我试过了啊,问题还在,不行你给我sample我试试看了Top

15 楼fansenwei(绿茵萤火虫)回复于 2004-05-02 17:43:00 得分 0

mail:fansenwei@sina.comTop

16 楼lxcc()回复于 2004-05-02 18:02:22 得分 1

抱歉,现在没有环境,没法sample!  
  或者来个折中的办法,刷新时,关闭本窗口,然后弹出一个小窗口,提示在刷新,刷新完毕后,再弹出刷新后的窗口!  
  如果控件太多,也可以考虑用Tab控件分类,减少窗体显示时的负担Top

17 楼lxcc()回复于 2004-05-02 22:47:19 得分 1

拖动的时候,也会出现,我记得Form有个什么属性定义拖动操作,具体什么样,没有环境不知道!Top

18 楼jacklupig(jacklupig)回复于 2004-05-02 23:04:58 得分 1

关注Top

19 楼Ginger547(王健旭)回复于 2004-05-02 23:29:22 得分 1

你在窗体上画100个那么多干什么!不错的想法Top

20 楼johnczy(JohnChen)回复于 2004-05-03 05:34:36 得分 1

Try   use   Double-buffering   Form   Style.  
  Ref:   http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolstylesclasstopic.aspTop

21 楼fansenwei(绿茵萤火虫)回复于 2004-05-03 09:14:38 得分 0

双缓冲也是不行的?  
  我在Form上,甚至继承控件类里都加了双缓冲,结果好象没什么变化啊  
  this.SetStyle(ControlStyles.ResizeRedraw,true);  
  this.SetStyle(ControlStyles.DoubleBuffer,true);  
  this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);  
  this.SetStyle(ControlStyles.UserPaint,true);  
  this.UpdateStyles();  
  就是这些吧。  
  Top

22 楼formatwj(wj)回复于 2004-05-03 09:23:43 得分 1

This   question   is   very   good,support!Because   I   meet   it   too.Studing!Top

23 楼fansenwei(绿茵萤火虫)回复于 2004-05-03 09:41:05 得分 0

以上只能解决的是窗体自身重绘,对于他负载的控件的重绘好像是无能为力的。  
  我想怎么能够截断发给控件的WM_PAINT   消息,阻止他的刷新Top

24 楼lihao9806(李昊)回复于 2004-05-03 09:46:19 得分 5

你截取WM_PAINT消息是没用的!在消息队列里的多个WM_PAINT实际上会合并为一个WM_PAINT消息,也就是说只刷新一次。Top

25 楼Elusive(落)回复于 2004-05-03 09:46:51 得分 1

继承控件   控制他的OnPaint   成不?Top

26 楼fansenwei(绿茵萤火虫)回复于 2004-05-03 09:49:13 得分 0

我对每一个控件绑定Paint事件,在拖动窗体时,凡是无效了的控件都执行了该事件啊。Top

27 楼fansenwei(绿茵萤火虫)回复于 2004-05-03 09:58:05 得分 0

唉,阻止他刷新是不行了,这样做的后果就是该刷新的时候不刷新,控件“丢了”,呵呵  
  那就只能怎么提高它的刷新效率了?Top

28 楼fan27(领悟)回复于 2004-05-03 10:06:07 得分 1

强烈关注!Top

29 楼zsuswy(羊)回复于 2004-05-03 10:53:19 得分 1

学习ingTop

30 楼fansenwei(绿茵萤火虫)回复于 2004-05-03 10:59:21 得分 0

唉,失望啊,看来这是.net   framwork的自身的问题了?  
  在其他开发语言里没有这种情况或者肉眼感觉不到这种控件重绘过程  
  有人说在win2003/xp下好一些,是不是这样的?  
  Top

31 楼fansenwei(绿茵萤火虫)回复于 2004-05-03 11:02:14 得分 0

所谓的double-buffer,文档里说是可以减少由于控件重绘造成的闪烁,可我怎么感觉不到这种差别呢,还是我用的不对,请朋友们指教了Top

32 楼lihao9806(李昊)回复于 2004-05-03 11:06:47 得分 1

我觉得都会有这种问题的~~~~~~Top

33 楼fan27(领悟)回复于 2004-05-03 11:50:31 得分 1

谁有这方面的资料?Top

34 楼lgh12345(慧眼数码阅卷王2006)回复于 2004-05-03 16:11:05 得分 1

你可以试一下:  
  刷新时,先临时挂起布局.刷新后再恢复挂起的布局.  
  this.SuspendLayout();  
  ......  
  this.ResumeLayout(false);  
   
   
  Top

35 楼fansenwei(绿茵萤火虫)回复于 2004-05-03 16:30:51 得分 0

不知道该加到哪儿Top

36 楼johnczy(JohnChen)回复于 2004-05-04 06:26:17 得分 20

1.   关于双缓冲:   对不起,双缓冲确实不行,原因是它只对控件本身的重画起作用。  
   
  2。   SuispandLayout   不行  
  The   SuspendLayout   and   ResumeLayout   methods   are   used   in   tandem   to   suppress    
  multiple     events   while   you   adjust   multiple   attributes   of   the   control.   For    
  example,   you   would   typically   call   the   SuspendLayout   method,   then   set   the    
  ,   ,   ,   or     properties   of   the   control,   and   then   call   the   ResumeLayout   method    
  to   allow   the   changes   to   take   effect.  
  它并不能解决repaint   的问题。  
   
  3。   我个人认为你的问题并不好解决。这是WinForm   的运行性能问题。  
   
  4。不过一般来说,你的窗体上不会添加很大量控件。我设计的窗体从来不会超过20个  
  控件。比如加100个PictureBox,是不是光用这些PictureBox   显示图像呢,能否  
  自己直接在Form上画这100个图像呢。  
   
  5.   “这种情况在vb里面是很不明显的”:   你指的是VB6   还是VB.Net?   VB.Net   应该  
  是一样的效果。  
   
  6。介绍一篇WinForm基础文http://windowsforms.net/articles/windowsformspainting.  
  aspx  
  希望对大伙有点帮助!  
  Top

37 楼fansenwei(绿茵萤火虫)回复于 2004-05-04 08:22:47 得分 0

楼上说的不错,我说的是vb6  
  不只是显示图像还要响应鼠标事件,还要根据鼠标事件改变图像显示内容,如果画的话,容易控制么?Top

38 楼fansenwei(绿茵萤火虫)回复于 2004-05-04 08:23:11 得分 0

楼上说的不错,我说的是vb6  
  不只是显示图像还要响应鼠标事件,还要根据鼠标事件改变图像显示内容,如果画的话,容易控制么?Top

39 楼johnczy(JohnChen)回复于 2004-05-05 01:38:28 得分 10

画是没有问题的,使用双缓冲,在ONPAINT   里头用GRAPHIC画,自己定义画在什么位  
  置,大小及STYLE。  
  如果你的图像都没有重迭,事件处理也不成问题。直接在FORM上加鼠标事件处理,  
  从鼠标点击的位置来判断那个图像被选中。Top

40 楼mikespook(CSDN == 吹死大牛)回复于 2004-05-05 03:53:06 得分 2

不是太明白,你要100个PICTURE干什么~~~  
  说说你的目的,说不定可以有替换的方法~~~~Top

41 楼fansenwei(绿茵萤火虫)回复于 2004-05-05 09:02:34 得分 0

我做实时房态的显示,所有相关操作可以通过鼠标操作完成,每个房态显示包括一个图像一个Label.Top

42 楼fansenwei(绿茵萤火虫)回复于 2004-05-05 09:20:00 得分 0

我试试绘制吧,等待结果!Top

43 楼ejiue(阿喀硫斯的脚跟)回复于 2004-05-05 10:48:06 得分 2

那你可以用MsFlexGrid控件,每个cell画一个图象。  
  VB的书上一般有讲到MsFlexGrid这个用途的。Top

44 楼fansenwei(绿茵萤火虫)回复于 2004-05-05 11:12:59 得分 0

楼上说的不中,在.net下Grid控件也会闪烁的,呵呵Top

45 楼fansenwei(绿茵萤火虫)回复于 2004-05-05 11:15:36 得分 0

我试了直接画图像双缓冲,效果还不错,没有闪烁  
  这样做麻烦的就是鼠标事件捕捉了,再试~Top

46 楼dongyp511(白袜子)回复于 2004-05-05 15:15:20 得分 1

ding...偶也碰到这个问题的。Top

47 楼magicworld(helloworld)回复于 2004-05-05 15:50:14 得分 0

http://expert.csdn.net/Expert/topic/3033/3033736.xml?temp=.3871118  
   
   
  此贴有分相送  
   
  c#+sql的项目  
   
  作个资产管理系统的web输入部分,   
   
  基本目标,  
   
  从web页面取得数据,然后保存到sql数据库里面  
   
  现在基本做好框架了,   
   
  但是还有几个问题很难解决,希望找个高手  
   
  来指导一下  
   
  本人,一个月前才开始c# 学习  
   
  比较笨,希望高手不吝赐教,做好以后高分相送(准备送个几百分吧,呵呵)  
   
  qq34214135  
   
  基本全天都在,  
   
  验证csdn  
  Top

48 楼liutaoxwl(寒桑子)回复于 2004-05-05 23:30:17 得分 2

我的一个同事遇到过这个问题,他解决的办法是把透明度设置成0,然后再设置成100,具体步骤不清楚,大家看看通过透明度能不能解决问题Top

49 楼johnczy(JohnChen)回复于 2004-05-06 01:51:43 得分 1

“这样做麻烦的就是鼠标事件捕捉了”:到底是什么问题呢?Top

50 楼JohnHelf(夜深不想睡)回复于 2004-05-06 03:51:59 得分 25

为什么一定要放100个pictureBox呢?  
  把所有picture先做成一个大的bitmap,然后再显示出来不就行了?  
  至于实现控件点击事件,在bitmap的事件里写,根据x,y位置判断就可以知道到底哪个部分被按下了,结合改变bitmap就可以模拟出按钮按下等效果.  
   
  还有,实在不行,在winform里做个web页也是种办法吧?  
  Top

51 楼fansenwei(绿茵萤火虫)回复于 2004-05-07 08:11:11 得分 0

现在改成直接画个大bitmap了,我要捕捉每个小bitmap的鼠标事件啊,显示文字,tooltip之类的,事件接收只能是绘制容器了,楼上说的“在bitmap的事件里写”不明白指的什么!Top

52 楼JohnHelf(夜深不想睡)回复于 2004-05-07 08:42:02 得分 10

不好意思,我是口不择言。  
  其实就是你说的意思啦Top

53 楼flyincs(▄︻┳═一O一═┳︻▄ )回复于 2004-05-07 08:48:12 得分 1

upup  
   
  Top

相关问题

  • Winform窗体中的控件怎么随窗体的尺寸大小改变
  • WinForm窗体如何取窗体中控件输入值??请求帮助!!!
  • 如何动态改变窗体控件的大小???(datagrid和winform)
  • winform下有没有类似web窗体下的CheckBoxList控件?
  • WINFORM 窗体内的 DataGrid 控件 选择的问题.
  • 怎么样让窗体中的DBGrid,Edit等控件得到焦点时系统不自动切换输入法
  • MDIChild窗体中不能使用Tab键切换焦点控件的问题。请高手解答
  • 两个winform窗体之间如何动态改变对方窗体的控件属性?
  • B窗体的事件中更改A窗体中控件的属性,我这样做有什么不对?(winform)
  • 请教一下在C#的WinForm中一个窗体切换另一个窗体的问题

关键词

  • .net
  • vb.net
  • vb6
  • 控件
  • 鼠标
  • 图像
  • 解决
  • winform
  • 效果
  • 窗体

得分解答快速导航

  • 帖主:fansenwei
  • CSharp119
  • sy246
  • fan27
  • ejiue
  • wwhile
  • ejiue
  • q7a
  • lxcc
  • ljyzc
  • lxcc
  • lxcc
  • jacklupig
  • Ginger547
  • johnczy
  • formatwj
  • lihao9806
  • Elusive
  • fan27
  • zsuswy
  • lihao9806
  • fan27
  • lgh12345
  • johnczy
  • johnczy
  • mikespook
  • ejiue
  • dongyp511
  • liutaoxwl
  • johnczy
  • JohnHelf
  • JohnHelf
  • flyincs

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo