佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1374|回复: 8

C# 视窗event capture 的问题

[复制链接]
阿牙木 该用户已被删除
发表于 30-4-2007 10:57 PM | 显示全部楼层 |阅读模式
我有个windows form, 在普通状态下,上面有个picturebox,图片上会用GDI 画了一些图形,
问题是, 每当有东西盖过那些图片的时候,或者是windows minimized 再还原回来的时候,
所画的图形就会不见,这个时候我就要repaint那些我画过的东西.

我尝试用Form_Resize 的event, 也用了Form_Enter, Form_Paint 等,
都不行. Form_Resize 的event 在还未来得及把picturebox 给画出来的时候就被执行了,
Form_Enter根本没有被叫到, Form_Paint虽然可以达到目的,可是因为会一直不间断的执行repaint的业务而导致画面一直在闪动.

各位大大有什么好介绍吗?
回复

使用道具 举报


ADVERTISEMENT

发表于 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在从画。。
回复

使用道具 举报

Follow Us
发表于 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#怎么用
回复

使用道具 举报


ADVERTISEMENT

阿牙木 该用户已被删除
 楼主| 发表于 1-5-2007 11:22 AM | 显示全部楼层
成功!~
谢谢天才兄,我在C#用DOUBLE BUFFERING了,没问题 不会有flicker  的问题出现!~ 问题圆满解决
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 29-8-2025 09:25 PM , Processed in 0.120328 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表