【问题标题】:Recover previous absolute position for PictureBox when Parent is changed?更改 Parent 时恢复 PictureBox 先前的绝对位置?
【发布时间】:2015-05-06 02:34:18
【问题描述】:

在我的 GUI 中,我需要将 ParentsPictureBoxes 更改为背景 PictureBox 以便透明度正常工作。

但是,更改父级也会更改图片框的位置。我曾尝试通过PointToClient 抓取图片框的绝对位置,但它不起作用。我将坐标放在 cmets 中,即使图像明显改变位置,在分配新父级后它们也不会改变。此外,我不认为它可能会工作,因为它正在传递一个点,而不是一个包含更多关于父母的信息的对象以及推断绝对位置所需的东西。

推断元素绝对位置的正确方法是什么,以便我可以在其父项更改后将图像移动到正确位置?或者有更好的方法吗?

Point oldRel = pictureBox4.Location; //258, 109
Point oldAbs = PointToClient(oldRel); //75, -96
//Commenting out this line fixes the image shift but ruins the transparency
pictureBox4.Parent = pictureBox2;  
Point newRel = pictureBox4.Location; //258, 109
Point newAbs = PointToClient(pictureBox4.Location); //75, -96

【问题讨论】:

  • 相对于其父级或表单的绝对位置?
  • 如果你想绝对坐标将所有坐标转换为屏幕坐标。
  • 首先应该是pictureBox4.Parent.PointToScreen(),在你改变父级之后就是pictureBox4.Parent.PointToClient()。
  • 您的问题解决了吗?

标签: c# winforms


【解决方案1】:

这会将 Control child 从一个父级移动到一个新父级,保持屏幕绝对位置不变:

void MoveTo(Control child, Control newParent )
{
    child.Location = newParent.PointToClient(child.PointToScreen(Point.Empty));
    child.Parent = newParent;
}

PointToClientPointToScreen 的诀窍是从正确的父控件中使用它们;不设置控件会默认为Form,这样会错过父级的实际位置..

【讨论】:

    猜你喜欢
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    相关资源
    最近更新 更多