Я бы посоветовал вам разместить Label
именно там, где вы хотите, в дизайнере, а затем перевести Location
при изменении Parent
, т.е.
Dim labelLocation = myLabel.PointToScreen(Point.Empty)
myLabel.Parent = myPictureBox
myLabel.Location = myPictureBox.PointToClient(labelLocation)
Когда вы добавляете Label
в конструктор, его Parent
будет формой. Первая строка выше содержит экранные координаты Label
в форме. Вторая строка перемещает Label
из формы в PictureBox
, что перемещает Label
в ту же точку относительно левого верхнего угла PictureBox
, как это было в верхнем левом углу формы. . Последняя строка переместит Label
обратно на место, переведя эти экранные координаты в клиентские координаты относительно PictureBox
.
Вот метод расширения, который вы можете использовать для этого для любого элемента управления:
Imports System.Runtime.CompilerServices
Public Module ControlExtensions
<Extension>
Public Sub ChangeParentMaintainingAbsoluteLocation(source As Control, newParent As Control)
Dim absoluteLocation = source.PointToScreen(Point.Empty)
source.Parent = newParent
source.Location = newParent.PointToClient(absoluteLocation)
End Sub
End Module
После добавления, либо непосредственно в ваш проект, либо через ссылку и импорт, вы можете просто вызвать этот метод в элементе управления, который хотите переместить. В вашем случае это будет:
Label7.ChangeParentMaintainingAbsoluteLocation(PictureBox2)
EDIT:
Тем не менее, если вам специально нужен дочерний элемент управления в центре его родительского элемента:
Dim parentSize = parent.ClientSize
child.Location = New Point((parentSize.Width - child.Width) \ 2,
(parentSize.Height - child.Height) \ 2)
1029 * используется, потому что некоторые элементы управления - особенно формы - имеют границы, и эти границы также могут быть асимметричными. A PictureBox
- это один элемент управления, который может иметь границу, что делает размер клиента меньше общего размера. Формы обычно имеют границу, а верхняя часть толще нижней, поэтому использование ClientSize
еще более важно.