做绘图软件用TImage好,还是TPaintBox好? (50分)

  • 主题发起人 主题发起人 ozj
  • 开始时间 开始时间
O

ozj

Unregistered / Unconfirmed
GUEST, unregistred user!
本人想做绘画软件,即用鼠标在屏幕上作图,而且可以调进其它图片,
不知用Timage好,还是用TpaintBox好,为什么?我想Timage方便点,
可直接作图和调进图,但好象作图时屏幕会闪;用TpaintBox呢,不
能调进图且只能在onpaint中作图,不方便,不知各位有何高见?
 
建议你用 TImage 控件,TImage 控件刷新时会闪是可以解决的。
1.Form1.DoubleBuffered:=True; //在 Form1 的 OnCreate 事件中;
2.InvalidateRect(Form1.Handle, Nil, False);// 在 TImage 控件刷新语句后。
以上两种方法用一种就可以。
 
虽然以前有讨论过不少此类问题,我觉得有必要再讨论一次,谢谢zhihuali.
 
难道大家对此问题都太了解了吗?不屑一答?
 
建议自己从TCustomControl或TGraphicControl或TPaintBox继承下来写一个控件。

>>Timage作图时屏幕会闪
简单设置Timage.Stretch := True就不闪,或者复杂点你重写TImage的重画方法。
 
PaintBox OfCourse
否则你会后悔的。
 
还是用paintBox吧,你用了以后会发现比用iamge好多了(我是指编程方便)
 
一点小经验:用一个TBitmap来起缓冲作用。
 
TImage的内存组织太浪费了,不适合做图象编程。TPaintBox是一个不错的选择,因为
它将许多东西交给你来控制。
但是我建议你两个都不用,因为他们都太简单。许多重复性的工作可以在大量的开源控件
中找到。按照我的经历,Graphic32是一个不错的控件,结构非常清晰,值得在上面做补充
开发。
 
如果我在TpaintBox中的canvas中加载了一张图片,
哪么是不是应该在onpaint事件发生时在该过程中再加载一次呢?
另外,在Tpaintbox中,所有的绘图等操作是不是都应该在
onpaint事件中实现呢?
 
onpaint的时候主要显示就行了,不需要重复加债。

if assigned(Fbitmap) then //已经读进来了
paint FBitmap; //用bitblt或者canvas.draw

我觉得你还是在内存中建立一个大的bitmap比较好,所有的绘画都在这个bitmap上进行,
paintbox只是用来显示这个bitmap。
 
to Adnil
>> paint FBitmap; //用bitblt或者canvas.draw
是不是该bitblt会足够快到让人感到不闪呢?你是不是已有应用它的经验呢?
 
比如说我已用鼠标在canvas画图形,当我要用鼠标增加新的图形时,
原已画的图形是不是会重画一次?
 
to ozj:
bitblt是非常快,对减小闪烁有些作用。但一般来说闪烁并不是PAINT引起的,
而是由于重画客户区引起的。即使你在PAINT中不填充画图区,重画时可能也会自
动填充。
 
足够快了,呵呵!只要你的图不是很大很大,例如(2000*2000)
增加新的图形时候需要重画的,但你可以自己控制,添加的时候只是加上新的,但在
onpaint事件里面肯定需要重新画bitmap了,或者让系统自己管理.
 
用image或bitmap时,会遇上图像尺寸过大时无法创建画布的问题,用paintbox就不会了,
其实可以在后台使用emf画布,在后台绘制完毕后再拷到前台的paintbox中,这样可以避
免因图像尺寸过大而引起的错误,而且闪烁也不是很明显。
 
我需要在底图上用鼠标在屏幕上作图,如果我用一个bitmap在后台画,
则画上一段线段,这线段要马上在Tpaintbox中表现出来,则要重新
把整个bitmap拷贝到Tpaintbox中,是不是?
各位大哥,能否给一点你们做过的例子吗?
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
930
DelphiTeacher的专栏
D
D
回复
0
查看
871
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部