我想实现在一个窗体上无论单击哪里都执行个事件执行下面的语句,把一个菜单隐藏了this.panel5.Visible = false;
因为我这个窗体上的控件太多了,我不可能在每个控件的单击事件里全写这个,第一,我写不起,还怕漏了,第二,太不灵活了,一修改,全的重新写。有没有什么方法?只要他单击这个窗口里的任意控件,无论什么都执行这个方法?能冒泡到窗口的单击事件里吗?或者有什么好方法吗?

解决方案 »

  1.   

    没明白你为何这么做
    如此极端的做法,为什么不直接在初始化的时候把这个控件给Visible = false???
      

  2.   

    拦截windows单击消息,判断鼠标位置,如果在窗体范围内,则触发你需要的事件~
      

  3.   

                foreach (Control c in Panel1.Controls)
                {            }
      

  4.   

    看看这个C#拦截系统消息的方法Application.AddMessageFilter
      

  5.   


    先定个全局变量:
    //标识鼠标与Panel位置的关系
    bool isPanelRange;
    先给你的panel5加上:
    1.  p.MouseHover事件:事件方法里写:isPanelRange=true;
    2.  p.MouseLeave事件:事件方法里写:isPanelRange=false;        const int WM_MOUSECLICK=0x????;//这里我忘记了。
            protected override void WndProc(ref Message m)
            {
                if(m.Msg==WM_MOUSECLICK)//如果是鼠标单击了
                      if(!isPanelRange)
                        this.panel5.Visable=false;
                base.WndProc(ref m);
            }
      

  6.   

    菜单项用panel代替
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;namespace WindowsFormsApplication24
    {
        public partial class Form1 : Form
        {
            Panel P = new Panel();        public Form1()
            {
                InitializeComponent();            P.BackColor = Color.Red;
                P.Parent = this;
            }        protected override void WndProc(ref Message m)
            {
                int WM_LBUTTONDOWN = 0x201;            if (m.Msg == WM_LBUTTONDOWN)
                    if (this.GetChildAtPoint(this.PointToClient(Control.MousePosition)) != P)
                        MessageBox.Show("Panel之外");            base.WndProc(ref m);
            }
        }
    }
      

  7.   

    改了一下。一.先定个全局变量: //标识鼠标与Panel位置的关系 
    private bool isPanelRange; 二.先给你的panel5加上: 1.  panel5.MouseHover事件:事件方法里写:isPanelRange=true; 
    2.  panel5.MouseLeave事件:事件方法里写:isPanelRange=false; 三.重盖基类WndPro方法:
            const int WM_MOUSELEFTBUTTONCLICK=515;
            const int WM_MOUSERIGHTBUTTONCLICK=516;
             protected override void WndProc(ref Message m)
            {
                //如果是鼠标单击了
                if(m.Msg==WM_MOUSELEFTBUTTONCLICK||m.Msg==WM_MOUSERIGHTBUTTONCLICK)
                    //如果鼠标在panel5里单击鼠标
                      if(!isPanelRange)
                        //执行你想要的代码部份
                        this.panel5.Visable=false;
                //继续Windows 的该消息其它响应
                base.WndProc(ref m);
            }