有没有办法获取和设置.Location
的{{1}},UserControl
位于Container
(例如Panel
)相对于“...父母“表格?
我知道有可能计算Panel
本身的偏移量并将其添加到.Location
的{{1}}。
但在我的情况下,父级别的数量是未知的,并且可能因情况而异。
因此,UserControl
可以放在直接位于UserControl
的{{1}}上。但Panel
也可能会放在Form
上UserControl
上的Panel
上的第二个Panel
。
答案 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
请记住,如果新位置在父区域之外,则控件将不可见。