响应用户控制点击

时间:2015-06-23 21:04:03

标签: c# winforms events

我的用户控件有25个面板和一个将所有元​​素连接到同一个点击的功能。

enter image description here

    public shapeDisplay()
    {
        InitializeComponent();
        WireAllControls(this);
    }
    private void WireAllControls(Control cont)
    {            
        foreach (Control ctl in cont.Controls)
        {
            ctl.Click += ctl_Click;
            if (ctl.HasChildren)
            {
                WireAllControls(ctl);
            }
        }
    }
    private void ctl_Click(object sender, EventArgs e)
    {
        this.InvokeOnClick(this, EventArgs.Empty);
    }
  

即使我使用递归函数连接控件,控件上也没有其他容器,只有基本控件。

选择控制后,我更改BackColor

this.backColor = Color.Black

单击其中一个面板白色区域时,单击工作正常,但单击控制区域(黑色线条)时单击不会触发。

此外,您可以看到光标在面板上方时是一只手,但在一条线上时它是一个箭头。

我尝试添加

this.Click += ctl_Click;
cont.Click += ctl_Click;

然后所有点击都停止工作。

1 个答案:

答案 0 :(得分:0)

单击Panel本身的边框被视为“非客户”区域的一部分,该区域触发WM_NCLBUTTONDOWN消息。您必须从Panel继承以捕获该消息(然后将新控件放入UserControl而不是库存面板(重新编译后它将显示在工具箱的顶部)。

这是一个简单的例子:

public class myPanel : Panel
{

    private const int WM_NCLBUTTONDOWN = 0xA1;

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_NCLBUTTONDOWN:
                this.InvokeOnClick(this, EventArgs.Empty);
                break;
        }
        base.WndProc(ref m);
    }

}

*还有其他方法可以捕获消息,但我认为这将是最简单的。