我的用户控件有25个面板和一个将所有元素连接到同一个点击的功能。
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;
然后所有点击都停止工作。
答案 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);
}
}
*还有其他方法可以捕获消息,但我认为这将是最简单的。