winform问题:在窗体上添加大量控件时,会造成在窗体切换时强烈的刷新感,怎么解决?
在窗体上放置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中一个窗体切换另一个窗体的问题




