查看: 1373|回复: 8
|
C# 视窗event capture 的问题
[复制链接]
|
|
我有个windows form, 在普通状态下,上面有个picturebox,图片上会用GDI 画了一些图形,
问题是, 每当有东西盖过那些图片的时候,或者是windows minimized 再还原回来的时候,
所画的图形就会不见,这个时候我就要repaint那些我画过的东西.
我尝试用Form_Resize 的event, 也用了Form_Enter, Form_Paint 等,
都不行. Form_Resize 的event 在还未来得及把picturebox 给画出来的时候就被执行了,
Form_Enter根本没有被叫到, Form_Paint虽然可以达到目的,可是因为会一直不间断的执行repaint的业务而导致画面一直在闪动.
各位大大有什么好介绍吗? |
|
|
|
|
|
|
|
发表于 1-5-2007 12:01 AM
|
显示全部楼层
老兄, 关于 .net form 的经验我不是很多, 但我记得可以用 invalidate() 的方法来解决, 这是我很久前做 dragdrop 的时候用到的. 你可以尝试一下. |
|
|
|
|
|
|
|
发表于 1-5-2007 01:31 AM
|
显示全部楼层
倘若你要minimize,或东西盖过那个gdi画出来的东西还在的话,
照理上来说是应该放在form_paint里的。。
不过你说它会闪动,也就是说paint event handler一直被trigger..
那是为何,我也不清楚了你的程序了。
因为那个event handler只会被启动若有paint event..
而羊老大说的invalidate就是让你manually去trigger一下那个paint event.. |
|
|
|
|
|
|
|

楼主 |
发表于 1-5-2007 01:40 AM
|
显示全部楼层
是不是因为我的FORM里头有TIMER的关系?
我在想是不是因为TIMER_TICK的关系,导致每一次都要PAINT多一次.
羊兄和天才兄,还需要你们多帮忙 |
|
|
|
|
|
|
|

楼主 |
发表于 1-5-2007 01:48 AM
|
显示全部楼层
我刚才去试了一下FORM_PAINT,我发现问题出现在哪里了,可是还是没有解决的方法.
如果是用Picturebox_Paint 来重画那些图形,那就会有图形一直闪烁的问题.
如果放在Form_Paint里,那就不会有闪烁的问题,
可是... 当我从MINIMIZE里回来的时候,我发现它会先画图形出来,再Paint picturebox, 所以我画的东西都不在了. >_< |
|
|
|
|
|
|
|
发表于 1-5-2007 01:49 AM
|
显示全部楼层
你看到闪动是因为它clear到完后在从新画过。。所以你会看到被clear到完的那一杀那。。然后又被画回。。
有个方法可以解决闪动的。。叫做double buffering..
也就是把grpahic 画在一个buffer..然后直接跟眼前的graphic做个swap... 而不是clear 到完眼前的graphic在从画。。 |
|
|
|
|
|
|
|
发表于 1-5-2007 02:14 AM
|
显示全部楼层
用以下我写的draw来取代invalidate吧。
sub draw()
Dim buffer As New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)
Dim HDC As Graphics = Graphics.FromImage(buffer)
HDC.Clear(Color.Black) '<----Now i clear the buffer's graphic not the screen's graphic,so u wont notice it....
Dim b As New SolidBrush(Color.Blue)
HDC.FillRectangle(b, x1, 20, 100, 100) '<---draw whatever u want in the buffer
Me.CreateGraphics.DrawImageUnscaled(buffer, 0, 0) '<---let the screen displays whatever in the buffer
End sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
x1 += 1 'whatever calculation needed....
'invalidate() 'originally this is what u do to make the screen update. But it causes FLICKER
draw() 'now u use this to make the screen update.
End Sub |
|
|
|
|
|
|
|

楼主 |
发表于 1-5-2007 10:32 AM
|
显示全部楼层
那和我昨天想的一样,不过太累了就跑去睡觉,谢谢天才兄,我会想看看C#怎么用 |
|
|
|
|
|
|
|

楼主 |
发表于 1-5-2007 11:22 AM
|
显示全部楼层
成功!~
谢谢天才兄,我在C#用DOUBLE BUFFERING了,没问题 不会有flicker 的问题出现!~ 问题圆满解决 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|