【问题标题】:Table layout panel cell bounds and control collision表格布局面板单元格边界和控件冲突
【发布时间】:2012-07-04 21:17:17
【问题描述】:

我刚刚完成了处理表格布局面板中的 UI 的程序的一部分。到目前为止,这已经奏效,但我注意到,在我可以在运行时围绕表单尝试我的控件(我添加的功能)之前,但现在它在单元格中,它们不能移动到其容器单元格之外。但是,这很好,正是我需要的,但我发现控件(例如按钮)将正确包含在左侧的单元格和单元格的顶部边界中,但底部和右侧边界允许控制消失。下面是一些截图来演示:

这里我们看到按钮控件不能越过单元格的顶部和左侧边界。

但是在这里它似乎能够越过单元格的底部和右侧边界。

回顾我是如何让我的控件移动的,我遇到了我设置了一些变量的部分,如下所示:

public static void MouseMove(object sender, MouseEventArgs e)
         {
             Control control = sender as Control;
             Control container = sender as Control;
             if (control != null)
             {
                 if (Dragging)
                 {
                     if (direction != Direction.Vertical)
                     {
                         container.Left = Math.Max(0, e.X + container.Left - DragStart.X);
                     }
                     if (direction != Direction.Horizontal)
                     {
                         container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y);
                     }
                 }
             }
         }

我想在这里我没有设置底部和右侧容器边界,这是有道理的,但是在探索智能感知时,我似乎无法获得 container.right 和 container.bottom,因为它们带有以下工具提示:

"gets the distance, in pixels, between the right edge of the control, and the left edge of it's container's client area"

和底部也是一样的,只是针对控件的底部和容器区域的顶部。

这附近有吗?也许某个地方的选项将控件的底部连接到单元格的底部边界,右侧也是如此?

编辑 1:或者,也许我需要更改我的 mousemove 事件以更好地处理碰撞,所以如果有人对此也有任何想法,那就太好了,我之前并没有真正看过很多碰撞检测,尤其是在winform。

【问题讨论】:

    标签: c# .net winforms math collision-detection


    【解决方案1】:

    Control.right 是只读属性。尝试设置

    if (direction != Direction.Vertical)
    {
        container.Left = Math.Max(0, e.X + container.Left - DragStart.X);
        container.Left = Math.Min(container.Left, container.Parent.Width - container.Width;
    }
    if (direction != Direction.Horizontal)
    {
        container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y);
        container.Top = Math.Min(container.Top, container.Parent.Height - container.Height;
    }
    

    【讨论】:

    • 嗯,没用。我想我可能需要在这里进行碰撞检测,可能与控件及其容器的矩形/边界有关
    • 按钮是直接添加到TableLayouPanel,还是在另一个控件里面?
    • 它在一个控件中。我像这样访问它.. DeviceManager.deviceManagerInstance.Controls["tableLayoutPanel1"].Controls["panelMap"]
    • 您确定 panelMap 不大于它所在的单元格吗?尝试设置 panelMap.Dock = DockStyle.Fill
    • 是的,我已经将它设置为停靠。编辑:现在似乎很奇怪..一些奇怪的图形错误,但我确定这很酷。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多