一个画图程序,就出这个问题,进不得,退不得,好烦:
画布问题:
        如果用TImage,刚开始不要改变大小,那么无论画什么,直线,矩形,
实心图形,一点儿也不会闪。如果程序运行中把Timage变小,也不会出问题。但如果变大却变不了,而且之后就狂闪了。Tmage不能变大的吗,而且如果它的Align设为Client之后,也就是充满整个Panel之后,画线时也会狂闪。
        如果用TPaintBox,总体不会闪了,但局部还是会,就是当画实心矩形的时候,那实心部分就明显地闪了。各位有没有做这类画图的程序呀,现在烦死了,提提意见啊,怎么才能使画布不闪。或者是我上面的控件没有设什么属性了,大家说一下吧。

解决方案 »

  1.   

    Form1.DoubleBuffered:=true;还有你用的哪个版本的Delphi,不同的版本TImage的行为确实有点不一样,我记得6。0的好像确实有闪烁的问题。
      

  2.   

    sorry, 发错了,
    也许打开 DoubleBuffered 会好点的!!具体解决,要看代码
      

  3.   

    我用的是D7,没有改变大小的时间,TIMage是一点儿也不会闪的,但把尺寸变大,闪烁就来了,
    我试试下DoubleBuffered 试下
      

  4.   

    但是Form的DoubleBuffered ,会影响到画布控件吗
    我试了一下,和原来的一样,但我这次用的是TPaintbox,就会局部分闪烁
    用纯API画,也会。不用看具体代码的,就是用鼠标拉出一个实心矩形那样,像Windows的画图程序那样
    就会局部闪烁了,有没有办法解决
      

  5.   

    有点问题,用API也没闪吗,顶
      

  6.   

    就是这点才郁闷啊,星星球,你知道有什么第三方控件吗。说清楚一些好不好,不要这样一句话就带过了。
    你们用PaintBox画的时候会不会局部产闪烁啊,我现在只想问这个问题了?
      

  7.   

    首先要打开DoubleBuffered。不论你用PaintBox还是Image产生闪烁的应该原因都是由于你的画法所引起的。就象画填充图形时,闪烁的原因可能是你在频繁的擦除背景。在画图的过程中,由于鼠标一直在移动,用户也没有决定是否图形就画成这个样子的时候,你没有必要把色彩也填充进去,用虚线画一个轮廓就可以了。当用户放开鼠标后,再将颜色填充进去就不会产生闪烁了。
      

  8.   

    闪烁是因为重画,你试试在窗口的CANVAS上画一下
      

  9.   

    fengjn(颗粒): Timage不改变大小时用我方法画,一点儿也不会闪呢? 我现在的问题奇怪到什么样子,用PaintBox时,即使是画线,也能明显地看到,线中的闪烁
    我只想问大家用Painbox会有这样的情况吗,我开始怀疑我的电脑了。  另外,如果一直不停地画,会不会一直在耗用系统的内存,我一直狂画线时,内存过一段时间就增长几K。
      

  10.   

    这个问题我也碰到过,但也是苦于无法解决。刚刚楼上所说的来个DoubleBuffered,实在不懂是何含义,能否说得具体点,这样有什么作用吗?
      

  11.   

    to  wychero(高天)
    是TImage所在的父容器(TForm,或TPanel,TScrollBox之类的)的DoubleBuffered属性to linzhengqun (linzhengqun) 
    画选择框时,一般用异或笔直接画就可以了,不需要重绘原来的图。。
      

  12.   

    知道双缓冲吗?画图实际是在内存中进行得,显示给client 得只是帖上去得,这个是避免闪烁得根本办法。
      

  13.   

    http://www.gameres.com/Articles/Program/Visual/2D/GDI.doc
    http://www.gameres.com/Articles/Program/Visual/2D/GDIDraw.htm看看这两个文档,游戏可以用GDI api做,TCanvas 就是GDI 得封装,为什么游戏不闪烁?DoubleBuffered 你可以当它不存在
      

  14.   

    to: fengjn(颗粒) 有个办法:
         只要不是鼠标移动就重绘就行    给重绘过程加个条件,把绘图限制一下 比如重绘过程中sleep试试 或者用timer  一段时间绘一次(timer不精确,最好能自己做一个)
      

  15.   

    谢谢大家的意见,我终于解决了,在这里提示出我这几天折磨出来的经验,也算对大家的回馈吧:
    首先,如果要做一般的画图程序,不需要TPaintbox,用TImage就行了
    理由如下:
    用Tpaintbox有以下不好
    一:它会局部闪烁,当你画实心形时可以明显看出来
    二:它要处理Paint事件,以解决画面的保存问题,但有一个问题,就是当它上面有别的窗口在的时候,它保存后的图象会连那个窗口在它上面的部分也保存进去,处理Paint事件时把图象恢复出来时,就会看到窗口的一部分也在它上面了。用Image的理由如下:
    一:D7的Image已经解决了闪烁的问题,但当动态改变它的大小时要注意,不要写这样的代码:Image.width:=.....,如果你这样写,尺寸比原来的大时,它不会变大,而且之后它就会狂闪了。应该是这样写:Image.picture.Bitmap.width:=......,这样写之后,它就会作相应的变化,而且仍然一点儿也不会闪,这也是我今天最大的发现。
    二:Image不用解决重画的问题。
    好了,相信我上面的经验是有价值的。我的问题总算是解决了,虽然是我自己摸索出来的,但你们的帮助也让我学到不少
    行了,结贴。希望大家一起努力。