我有一个UserControl
包含其他UserControl
。 我想含有控制能够处理这种情况发生在包含的控件的区域中的任何鼠标事件。 什么是最简单的方法是什么?
对于包含的控件更改代码是可能的,但只能作为最后的手段。 所包含的控制具有由非托管库控制的窗口。
FWIW,我已经尝试添加的处理程序包含的控件的鼠标事件,但这些处理程序从未被调用。 我怀疑包含控制消耗鼠标事件。
我已经考虑将某种对包含控件的顶部透明窗口,捕捉事件,但我仍然很新的Windows窗体,我想知道是否有更好的办法。
如果内部控制不密封,你可能要继承它,并覆盖鼠标相关的方法:
protected override void OnMouseClick(MouseEventArgs e) {
//if you still want the control to process events, uncomment this:
//base.OnMouseclick(e)
//do whatever
}
等等
嗯,这是技术上是可行的。 你必须自己重定向鼠标消息,这需要一点点的P / Invoke的。 这段代码粘贴到你内心的用户控件类:
protected override void WndProc(ref Message m) {
// Re-post mouse messages to the parent window
if (m.Msg >= 0x200 && m.Msg <= 0x209 && !this.DesignMode && this.Parent != null) {
Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
// Fix mouse position to be relative from parent's client rectangle
pos = this.PointToScreen(pos);
pos = this.Parent.PointToClient(pos);
IntPtr lp = (IntPtr)(pos.X + pos.Y << 16);
PostMessage(this.Parent.Handle, m.Msg, m.WParam, lp);
return;
}
base.WndProc(ref m);
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr PostMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
这是最好的BTW避免。 家长控制应可能只是订阅内部控制的鼠标事件。
这是我做的:
首先,我定义了一个TransparentControl
类,它仅仅是一个透明的,不会绘制任何控制。 (此代码是由于http://www.bobpowell.net/transcontrols.htm 。)
public class TransparentControl : Control
{
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
return cp;
}
}
protected override void OnPaint(PaintEventArgs pe)
{
// Do nothing
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
// Do nothing
}
}
然后,我把一个TransparentControl
在所包含的用户控件的顶部我的用户控制,并增加了处理程序的鼠标事件。