Как разместить этикетку в центре окна изображения? - PullRequest
0 голосов
/ 06 мая 2020

У меня есть Picturebox, содержащий изображение (режим sketchImage), и я хочу сделать прозрачную метку (содержать число) в центре графического окна

Чтобы сделать метку прозрачной, я использую Parent как это (в форме событие загрузки):

Label7.Parent = PictureBox2
Label7.BackColor = System.Drawing.Color.Transparent

, но теперь у меня проблема! когда я запускаю приложение, метка цитируется в нижней части окна с изображением? как это исправить !!

1 Ответ

1 голос
/ 06 мая 2020

Я бы посоветовал вам разместить 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 еще более важно.

...