相对于表单或屏幕定位UserControl

时间:2014-09-19 12:53:13

标签: vb.net winforms user-controls location

有没有办法获取和设置.Location的{​​{1}},UserControl位于Container(例如Panel)相对于“...父母“表格?

我知道有可能计算Panel本身的偏移量并将其添加到.Location的{​​{1}}。

但在我的情况下,父级别的数量是未知的,并且可能因情况而异。 因此,UserControl可以放在直接位于UserControl的{​​{1}}上。但Panel也可能会放在FormUserControl上的Panel上的第二个Panel

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果您考虑计算Panel的偏移量并递归计算返回表格的偏移量,该怎么办?即我在Panel1中的Panel2中有一个Textbox1。 Panel1位于.Left 266,Panel2位于Panel1内的.Left 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 :(得分: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

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