【问题标题】:How to post label in center of picture box?如何在图片框的中心张贴标签?
【发布时间】:2020-05-06 15:21:04
【问题描述】:

我有一个包含图像的图片框(sketchImage 模式),我想在图片框的中心制作一个透明标签(包含数字)

所以为了使标签透明,我像这样使用父级(在表单加载事件中):

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

但现在我有问题!当我启动应用程序时,图片框底部的标签 cituate ?怎么解决!!

【问题讨论】:

  • 当你设置一个新的父控件时,子控件的坐标现在是相对于父容器的。因此,如果子控件.Location = (0, 0),它将从前一个父级的上/左角移动到新父级的上/左角。如果Control.Location 是(100, 100),那么...
  • 什么是sketchImage模式?我在 WinForms 中没有看到 PictureBox 的模式属性。
  • @Mary Sounds StretchImage
  • 您拥有名为Label7 和PictureBox2 的控件非常糟糕。现在养成总是为事物提供有意义的名称的习惯。在没有先验知识的情况下阅读该代码的人不会知道这些控件的用途,包括您自己,如果您暂时离开这个项目并稍后再回来。
  • @JQSOFT 是的!与朋友在线玩了 4 小时的桥牌。我现在看到了,谢谢。

标签: vb.net label picturebox


【解决方案1】:

我的建议是您将Label 放置在您希望它在设计器中的确切位置,然后在您更改Parent 时翻译Location,即

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)

编辑:

也就是说,如果您特别希望子控件位于其父控件的中心:

Dim parentSize = parent.ClientSize

child.Location = New Point((parentSize.Width - child.Width) \ 2,
                           (parentSize.Height - child.Height) \ 2)

使用ClientSize 是因为某些控件(尤其是表单)具有边框,而这些边框也可能是不对称的。 PictureBox 是一个可能有边框的控件,使客户端大小小于整体大小。表单一般都会有边框,顶部比底部厚,所以使用ClientSize就更重要了。

【讨论】:

  • 请注意,您不需要知道老Parent,您可以使用source获取屏幕坐标并将它们转换为newParent,如下: source.Location = newParent.PointToClient(source.PointToScreen(Point.Empty))。不过,您可能需要source.BringToFont()。
  • @Jimi,公平点。我已经更新了代码以使用源代码控制而不是旧的父级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多