none
C# winform 窗体 如何准确判断失去焦点 RRS feed

  • 问题

  • 现在如下情况,比如有两个窗体,分别为A和B。程序起动时A显示出来,比如单击A的datagridview时B悬浮在表格上面并呈现透明的形式显示出来。现在的问题是比如我win微标键+D显示桌面,A是看不见了,但B却能见。a窗体上面没有任何最大化最小化,关闭按钮。并且B窗体的topmost是true的。当然我在A窗体事件Deactivate里面做了一些事件,目的就是为了让B隐藏掉。b.hide().
    但看来不行,所以也不知道应该怎么办了。请帮帮我。
    2010年1月22日 2:57

答案

  • WinKey + D 显示桌面,它不会引发 Form.Deactivate 事件。

    您限额需求实际上就是希望显示一些像 Tooltip 的 Popup Window,根 Menu 类似,但这个 Popup Window 能自定义显示的内容。

    一种简单的方法就是把 Form B 加到 Form A 中,但需要设置一些 Native 的 Style,比如 WS_CHILD | WS_VISIBLE 等,有一点麻烦,但因为它隶属于 Form A,所以当 Form A Deactivate 时,它也会 Deactivate。

    另一种办法就是使用 UserControl,跟 Form 是基本上一样的,不同的是 UserControl 可以添加到 Form A 上,然后由您控制如何显示/隐藏它。其实 UserControl 就是 Form (在 Win32 中都是 HWND)。
    Mark Zhou
    • 已标记为答案 YiChun Chen 2010年1月25日 10:55
    2010年1月22日 10:42

全部回复

  • 你在B窗体的Form_Deactivate事件中TopMost 设为false
       private void Form_Deactivate(object sender, EventArgs e)
            {
                TopMost = false;
            }

    努力+方法=成功
    2010年1月22日 3:01
  • 我的是A失去焦点的时候把B窗体隐藏掉,我先测试一下。谢谢你
    2010年1月22日 3:11
  • 或者你可以这样设置A窗体

    //当A窗体获得焦点时
       private void FormA_Activated(object sender, EventArgs e)
            {
                if (fllB!=null)
                {
                     fllB.Visible = true;
                }
               
            }
    
       //当A窗体失去焦点时
        private void FormA_Deactivate(object sender, EventArgs e)
            {
                fllB.Visible = false;
            }
    
    
        Form_Fill  fllB;
       private void button3_Click(object sender, EventArgs e)
            {
    
                 fllB= new Form_Fill();
                fllB.Show();
        }
    

    努力+方法=成功
    2010年1月22日 3:25
  • 这样不行,我详细说一下我的需求,A窗体有两个表格控件,B窗体的作用就是在点击A窗体的任意一个表格时,悬浮在表格里面,并呈现透明的效果,其目的是控制表格的上下左右滚动条。我刚才你说的topmot设置为false的时候可以,但唯一的问题就是比如我只点了A窗体的X表格,然后让A窗体失去焦点了,然后又让它恢复。B窗体现在是不可见的,但我如果再点击A窗体的X表格时候,B窗体也没有出现,必须要点击A窗体的Y表格才会出现。同理,如果我只点了Y表格,就失去点焦点,再恢复,点击Y表格,B窗体不会出现。必须点了X表格才会出现。
    具体代码如下:
    A窗体的Deactivate事件主要让B窗体隐藏
      B.Hide()
    B窗体的Deactivate事件就是你说的
    B.TopMost = false

    然后就是表格的Enter事件,为B窗体的显示并且如何浮动作处理的。

    我不知道这是什么原因
    2010年1月22日 3:43
  • WinKey + D 显示桌面,它不会引发 Form.Deactivate 事件。

    您限额需求实际上就是希望显示一些像 Tooltip 的 Popup Window,根 Menu 类似,但这个 Popup Window 能自定义显示的内容。

    一种简单的方法就是把 Form B 加到 Form A 中,但需要设置一些 Native 的 Style,比如 WS_CHILD | WS_VISIBLE 等,有一点麻烦,但因为它隶属于 Form A,所以当 Form A Deactivate 时,它也会 Deactivate。

    另一种办法就是使用 UserControl,跟 Form 是基本上一样的,不同的是 UserControl 可以添加到 Form A 上,然后由您控制如何显示/隐藏它。其实 UserControl 就是 Form (在 Win32 中都是 HWND)。
    Mark Zhou
    • 已标记为答案 YiChun Chen 2010年1月25日 10:55
    2010年1月22日 10:42
  • 你想实现什么功能?如果只是提示功能,那何不使用datagridview自带的tooltip功能呢?

    2010年1月23日 6:34