VB.NET设置控件和窗体的显示级别

前言:在用VB.NET开发射频检测系统ADS时,当激活已存在的目标MDI子窗体时,被其他子窗体遮住了,导致目标MDI子窗体不能显示。

这个问题怎么解决呢?网上看到一篇帖子VB.NET设置控件和窗体的显示级别,总结得挺不错的。现转载过来,以备后用。

解决方案

1)使用Controls属性将子窗体作为子控件显示到Panel等的所有子控件最前方

有些控件可以作为容器使用如类似Panel、PictureBox等的控件,在向容器控件中加入其它控件时,这些子控件组合到一起成为一个控件集合,在这个控件集合中每个控件都有各自显示的顺序。下面我们拿Panel来举例(其它容器控件的方法相同)。

为了显示到Panel前我们可以使用Controls属性,将子窗体作为Panel的子控件显示。具体实现代码如下:

Private Sub frmQryBalance_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.TopLevel = False
        frmMain.Panel1.Controls.Add(Me)
        frmMain.Panel1.Controls.SetChildIndex(Me, 0)
        frmMain.Show()
End Sub

上面的Add方法将frmQryBalance窗体作为子控件显示到了Panel中,SetChildIndex方法是设置子窗体的显示顺序,0是将该窗体显示到所有子控件最前方。

2)使用Parent属性将子窗体作为子控件显示到Panel等的所有子控件最前方

代码如下:

Private Sub frmQryBalance_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     Me.MdiParent = frmMain
     Me.Parent = frmMain.Panel1
     Me.BringToFront()
     Me.Show()
End Sub

BringToFront是将控件移到 Z 顺序的前面。BringToFront 不会使一个控件成为顶级控件。

与BringToFront方法相反的一个方法名为SendToBack方法。将控件移到 Z 顺序的后面。如果控件为顶级控件,除非该控件为活动状态,否则此方法将无法正确运行。 顶级控件是类似 Form 的控件,它不是另一个控件的子控件。 活动控件是具有输入焦点的可见控件。 若要对非活动的顶级控件使用 SendToBack 方法,首先要对该控件调用 BringToFront 方法。

3)调用API方法SetParent

在Visual Basic .Net中使用“平台调用”服务,申明Windows API函数主要有二种具体的实现方法:①使用DllImport特征类来申明Windows API函数。②使用“Declare”语句来申明Windows API函数。这两种方法虽有异曲同工之效,但在繁简上却有很大差异,第一种方法申明过程比较复杂,很容易在申明Windows API函数时出错,所以并不提倡。而第二种方法相对简单,并且又保留了以前Visual Basic中的很多语法,所以大都使用这种方法来申明Windows API函数。

具体实现方法如下:

Declare Function SetParent Lib "user32" Alias "SetParent" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Sub frmQryBalance_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    setparent  me frmMain.Panel1
End Sub

参考链接:http://blog.csdn.net/zhang_xinxiu/article/details/8888510