簡體   English   中英

控制C#Windows程序中窗體的隱藏事件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM