前言:在用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