在用VB.net对机房收费系统进行重构时遇到了些小问题,下面对一些问题进行总结。
一、MDI子窗体显示到Panel、PictureBox等控件前
正常情况下Mdi子窗体只能显示到父窗体的容器中,但是在设计时父窗体往往不能加入基本的交互控件,为了能够加入按钮、文本框等的基本控件我们常常在父窗体的容器内加入能作为容器的控件如Panel、PictureBox等的容器控件,于是在父窗体内方基本控件的难题解决了。
摆放控件的问题解决了但是又出现了新问题,父窗体中的控件和窗体的显示顺序颠倒了,显示的子窗体被Panel等的容器控件挡住了,导致子窗体不能显示问题。经过跋山涉水,终于找到了几个解决办法。
1、使用Controls属性将子窗体作为控件子集合显示到Panel等前
有些控件可以作为容器使用如类似Panel、PictureBox等的控件,在向容器控件中加入其它控件时,这些子控件组合到一起成为一个控件集合,在这个控件集合中每个控件都有各自显示的顺序。下面我们那Panel来举例(其它容器控件的方法相同)。
为了显示到Panel前我们可以使用Controls属性,将子窗体作为Panel的子控件显示。具体实现代码如下:
'我们在frmQryBalance显示事件中添加该属性。 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 顺序的前面。 如果控件是另一个控件的子级,那么将子控件移到 Z 顺序的前面。 BringToFront 不会使一个控件成为顶级控件。
BringToFront方法相反的一个方法名为SendToBack方法。将控件移到 Z 顺序的后面。 如果控件是另一个控件子级,那么将子控件移到 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
实现方法还有很多,这儿就总结了三种,这三种其实都是有相似之处,都是把窗体作为子项目显示到Panel控件中,但对于在Panel中的排列顺序还需要我们进一步进行探究。
原文链接:https://www.f2er.com/vb/258946.html