【问题标题】:VB.NET: How can you activate the childform when only the control inside is clicked?VB.NET:当只点击里面的控件时,如何激活子窗体?
【发布时间】:2013-01-04 08:13:12
【问题描述】:

*edit:好的,所以这是我真正的问题,只有当表单是 MDIChild 时才会发生以下情况。感谢任何可以为我提供代码的人

我有一个带有标签、面板、按钮等的表单。我遇到的问题是,form2 是我的活动窗口/表单,我单击了 form1 内的控件,但 form1 不会自行激活。我希望 form1 激活,即使它不是我点击的表单,也只有它里面的控件(任何控件)..

我在想,如果我单击表单上的控件,就会在表单上触发一个事件。如果我只能知道某个事件,那会有所帮助 - 也许(因为如果它存在,我可以在该事件上添加 Me.activate)。当单击控件(例如标签)时,我尝试搜索一系列事件,但无济于事。我希望有人可以帮助我解决这个问题。

提前致谢。

*编辑

我会尽量让我的问题更容易理解..

如何在仅单击控件(例如标签或文本框)时激活表单?当我在其中单击时,除了表单本身之外,我的表单没有激活或聚焦..

我可以在一个控件上执行此操作..

Private Sub Label1_Click - Handles Label1.Click
   Me.Activate()
End Sub

但是如果我有 20 个控件(标签、按钮、文本框、组合框等)怎么办?看? =)

【问题讨论】:

  • 你能上传截图让我们看看你的意思吗?
  • @Chris,抱歉,我认为上传这张截图需要时间。我仍然希望你能明白我上面所说的。仅单击控件(例如,标签或文本框)时,如何激活表单?当我在其中单击时,除了表单本身之外,我的表单没有激活或聚焦..
  • 啊。我懂了。您需要某种通用的点击处理程序。也许是这样的:universalthread.com/ViewPageArticle.aspx?ID=73
  • 我去看看,然后再回复你,谢谢,克里斯
  • 我的 GUESS 是您以模态方式显示焦点表单,否则,您单击的任何表单都应在单击时获得焦点...查看@之间的区别987654323@ 和 Form.ShowDialog... 再次,只是猜测...

标签: vb.net visual-studio-2010 .net-4.0


【解决方案1】:

编辑:此答案不适用于 MDI 应用程序。

我认为您真正想知道的是您的哪个表单当前是前景窗口(如果有)。您需要了解的第一件事是表单实例存在于窗口内,但窗口的行为是在更高的地方控制的。类似于通过指向实例的变量来识别表单实例,可以通过所谓的窗口句柄来识别窗口。

知道了这一点,找出表单是否是“活动”表单的正确方法是:

  1. 找出包含Form1Form2 实例的窗口的窗口句柄
  2. 找出前景窗口(可以是任何窗口)的窗口句柄
  3. 将第 2 步中找到的值与第 1 步中找到的所有值进行比较

也许您希望在前台窗口发生变化时触发一个事件,但我会将实际实现留给您。可能有几种方法可以执行第 1 步和第 2 步,但我想不出任何解决方案。希望我能让你回到正确的轨道上。

编辑

或者,您可以使用表单的Containsfocus 属性。如果它的值为 True,您可以放心地假定您的窗体是前景窗口。直到我编写了自己的实现之后才发现这个属性,无论如何我都会向你展示:

一个仅包含 Windows API 调用的模块

Friend Module NativeMethods

    Friend Declare Function GetForegroundWindow Lib "user32.dll" () As IntPtr

End Module

调用此方法将返回前台窗口的窗口句柄(如果有)。

一个包含Form 类的扩展方法的模块

Imports System.Runtime.CompilerServices

Public Module FormExtensions

    <Extension>
    Public Function IsForeground(f As Form) As Boolean
        Return (f.Handle = NativeMethods.GetForegroundWindow)
    End Function

End Module

调用该方法返回指定窗体f是否与前台窗口具有相同的窗口句柄。

使用示例

您可以使用Timer 定期检查表单是否为前台窗口。

Public Class Form1

    Private WithEvents timer As New Timer With {.Enabled = True}

    Private Sub timer_Tick(sender As Object, e As EventArgs) Handles timer.Tick
        If Me.IsForeground() Then
            Console.WriteLine("this instance of Form1 is the foreground window")
        End If
    End Sub

End Class

就像我之前说的,你可以使用Me.ContainsFocus 代替我的扩展方法,它会正常工作的。

【讨论】:

    【解决方案2】:

    非 MDI 表单中,当您单击其中的任何控件时,表单会自动激活

    【讨论】:

      猜你喜欢
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多