none
winfrom 鼠标悬停一个图片空间 打开一个B窗体 事件求助 RRS feed

  • 问题

  • 鼠标悬停在 A 窗体的 图片控件上 B 窗体显示并打开    

    鼠标离开A窗体图片控件  B窗体关闭

    如果在鼠标悬停在 A 窗体的 图片控件上 B 窗体显示并打开    的同时  鼠标移动到B窗体上 B窗体不会因为A窗体控件的鼠标离开事件 而关闭B窗体

    因此 设置一个 表控件 计时事件  三秒后判断 一个 B窗体的 kg 是否为ture;

    可是试了很多方法  关闭后就无法再次打开

    a窗体代码:

    public static bool kg=false;

    FormB  b=new FormB;

    private void pictureBox1_MouseHover(object sender, EventArgs e)
            {
                b.Show();
            }


    private void pictureBox1_MouseLeave(object sender, EventArgs e)
            {
                 timer1.Start();
            }

    int n=0;

    private void timer1_Tick(object sender, EventArgs e)
            {

    if(n<3){

    if(kg==true){n=0; timer1.Stop();}

    else{n=n+1;}

    }

    else{

    b.Hide(); 

    }

    }

    b:窗体代码

    private void BusinessCard_MouseHover(object sender, EventArgs e)
            {
                forma.kg=true;
            }

            private void BusinessCard_MouseLeave(object sender, EventArgs e)
            {
                this.Hide();
            }

    因为项目里写的控件窗体名 比较复杂 所以临时谢了这样一个DEMO的小样 但是这样没办法反复开关 这个B窗体  求助 有什么更好的例子方法


    • 已编辑 ylzl 2017年11月13日 6:55
    2017年11月13日 5:51

答案

  • Hi,

    首先关于你这个问题的一点,鼠标离开A窗体的图片,然后进入B窗体,这个时候如果想要B窗体仍然显示,那么你的B窗体与A窗体的图片之间是不能有距离的,因为如果有距离,那么在鼠标离开A窗体的图片的时候,B窗体已经消失了,所以请明确这一点。

    如果上述要求合理,那么请参考以下解决方案:

    在Program类里面定义一个全局变量:

        static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
            public static bool mouse1 = false;
        }

    然后在A窗体:

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            Form2 f2 = new Form2();
    
            private void pictureBox1_MouseHover(object sender, EventArgs e)
            {
                f2.Show();
                Program.mouse1 = true;
            }
    
            private void pictureBox1_MouseLeave(object sender, EventArgs e)
            {
                Program.mouse1 = false;
                if (!f2.mouse)
                    f2.Hide();
            }
    
            private void pictureBox2_MouseHover(object sender, EventArgs e)
            {
                f2.Show();
                Program.mouse1 = true;
            }
    
            private void pictureBox2_MouseLeave(object sender, EventArgs e)
            {
                Program.mouse1 = false;
                if (!f2.mouse)
                    f2.Hide();
            }
        }

    在B窗体:

        public partial class Form2 : Form
        {
            Timer timer = new Timer();
            public bool mouse = false;
    
            public Form2()
            {
                InitializeComponent();
                timer.Tick += timer_Tick;
                timer.Enabled = true;
            }              
    
            void timer_Tick(object sender, EventArgs e)
            {
                if (this.Bounds.Contains(MousePosition))
                {
                    this.Text = "Inside";
                    mouse = true;
                }
                else
                {
                    this.Text = "Outside";
                    mouse = false;
                    if (!Program.mouse1)
                        this.Hide();
    
                }
            }
        }

    希望对你有帮助。

    Regards,

    Stanly


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 ylzl 2017年11月16日 0:21
    2017年11月15日 7:49

全部回复

  • 你这个设定有冲突。

    “鼠标离开A窗体图片控件  B窗体关闭”

    “B窗体不会因为A窗体控件的鼠标离开事件 而关闭B窗体”


    family as water

    2017年11月14日 0:44
  • 隐藏也可以啊!~

    以前这里有很多前辈指点迷经的,现在人好少啊!~ 就向上图 鼠标放在picbox1 上 B窗体显示 离开B 消失  放在picbox2上B窗体显示 鼠标移开 B隐藏  但是鼠标在移开后 如果滑到B 上面停留  B 继续显示  移开B窗体上或离开B窗体可见范围后 B窗体隐藏

    求高手指点一下

    2017年11月14日 11:44
  • Hi,

    首先关于你这个问题的一点,鼠标离开A窗体的图片,然后进入B窗体,这个时候如果想要B窗体仍然显示,那么你的B窗体与A窗体的图片之间是不能有距离的,因为如果有距离,那么在鼠标离开A窗体的图片的时候,B窗体已经消失了,所以请明确这一点。

    如果上述要求合理,那么请参考以下解决方案:

    在Program类里面定义一个全局变量:

        static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
            public static bool mouse1 = false;
        }

    然后在A窗体:

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            Form2 f2 = new Form2();
    
            private void pictureBox1_MouseHover(object sender, EventArgs e)
            {
                f2.Show();
                Program.mouse1 = true;
            }
    
            private void pictureBox1_MouseLeave(object sender, EventArgs e)
            {
                Program.mouse1 = false;
                if (!f2.mouse)
                    f2.Hide();
            }
    
            private void pictureBox2_MouseHover(object sender, EventArgs e)
            {
                f2.Show();
                Program.mouse1 = true;
            }
    
            private void pictureBox2_MouseLeave(object sender, EventArgs e)
            {
                Program.mouse1 = false;
                if (!f2.mouse)
                    f2.Hide();
            }
        }

    在B窗体:

        public partial class Form2 : Form
        {
            Timer timer = new Timer();
            public bool mouse = false;
    
            public Form2()
            {
                InitializeComponent();
                timer.Tick += timer_Tick;
                timer.Enabled = true;
            }              
    
            void timer_Tick(object sender, EventArgs e)
            {
                if (this.Bounds.Contains(MousePosition))
                {
                    this.Text = "Inside";
                    mouse = true;
                }
                else
                {
                    this.Text = "Outside";
                    mouse = false;
                    if (!Program.mouse1)
                        this.Hide();
    
                }
            }
        }

    希望对你有帮助。

    Regards,

    Stanly


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 ylzl 2017年11月16日 0:21
    2017年11月15日 7:49