怎样拖动在image控件上用canvas画出的图?(50分)

  • 主题发起人 rocky_cao
  • 开始时间
R

rocky_cao

Unregistered / Unconfirmed
GUEST, unregistred user!
我利用canvas在image上画出了一些图形,现在我要对其中的某幅图进行拖动,我应该怎么做?
这个问题有三方面的问题要解决:
1,怎样获得我已画出图形的焦点?也就是如何判断我要拖动的是哪一幅图。
2,如何删掉原来的图形?
3,如何根据鼠标拖动以后的位置画出新的图形?
 
你最好换个思路了,直接在image的canvas上画图不可能获得焦点的,连image都没有焦点。

实在还要这么做可以判断鼠标位置:
1.鼠标在某个位置表示刚才画了什么东西的地方;
2.用XOR方式再画一次就删除了;
3.拖动后到把原来的擦除,到新位置再画一次。
 
你的问题涉及到2个方面 :
1.任意形状图象区域的拷贝
2.图象的清除.
拿最简单的矩形图象的拷贝来说吧 :
当你选择了一块矩形图象以后,你首先要保存为temp1,然后移动,每次移动到的位置,
先将该位置的图象保存,为temp2,然后将temp1BitBlt到上面,当移走以后,
你又要将temp2BitBlt到其初始位置,直至你最后停止移动.
 
这个你可以建一个图层(Layer),这样就可以,图层的控件可以找到的。
 
卷起千堆雪tyn,你的方法好像太麻烦了一点,如果我要拖动很多幅图的话,那不是很那个?
我觉得wjiachun的方法是可行的,WJIACHUN你能不能说得明白一点?
具体如何做?
 
我觉得该说的都说完了,我的方法只对你自己绘制的Line,Shape等有效。
而卷起千堆雪tyn 的方法在处理任意图像(比如来自bmp等)是很合适。
你自己看着办吧!
 
这个问题我的一位老师曾经做过,
你先要记住每一块的坐标!!!
然后根据mouse的动作,确定是否在你的坐标之内!
如果是,重画图形!就是给图形加上选中标志
删除也就是不停地重画,但你要防止闪shuo!!

注:image并不需要得到焦点,只不过用image有另外一个问题,你没问也就不说了,
我要吃饭了。
 
我觉的这些方法都不好 :(
应该有更好的方法。
 
你能在image控件上画东西吗?我怎么不行?一画就说不可以:(
所以我画都在paintbox上画的
至于如何判断选择的哪个图形的问题,我有以下建议:
做一个类似photoshop那样的图层选择器,当然这只是表象,内在的应该每个图层存储了
当前被选图形和其他图形的大小,位置,颜色。。。。显然这是个比较笨的办法 :(
但。。。也说不定大名鼎鼎的东东就是这个原理那,哈哈哈(阿q精神)

拖动的时候就判断当前是那一层(当前要移动哪一层在图层选择器里选择),然后依据各个
图形之间的层次关系依次重新绘制整个图,当然别忘了把移动的图形重绘到新位置 :)
 
要想知道鼠标点中的是什么图形几乎是不可能的,因为它根本不是一个对象,要想选中、移动
都不太可能。
最好的办法我觉得还是做成类似图层的效果,如用几个Image叠加,设为透明,每增加一个对象
就生成一个Image,不过这样如果图形比较复杂的话,程序就太消耗资源了,呵呵,不知还有
没有别的好方法?

to wdl:Image可以画东西啊?你的程序提示什么错误?我用的代码如下:
image1.Canvas.TextOut(1,1,'hello');
如果不行的话试试下面这一句,肯定是可以的。
image1.Picture.Bitmap.Canvas.TextOut(1,20,'hello');

 
建议你用缓冲(TBitmap 对象)来实现,否则会出现闪烁:
首先把背景放在一个缓冲TBitmap对象中
在mouseup事件中将你要拖动的图形先画到背景缓冲中
然后将缓冲中的画面拷贝到图形显示区域
只用这样才能够避免出现闪烁

 
我已经弄出来了,谢谢大家了!
 
顶部