【问题标题】:Lock control to screen location将控制锁定到屏幕位置
【发布时间】:2016-06-13 06:08:38
【问题描述】:

我有一个带有 Dock = Filled 图片框控件的表单。当我调整窗体的底部或右侧边缘的大小时,可见图片的数量会增加或减少,但图片的屏幕空间坐标保持不变。但是,当我调整表单的上边缘或左边缘的大小时,图片的图像会移动,使其左上边缘与表单的左上边缘匹配。

也就是说,当我调整窗体的左边缘或上边缘的大小时,图片会移动。这种行为在很多情况下都是有意义的,我理解为什么它是默认值,但对于我的情况,我更喜欢它像底部和右边缘那样工作,图像的屏幕空间坐标保持固定并且或多或少调整表格大小时会显示其中的一部分。

在图片中,这是原始形式:

这是通过拖动右下角调整大小的时候:

这也是你拖动左上角时的样子,但在这种情况下,它有点像拖动图片一样,所以图片的左上角总是与表单的左上角齐平。但我宁愿它看起来像这个模型:

因此图片在屏幕空间中基本上是“固定的”,调整表单大小只会或多或少地显示出来。

我尝试过这样的事情:

public partial class Form1 : Form
{
    Point originalScreenSpace;

    public Form1()
    {
        InitializeComponent();

        Shown += Form1_Shown;
        Resize += Form1_Resize;
    }

    void Form1_Shown(object sender, EventArgs e)
    {
        originalScreenSpace = PointToScreen(pictureBox1.Location);
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        var newLoc = PointToScreen(pictureBox1.Location);
        var deltaX = newLoc.X - originalScreenSpace.X;
        var deltaY = newLoc.Y - originalScreenSpace.Y;

        pictureBox1.Location = new Point(-deltaX, -deltaY);
    }
}

但不出所料,结果似乎不太正确(图像的屏幕空间坐标仍然漂移)并且远非平滑。有什么想法吗?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    不要使用Dock 属性。而是将PictureBox 放置在表单上并根据需要调整大小。然后将其Anchor 设置为None

    【讨论】:

    • 这很接近但不太正常:当我调整表单大小时,它似乎在区分移动图片框和不移动图片框之间的区别。也就是说,如果我调整表单的大小以将 (100,100) 添加到其大小(从任何方向),它会移动图像 (50,50)。我希望它要么根本不移动图像,要么将它在一个方向上移动整整 100 个单位,具体取决于我拖动的哪一侧。有什么想法吗?
    【解决方案2】:

    只需设置 Location(0, 0) 并将控件停靠在左侧,顶部:

    pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
    pictureBox1.Location = new System.Drawing.Point(0, 0);
    

    并且不要更改 Form1_Resize 事件中的位置。

    【讨论】:

    • 这不起作用:当控件停靠时,我会遇到与我相同的行为:当我调整底部或右边缘的大小时,它会执行我想要的操作,但在我调整顶部或左侧边缘的大小。
    • 您是否删除了调整大小事件?
    • 是的。它在你的机器上工作吗?如果是这样,您使用的是哪个版本的 VS?
    • 是的,它可以工作,它的 VS 2013 .net 4.5 但没关系。在所有框架中都是相同的。你把我给你的代码放在哪里了?
    • 在表单的构造函数中,在 InitializeComponents() 之后。你确定它可以像我描述的那样在你的机器上运行吗?即使从概念上讲,设置锚点应该只是将图像锁定在表单的左上角,并且不要让表单客户区的左上角和图像的左上角之间有任何空白空间。也就是说,它应该将图像的左上角“锚定”到表单的左上角,在调整顶部或左侧边缘的大小时拖动图像,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2016-05-28
    相关资源
    最近更新 更多