前言:
之前对MDI窗体的认识不够深刻,所以建窗体的时候就决定试试:没有把主窗体建成MDI窗体,使用的是普通窗体,于是乎,昨天开师徒会的时候就和师傅谈论了这个问题,师傅提出了一点我之前没有注意到的问题:如果不是MDI窗体的话,打开主窗体和子窗体,然后关闭主窗体,会发现子窗体并没有关闭。这就相当于我们用一个程序时,程序已经关闭了,但是发现有一个小的功能还处于开着的状态,瞬间觉得很滑稽!不过我也算是不到南墙心不死了,只有真正地试过了才知道哪个是正确的,正确的理由是什么,才能从心里真正地接受它!
下面就是在改正的过程中遇到的一系列的问题,列举出来和大家共同进步!
MDI窗体
MDI就象一个主界面,它一般带有菜单。里面又可以建立多个子窗口,就象WORD里面打开很多个文档,这些文档可以进行层叠、平铺等各种操作;子窗口可以在MDI主窗口区域内定位、改变大小、最大化和最小化,当最大化子窗口时,它将占满MDI 主窗口的全部客户区。当MDI窗口最小化的时候所有子窗口随之最小化。
一个程序的主界面一般都是MDI窗口。效果如图:
添加picture
新建一个MDI窗体,准备把原来主窗体的东西直接复制到MDI窗体内,但是出现了如下一系列的问题:
经上网查证后发现原来MDI窗体是不可以这样插入控件的,必须把控件插入到picture控件之上,然后这个问题就解决了!
子窗体不见了
但是运行之后发现,子窗体不见了,它去哪了呢,明明是运行状态的!后来发现,原来,它躲在了主窗体的图片后面,那么就需要把它拿出来啦!
此时就需要用到API函数了
1.选择外接程序--外接程序管理器--选中VB 6API Viewer,勾中加载行为的前两项
2.再次点击外界程序--API浏览器--选择文件--加载文本文件
3.进行如下图的操作:
设置子窗体大小
经过如上操作后发现出现了如下图的情况:
这就说明窗体大小没有设置好,在子窗体的load事件中添加如下代码:
Me.Width = 属性中的数值
Me.Height = 属性中的数值
问题就解决了!
子窗体居中显示
但是发现子窗体并没有居中显示,于是在load事件中添加如下代码
Me.Left = (frmMain.Width- Me.Width) / 2
Me.Top = (frmMain.Height- Me.Height) / 2
但是事情总是不会像想象中的那么顺利,弹出了如下框!
这个意思就是在加载的过程中MDI窗体加载之后没有删除就又加载了一遍,然而在一个工程中是不可以同时加载两个MDI窗体的!
这个问题纠结了很长一段时间,各种查资料,发现如下几个原因:
1.模块中的fMainForm.Show和登录窗体的重复,删除登录窗体的那个
2.把模块中的fMainForm.Show改成frmMain.Show
但是这些都不是我的问题所在,后来发现,原来把如下图中的那一句代码注释就OK了
Sub main()
Dim flogin As New frmLogin '定义登录窗口界面
flogin.Show vbModal '显示登陆窗体实例
'OK为fmainform类的成员,flogin.ok 的意思是:如果输入的账户密码满足数据库中的内容,则可以执行代码
If Not flogin.OK Then 'ok=true 则登录成功 ok =flase则登录失败
End
End If
Unload flogin
' Set fMainForm = New frmMain '显示主窗体实例
frmMain.Show
子窗体有序地在底下排列
Private Sub adduserMenu_Click()
frmshanchuuser.Show
'当主窗体是MDI窗体时,防止子窗体显示在主窗体的图片后面
SetParent frmshanchuuser.hWnd, Picture1.hWnd
End Sub<span style="font-size:24px; font-family: 楷体; background-color: rgb(255, 255, 255);"> </span>
分析一下这句话SetParentfrmshanchuuser.hWnd, Picture1.hWnd
格式如下:SetParen子窗体.hWnd,主窗体的picture名称.hWnd
然后问题就解决了!
结语
这个问题也算是一波三折呀,当时觉得问题好多,好难,但是当真正总结的时候才发现原来并没有想象中的那么困难,不怕不知道就怕不知道!加油!
未完待续O(∩_∩)O~