怎样捕捉到动态的控件的位置(50分)

  • 主题发起人 主题发起人 elfgirl
  • 开始时间 开始时间
E

elfgirl

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序运行过程中新建了一个BitBtn控件,想捕捉到它的位置.应该怎么办?[:(]
 
给他赋一个变量,读这个变量的left,top就可以了。
 
不行的,我是在单击另一个控件后建立的这个新控件.而且这个新控件可以任意移动.因为我是在原有的那个控件的代码下建的新控件,所以用你的办法只能获得当时刚建好的位置,但是移动后的还不行.有什么办法没有?[:(][:(]



 
可以的呀,你把这个变量设成全局变量,在需要的时候调用一下就知道了的。
 
不行,看来我还没有把问题讲清楚.我的源代码如下:void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
TBitBtn *BitBtn11=new TBitBtn(this);
BitBtn11->Kind=BitBtn1->Kind;
BitBtn11->Visible=true;
BitBtn11->Glyph=BitBtn1->Glyph;
BitBtn11-> Parent=Form1;
BitBtn11->Width=BitBtn1->Width;
BitBtn11->Height=BitBtn1->Height;
BitBtn11->Top=67;
BitBtn11->Left=16;
BitBtn11->OnMouseMove=BitBtn1MouseMove;//移动控件,因为BitBtn1MouseMove下有移动的代码
BitBtn11->OnMouseDown =MyHandler;//BitBtn11为新建的*我想捕捉到它的移动位置
}
void __fastcall TForm1::MyHandler(TObject *Sender)
{
TBitBtn *ct2;
ct2=(TBitBtn*)Sender;
spt.x=ct2->Left;
spt.y=ct2-> Top;
}
 
我在delphi下这样写,是可以的,你看一下。

procedure TForm1.Button1Click(Sender: TObject);
begin
with tbutton.Create(self) do
begin
visible:=true;
parent:=self;
onmousemove:=Button1MouseMove;
onmousedown:=Button1mousedown;
end;
end;

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
caption:=inttostr(Tbutton(sender).Left);
end;

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Tbutton(Sender).Left:=Tbutton(Sender).Left+x;
Tbutton(Sender).top:=Tbutton(Sender).top+y;
end;
 
你这样不是新旧控件的left值都给了各自的caption,我只想获得新控件的位置
 
我只是通过caption显示一下left的值而已的,举个例子。你可以把他们的事件设为不一样的。
我试下来,caption反映的是当前button所在的位置的。
 
但是我试了试,传递的left值却是刚开始移动的位置的值,也就是你按下鼠标的点的值,而不是移动后停在那里的值.谢谢了,可不可以继续帮我解决问题[:)][8D][:(]
 
把你mousemove事件贴出来我看一下。
 
void __fastcall TForm1::BitBtn1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
WORD SC_DragMove=0xF012;
ReleaseCapture();
((TWinControl*)Sender)->Perform(WM_SYSCOMMAND,SC_DragMove,0);
}
你说我把刚才你给我的代码将mousedown改为mouseup捕捉鼠标抬起的值,为什么不行呢
 
调用ReleaseCapture()后,mouseup不会被触发的。
可以不用写mousedown的,在mousemove后处理就可以了。

Sender)
{
TBitBtn *BitBtn11=new TBitBtn(this);
BitBtn11->Kind=BitBtn1->Kind;
BitBtn11->Visible=true;
BitBtn11->Glyph=BitBtn1->Glyph;
BitBtn11-> Parent=Form1;
BitBtn11->Width=BitBtn1->Width;
BitBtn11->Height=BitBtn1->Height;
BitBtn11->Top=67;
BitBtn11->Left=16;
BitBtn11->OnMouseMove=BitBtn1MouseMove;//移动控件,因为BitBtn1MouseMove下有移动的代码
spt.x=16;
spt.y=67;
}


void __fastcall TForm1::BitBtn1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
WORD SC_DragMove=0xF012;
ReleaseCapture();
((TWinControl*)Sender)->Perform(WM_SYSCOMMAND,SC_DragMove,0);
spt.x=((TBitBtn*)Sender)->Left;
spt.y=((TBitBtn*)Sender)-> Top;
}

 
谢谢,可搞定了,但是你知道怎么样让连接于两个可以移动的控件之间的线,可以随着控件的移动而移动.即连线随着控件动,谢谢[:)][:)]
 
你把原来的线擦掉,重新画一次就可以了。
即把画线模式
 
不过这样做不动态,因为它是移动完后才出来线,而不是你拖到哪里线跟到哪里.看我的代码
void __fastcall TForm1::Button3Click(TObject *Sender)
{
flag=true;
}
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if(flag)
Form1->Canvas->LineTo(ept.x,ept.y);//ept为另一个控件mousemove中的动态点坐标
}
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if(flag)
Form1->Canvas->MoveTo(spt.x,spt.y);//spt点即为一个控件中的mousemove中的动态点
}
请问你有何高见?
 
这种情况一般是这样处理的
把canvas.pen.mode=pmxor;这是一种异或方式,即同一条线画两次就是擦线。
在移动过程中,先照原线画一条,擦掉上一次画的,然后在新的位置画一条。这样就可以形成一咱动态的效果。
 
但是我添上这句话后,一条线也画不上了.为什么[:(][:(][:(]
 
刚才写错了,应该是pmxor;你可以试一下下面的:

var
flag:boolean;
sx,sy,oldx,oldy:integer;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
flag:=True;
sx:=0;
sy:=0;
oldx:=x;
oldy:=y;
canvas.MoveTo(sx,sy);
canvas.Pen.Mode:=pmnotxor;
canvas.LineTo(oldx,oldy);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if not flag then exit;
canvas.MoveTo(sx,sy);
canvas.LineTo(oldx,oldy);
oldx:=x;
oldy:=y;
canvas.MoveTo(sx,sy);
canvas.LineTo(oldx,oldy);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
flag:=false;
canvas.MoveTo(sx,sy);
canvas.LineTo(oldx,oldy);
end;
 
这样可以了,但是屏幕抖动的很厉害,有没有再好点的方法.谢谢
 
暂时没有,要你自己多研究研究了.[:D][8D]
 

Similar threads

回复
0
查看
815
不得闲
S
回复
0
查看
906
SUNSTONE的Delphi笔记
S
S
回复
0
查看
884
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部