关于在bcb中实现图片移动的问题! ( 积分: 100 )

  • 主题发起人 主题发起人 leafsummer
  • 开始时间 开始时间
L

leafsummer

Unregistered / Unconfirmed
GUEST, unregistred user!
我打算在窗体上放两个image,image1作为背景图片,image2可以在image1上移动,image1是个空间的平面图,我想让image2按照image1上的指定路径移动
我现在利用改变image2关于窗体的坐标可以实现image2的移动,但是要按照image1上的路径进行移动,我不知道该怎么实现,请教各位高人指点!
 
我打算在窗体上放两个image,image1作为背景图片,image2可以在image1上移动,image1是个空间的平面图,我想让image2按照image1上的指定路径移动
我现在利用改变image2关于窗体的坐标可以实现image2的移动,但是要按照image1上的路径进行移动,我不知道该怎么实现,请教各位高人指点!
 
下面是本人采用一种笨办法实现,不知是否合适:
思路:在Image1上移动鼠标,模拟Image2移动的线路,在移动鼠标的同时记录鼠标经过点位置(关于Image1的坐标),之后让Iamge2沿刚才鼠标移动过的位置移动。
1、定义image2移动的线路点数据组(在头文件中定义)
int movep[2][10000];//这里为移动10000点
2、定义计数器(在头文件中定义)
int mx,moveid;
3、增加计时控件 Timer1
属性:Enabled=false;
InterVal=300;
目的:设定Image2移动速度
4、增加一个CheckBox1
目的: 当CheckeBox1选中时开始记录鼠标移动的位置
5、增加一个Buitton1
目的:开始移动Image2
下面是完整的代码,以供参考:
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(CheckBox1->Checked==true&amp;&amp;mx<10000)
{
movep[0][mx]=X;
movep[1][mx]=Y;
mx++;
}
//取得Form1的DC
HDC hdc = ::GetDC(Handle);
//取得鼠标位置的位图色彩
COLORREF pcolor = ::GetPixel( hdc, X, Y );
//逐一用宏取出RGB色彩值
unsigned int r = GetRValue(pcolor);
unsigned int g = GetGValue(pcolor);
unsigned int b = GetBValue(pcolor);
//将结果实时显示在Form1标题文字中
Caption =&quot;鼠标位置:X = &quot;+AnsiString(X)+&quot;
,Y =&quot;+AnsiString(Y)+
&quot;,位图色彩:R:&quot;+AnsiString(r)+&quot;_G:&quot;+AnsiString(g)+
&quot;_B:&quot;+AnsiString(b);
//释放Form1的DC handle
ReleaseDC(0,hdc);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(moveid<mx)
{
Image2->Left=movep[0][moveid];
Image2->Top=movep[1][moveid];
moveid++;
}
else
{
moveid=0;
Timer1->Enabled=false;
}
}
//---------------------------------------------------------------------------
 
hwm1963,你给出的方法还是不能解决我的问题,你的方法需要鼠标在图上移动,来得到路径,我要实现的系统中是不允许以此方法来获取相对路径的
我自己也想了一下,假设x1,y1为image1的坐标,x2,y2为image2的坐标(均是相对于FORM的坐标),令x=x2-x1,y=y2-y1;x,y即image2相对于image1的坐标了,我通过改变x,y来实现image2的移动,你觉得呢?大家觉得呢?
 
你想复杂了吧?
既然你系统是自动的,那么你完全可以把你要移动的那个线路做个路点文件嘛,可以直接用个链表或者Point类型的数组,你依次设置你的image2的x,y为你预先设定的X,Y不就实现移动了吗?
 
是我说的不清楚,我要实现的是这样的
我给定image2的起始坐标和最终坐标,坐标都是从通信模块传过来的数据,算是随机的吧,所以路线也就不是确定的了,所以我事先不能设计好路线的
 
如果你不设计路线的话那起码你要知道下一步朝什么地方走吧??
这是必须的前提,所以我问你你下一步朝什么地方走?你的这个地方是根据什么得到的呢?
我认为这就是问题的关键,你要按你系统里的方法来得到这个新的坐标,也是根据通信模块出来的数据?
 
感觉复杂了,其实Image1只是一个背景而已,而真正的路径信息是需要单独成一个文件的,
或者另外存在什么地方,当有信号来的时候需要和这些数据匹配,然后根据移动,最简单的办法就是和这个这些路径的线段求中垂线,求最近的就是,然后靠过去
如果说不需要这么复杂和准确,动态设置Image2的top和left不就行吗?反正无所谓
楼主是不是在做GPS车载的,用我说的第一种方法吧
 
我不是坐车载的,但是类似,是做井下人员跟踪定位的,来如风,chenbin,你们说的我还是不太理解,你能说的详细一点么?
 
他和我说的应该是同一个意思,简单说,那个底图不应该是栅格图,应该是矢量图,或者底图是栅格图,但是另外需要一个矢量数据,也就是井下真实路径的哪些数据,因为传回来的数据可能不那么准确,所有需要做匹配,比如人在通道上,但是数据可能是人在墙壁里面了,所有要按我说的去匹配,至于画图就容易,用bsClear的方式贴上来就可以了,改变一下位置,是这样吗?
 
两个问题:1、路径信息怎么保存?
2、怎么匹配?你说的我不太清楚,匹配之后把图片贴上去么?那如果直接贴图的话就看不到连续移动的效果了吧?
 
多人接受答案了。
 
后退
顶部