2014-09-19 17 views
1

是否有任何的方式来获得和设置UserControl.Location,其被定位在Container(例如Panel)相对于所述“最亲本”的形式?定位用户控件相对于形式或屏幕

我知道有可能计算Panel本身的偏移量并将其添加到UserControl.Location

但在我的情况下,父级别的数量是未知的,并且可能因案例而异。 因此,一旦UserControl可以放在Panel上,它直接在Form上。但是也有可能是UserControl被放置在第二个Panel上,该第一个Panel位于Form上。

回答

1

尝试:

Dim pnt As Point 

pnt = UserControl.PointToScreen(New Point(0, 0)) 
pnt = Me.PointToClient(pnt) 

这个位置相对于计算出你的形式。更改任何控制,如果你喜欢

现在,如果你想设置位置如(100,100),相对于你形式

pnt = Me.PointToScreen(New Point(100, 100)) 
pnt = UserControl.Parent.PointToClient(pnt) 
UserControl.Location = pnt 

记住,如果新位置在父区域之外,控件将不可见。

+0

您是否知道哪种解决方案更适合您的表现?您是Capellan的吗? – mookey 2014-09-19 15:56:17

+0

@mookey如果你几次打电话都没有区别的话。但是如果你一秒钟给他们打电话多次,因为我正在使用本机功能。尽管如此,你必须进行测试。 – 2014-09-19 16:27:34

1

如果您将计算面板的偏移量并递归计算偏移量返回窗体的想法是什么?即我在Panel1内的Panel2内有一个Textbox1。 Panel1位于.Left 266,Panel2位于Panel1内的左侧77。

Private Function GetLeftOffset(ByVal UserControl As Control) As Int32 
    Dim intLeftOffset As Int32 = 0 
    If Not TypeOf UserControl.Parent Is Form Then 
     intLeftOffset = UserControl.Parent.Left 
     intLeftOffset += GetLeftOffset(UserControl.Parent) 
    End If 
    Return intLeftOffset 
End Function 

现在,如果我GetLeftOffset(Me.TextBox1),它返回343(266 + 77)的偏移量。

2

我使用这个函数将一个上下文菜单放置在像文本框或按钮之类的控件附近。您可以将x和y设置为零以返回控件本身的位置。

'--- Return the screen location of a control with an offset 

Private Function Offset(ByRef controlObj As Control, ByVal x As Integer, ByVal y As Integer) As Point 

    Dim pt As Point 
    Dim parentObj As Control = controlObj.Parent 

    Do While parentObj IsNot controlObj.FindForm 
    x += parentObj.Location.X 
    y += parentObj.Location.Y 
    parentObj = parentObj.Parent 
    Loop 

    pt = PointToScreen(controlObj.Location) 
    pt.Offset(x, y) 
    Return pt 

End Function 
相关问题