检测单击其他重叠的子控件隐藏的子控件

时间:2013-12-23 04:38:45

标签: winforms

我需要一个聪明的算法来检测点击的边缘,而不是查看图中的每个边缘。

enter image description here

正如您在上图所示,标有点的区域显示点击边缘不正确,因为它们与边缘重叠[2-> 3]

我尝试过GetChildAtPoint,但它只返回最顶层的孩子。

    class Edge : Control {
       public Movable From {get;set;}
       public Movable To {get;set;}
    ...}

    void Edge_Click(object sender, EventArgs e)
    {
        var clicked = (Edge)sender;
        var mpc = this.PointToClient(MousePosition);
        var clk0 = this.GetChildAtPoint(mpc) as Edge;
        Edge clk = null;
        if (clk0 != null) {
            if (clk0.GetType() == typeof(Edge))
                clk = clk0 as Edge;                 
        }
        MessageBox.Show(string.Format("({0}, {1}): {2} - {3}=>{4} - {5}: {6}",
            mpc.X, mpc.Y, clicked.Parent.GetType().ToString(),
            clicked.From.Text, clicked.To.Text,
            (clicked == clk).ToString(),
            clk == null ? "null" : clk.From.Text + "=>" + clk.To.Text));
    }

如何在某些点上迭代所有子窗口/控件?

1 个答案:

答案 0 :(得分:0)

我唯一能想到的就是遍历你的Form的Control Collection并检查每个控件的Bounds是否包含你的观点。

根据您拥有的控件数量,这可能适用于您,也可能不适用。

foreach (Control c in this.Controls )
{
    if (c.Bounds.Contains(mpc))
    {
        //process the match here
    }
}