[英]Controls hide event's of form in C# Windows program
我已經為窗體編寫了MouseMove的事件處理程序,但是當我向窗體添加面板時,當鼠標在面板上移動時,該處理程序不會運行。 我將事件處理程序添加到面板中,並且可以正常工作,但是表單上有多個面板,是否有更簡單的解決方案?
不幸的是,WinForms不支持事件冒泡。 但是您可以編寫一些代碼來簡化連接事件的任務。
public void AssignMouseMoveEvent(Form form)
{
foreach(Control control in form.Controls)
{
if(! (control is Panel))
continue;
control.MouseMove += PanelMouseMove;
}
}
您應該調用上面的代碼將其傳遞給您當前的表單,它將為所有面板的MouseMove事件將PanelMouseMove分配為事件處理程序。
我認為您應該能夠“傳播”處理程序,因此您不必重新編寫每個處理程序中的代碼。 請記住,MouseMove事件具有相對控件的坐標 ,因此,如果將事件從面板傳遞到表單,則必須將事件中的X和Y值轉換為表單坐標(類似於減去panel.location .X(來自event.X等)。
這段代碼對我有用(假設您有一個帶有面板和標簽的表單。標簽名為“ MouseCoords”
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void ShowCoords(int x, int y)
{
this.MouseCoords.Text = string.Format("({0}, {1})", x, y);
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
this.ShowCoords(e.X, e.Y);
}
protected override void OnControlAdded(ControlEventArgs e)
{
// hook the mouse move of any control that is added to the form
base.OnControlAdded(e);
e.Control.MouseMove += new MouseEventHandler(Control_MouseMove);
}
private void Control_MouseMove(object sender, MouseEventArgs e)
{
// convert the mouse coords from control codes to screen coords
// and then to form coords
System.Windows.Forms.Control ctrl = (System.Windows.Forms.Control)sender;
Point pt = this.PointToClient(ctrl.PointToScreen(e.Location));
this.ShowCoords(pt.X, pt.Y);
}
private void Form1_Load(object sender, EventArgs e)
{
this.MouseMove += this.Form1_MouseMove;
}
}
}
沒有,沒有比這更簡單的方法了,您應該為每個需要接收MouseMove事件的控件分配事件處理程序。
如果將窗體的Capture
屬性設置為true,則它將接收所有鼠標輸入,無論鼠標處於哪個控件下。 在某些操作下,它將丟失鼠標捕獲(不過,我不確定確切的時間)。 另外,根據該屬性的文檔,捕獲鼠標時,快捷鍵不起作用。 因此,根據您要實現的目標,這可能不是首選的方法。
假設鼠標開始在窗體上而不是在面板上移動-這是一個很大的假設-當鼠標進入子控件時,您將獲得MouseLeave事件。 您可以檢查光標的位置並調用鼠標移動代碼(如果它仍在表單范圍內)。
如果鼠標移動事件在控件上開始,則此方法不起作用。
您可以實現IMessageFilter來預處理要發送到控件的消息。
http://blogs.msdn.com/csharpfaq/archive/2004/10/20/245412.aspx
但是,從設計的角度來看,我認為這不是一種非常干凈的方法。
我找到了另一個解決方案:)“在控件中引發事件以隱藏事件”我在面板中捕獲該事件,並通過調用onMouseMove來引發該窗體的Mouse move事件
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.