如何得到不是相对于容器的坐标,而是相对于窗体的坐标(100分)

  • 主题发起人 主题发起人 first
  • 开始时间 开始时间
F

first

Unregistered / Unconfirmed
GUEST, unregistred user!
比如我在panel中放一个button,那么button的top和left是相对于panel的。<br>在不通过父容器坐标的情况下,如何根据button自身得到相对于窗体的top和left
 
这个还真不清楚,看下哪位能给个答案吧
 
我的做法是:<br>查看控件的Parent,依次加上相应的LEFT/TOP,直到PARENT是窗体,最后得到就是相对于窗体的LEFT/TOP
 
楼主说不通过父容器,有难度啊,不知道能不能实现。
 
继承自 TControl 的控件都有一个 ClientToScreen 方法,这个方法就可以将相对于控件自身的坐标转换成屏幕坐标。<br>例如,你要想知道 Button 的 Left, Top 相对于屏幕的坐标是多少,那么你可以这么写<br>var<br>&nbsp; a, b: TPoint;<br>begin<br>&nbsp; //这里一定要是0,因为Button 的 Left 是相对于容器的坐标,<br>&nbsp; //而 Button 的 Left 相对于 Button 自身应该是0<br>&nbsp; a.X := 0; //Button.Left相对于Button的坐标是0<br>&nbsp; a.Y := 0;//Button.Top相对于Button的坐标是0<br>&nbsp; b := Botton.ClientToScreen(a);<br>&nbsp; //b.X 就是 Button 的 Left 相对于屏幕的坐标<br>&nbsp; //b.Y 就是 Button 的 Top 相对于屏幕的坐标<br>end;
 
PANEL有个HANDLE,找一下有没有相应的API可以取得.
 
procedure TForm1.btn1Click(Sender: TObject);<br>var<br>&nbsp; rect:Trect;<br>begin<br>&nbsp; GetWindowRect(btn1.Handle,Rect);<br>&nbsp; mmo1.Lines.Add('=====相对与panel====');<br>&nbsp; mmo1.Lines.Add('left: '+inttostr(btn1.Left));<br>&nbsp; mmo1.Lines.Add('top: '+inttostr(btn1.top));<br><br><br>&nbsp; mmo1.Lines.Add('====相对于窗体=====');<br>&nbsp; mmo1.Lines.Add('left:'+inttostr(Rect.left-left));<br>&nbsp; mmo1.Lines.Add('top: '+inttostr(Rect.top - top));<br><br>end;<br>
 
我知道怎么作了,如下可以取得控件相对于窗体的坐标<br>procedure TForm1.FormShow(Sender: TObject);<br>var<br>&nbsp; p1,p2,p: TPoint;<br>begin<br>&nbsp; p.X := 0;<br>&nbsp; p.Y := 0;<br>&nbsp; p1 := Form1.ClientToScreen(p);<br>&nbsp; p2 := Button1.ClientToScreen(p);<br>&nbsp; ShowMessage('button1.Top = '+IntToStr(p2.Y - p1.Y));<br>&nbsp; ShowMessage('button1.Left = '+IntToStr(p2.x - p1.x));<br>end;<br>
 
放飞 答的这么清楚了,可以结帖了
 
很簡單的...<br>button.top := panel.top + top;<br>button.left := panel.left + left;
 
to &nbsp;kouchun<br>你还没看明白呢, 再加个容器试一试
 
刚才没看清题目,first 要的是相对于窗体的坐标,而我刚刚给的是相对于屏幕的坐标。<br>现在重新实现如下:<br>procedure TForm1.Button1Click(Sender: TObject)<br>var<br>&nbsp; a, b: TPoint;<br>begin<br>&nbsp; //这里一定要是0,因为Button 的 Left 是相对于容器的坐标,<br>&nbsp; //而 Button 的 Left 相对于 Button 自身应该是0<br>&nbsp; a.X := 0; //Button.Left 相对于 Button 的坐标是 0<br>&nbsp; a.Y := 0;//Button.Top 相对于 Button 的坐标是 0<br>&nbsp; b := Botton.ClientToScreen(a);<br>&nbsp; //b.X 就是 Button 的 Left 相对于屏幕的坐标<br>&nbsp; //b.Y 就是 Button 的 Top 相对于屏幕的坐标<br><br>&nbsp; //如果你还想得到 Button 相对于窗体的坐标,那再进行如下转换<br>&nbsp; a := self.ScreenToClient(b);<br>&nbsp; //a.X 就是 Button 相对于窗体的 Left<br>&nbsp; //a.Y 就是 Button 相对于窗体的 Top<br>&nbsp; //程序写到这里,其实你可以计算出这个 Button 的 Left 和 Top 相对任何一个窗体上的可视控件的相对坐标,只要调用那个可视控件的ScreenToClient(b)就可以了<br>end;
 
谢谢各位,Highpeak的简单用。
 
谢谢大家,Highpeak的很好用
 
我就不信,你把Button放在两个嵌套的Panel上再试试 Highpeak 的方法,看看能不能返回正确的结果?嵌套三层四层试试?<br>要简单是吧:<br>var<br>&nbsp; a, b: TPoint;<br>begin<br>&nbsp; a.X := 0; &nbsp;a.Y := 0;<br>&nbsp; b := Button.ClientToScreen(a);//相对于屏幕的: b.X 是 Left; b.Y 是 Top<br>&nbsp; a := self.ScreenToClient(b);//相对于窗体的: a.X 是 Left; a.Y 是 Top<br>&nbsp; a := Panel_1.ScreenToClient(b); //相对于第一层 Penel 的: a.X 是 Left; a.Y 是 Top<br>&nbsp; //......<br>&nbsp; a := Panel_n.ScreenToClient(b);//相对于第n层 Penel 的: a.X 是 Left; a.Y 是 Top<br>end;<br>够简单吗?<br>多用用面向对象的方法好吗?大哥!<br>
 

Similar threads

回复
0
查看
995
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
后退
顶部