问题引入:
机房收费系统中在主窗体添加picture可以比较方便的将我们需要的控件添加到窗体上,但是这也导致了一下问题,因为是”相同的一个级别“,所以耍大牌的picture将其他的子窗体完完全全的挡在了后面
遇到问题、解决问题
一、比较受欢迎的方法是
1、引用API函数
Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long2、在要打开窗体的代码处添加
比如要打开frmabout
<span style="font-size:18px;">frmabout.Show SetParent frmabout.hWnd, frmmain.Picture1.hWnd</span>
3、在打开窗体的activate中
Dim a As Form For Each a In Forms If a.Name <> MDIForm1.Name And a.Name <> Me.Name Then a.WindowState = 1 End If Next
或者在deactivate中
If Me.WindowState <> 1 Then Me.WindowState = 1 End If
vbNormal 0正常 VbMinimized 1 最小化VbMaximized 2 最大化
另一种:窗体自动最小化
Private Declare Function GetForegroundWindow Lib "User32" () As Long Private Sub Form1_Load() Timer1.Interval = 100 End Sub Private Sub Timer1_Timer() Dim frmCurr As Form If GetForegroundWindow <> Me.hWnd Then '判断获取的句柄与本窗体的句柄是否一致 frmCurr.WindowState = 1 '如果不一致就最小化 End If End Sub
二、
1、 加载一个主窗体MDIfrom,但是只要它的外壳,另外建一个普通窗体如from1,将该窗体‘内嵌’主窗体中
2、主窗体show的时候该from1跟着show
3、其大小跟父窗体的大小相同
4、from1窗体的boderstyle属性设置为 0-None
5、利用父窗体的Resize事件(简单举例) :当一个对象第一次显示或当一个对象的窗口状态改变时该事件发生
代码:
Private SubForm_Load() Text1.Text ="" End Sub
<span style="font-size:18px;">Private SubForm_resize() Text1.Move 0, 0, ScaleWidth, ScaleHeight End Sub</span>
本来面目:
效果:
以上可以实现这两个窗体完美结合了,这带来好处也有坏处,如果一不小心点到from1,那么其他正在用的窗体就会被隐藏在from1后,而from1是铺满整个父窗体的,也就是说被隐藏的窗体是不太可能被找到的,因此我们引进了zorder方法 (另一个)
Form1.ZOrder 1
呵呵呵呵呵呵呵
收费中为了让from1位于最底层,需要在每一个可能成为活动窗体的activate事件中添加
form1.zorder 1
如果有错误,欢迎交流