private bool RaiseCommonEvent(ref Message m, Control c) { FormEx form = c as FormEx; ControlEx ctrl = c as ControlEx; if (form == null && ctrl == null) { return(false); } EventArgs e; bool r = false; switch (m.Msg) { case Win32.WM_MOUSEHOVER: { e = new EventArgs(); if (form != null) { r = form.OnMouseHoverEx(e); } else if (ctrl != null) { r = ctrl.OnMouseHoverEx(e); } // 如果 r == true , 则返回 true 终止事件冒泡 if (r) { return(true); } break; } case Win32.WM_MOUSELEAVE: { // 用于实现 MouseEnter 事件, 参考 MouseMove 消息处理中使用 MouseEventUtil.SetEnter(c) 的部分 MouseEventUtil.SetLeave(c); e = new EventArgs(); if (form != null) { r = form.OnMouseLeaveEx(e); } else if (ctrl != null) { r = ctrl.OnMouseLeaveEx(e); } // 如果 r == true , 则返回 true 终止事件冒泡 if (r) { return(true); } break; } } return(false); }
private bool RaiseMouseEvent(ref Message m, int x, int y, Control c) { FormEx form = c as FormEx; ControlEx ctrl = c as ControlEx; if (form == null && ctrl == null) { return(false); } MouseEventArgsEx e; bool r = false; switch (m.Msg) { case Win32.WM_MOUSEMOVE: { e = new MouseEventArgsEx(MouseButtons.None, x, y); // 这里是 实现 MouseEnter 事件 。 Windows 消息 中没有 MouseEnter 消息, 所以需要自己实现 // .Net WinForm 也是自己实现的, 不过 .Net WinForm 实现的方式是调用一些 Native 方法 // 比如 RegisterWindowMessage() TrackMouseEvent() // 这对于我们太复杂,我们只需要用 MouseMove 消息 和 MouseEventUtil 配合 就可以实现 Enter 事件 if (MouseEventUtil.SetEnter(c)) { if (form != null) { r = form.OnMouseEnterEx(new EventArgs()); } else if (ctrl != null) { r = ctrl.OnMouseEnterEx(new EventArgs()); } } // 如果 r == true , 则返回 true 终止事件冒泡 if (r) { return(true); } if (form != null) { r = form.OnMouseMoveEx(e); } else if (ctrl != null) { r = ctrl.OnMouseMoveEx(e); } // 如果 r == true , 则返回 true 终止事件冒泡 if (r) { return(true); } break; } case Win32.WM_LBUTTONDOWN: { // 实现 Click 事件,参考 MouseUp 消息处理部分 MouseEventUtil.SetClickDown(c); e = new MouseEventArgsEx(MouseButtons.Left, x, y); if (form != null) { r = form.OnMouseDownEx(e); } else if (ctrl != null) { r = ctrl.OnMouseDownEx(e); } // 如果 r == true , 则返回 true 终止事件冒泡 if (r) { return(true); } break; } case Win32.WM_LBUTTONUP: { e = new MouseEventArgsEx(MouseButtons.Left, x, y); // 这里是 实现 Click 事件 。 Windows 消息 中没有 MouseClick 消息 , 所以需要自己实现 // .Net WinForm 也是自己实现的。 if (MouseEventUtil.CheckClick(c, x, y)) { MouseEventUtil.SetClickUp(c); if (form != null) { r = form.OnMouseClickEx(e); } else if (ctrl != null) { r = ctrl.OnMouseClickEx(e); } } // 如果 r == true , 则返回 true 终止事件冒泡 if (r) { return(true); } if (form != null) { r = form.OnMouseUpEx(e); } else if (ctrl != null) { r = ctrl.OnMouseUpEx(e); } // 如果 r == true , 则返回 true 终止事件冒泡 if (r) { return(true); } break; } } return(false); }