前言:
关于窗体显示的问题一开始就遇到了,后来又遇到了,前后原因不一样,但是关于窗体显示的问题即便很小也有必要总结一下,毕竟窗体如果不显示,所有的东西都白费了。
【问题一】主窗体显示之后,点击菜单中的选项却显示不出子窗体.
Private Declare Function SetParent Lib"user32" (ByVal hWndChild As Long,ByVal hWndNewParent As Long) AsLong
①子窗体并非不能显示,只是子窗体位于Picture 控件和主窗体之间的位置,也就是说,picture控件把要显示的子窗体遮住了。所以我们需要重新为子窗体找一个父窗体,也就是找一个容器来盛放子窗体。(父窗体严格来说应该是容器)
②SetParent是一个API函数,它的作用是为一个物体指定一个新的父窗体。(也就是把一个物体转到另一个物体上去。
③Setparent 的用法相当简单 语法是: Setparent 物体句柄,目标句柄。
SetParent frmHanCharge.hWnd,FrmMain.hWnd
很简单的,frmHanCharge是子窗体,frmmain是主窗体,利用SetParent让子窗体在父窗体中重新显示。
所以现在可以显示出来了,但是不知道大家有没有发现,子窗体是显示出来了,可是子窗体只是沿着主窗体的上方显示出了一道边,并不能显示全部窗体。如下图所示:
找了很到代码来解决上面这个问题,查询关于让子窗体随父窗体的大小而变化大小的问题,网上关于这样的解决办法基本雷同,就是用窗体的Resize事件就可以。
<span style="font-family:FangSong_GB2312;font-size:18px;"><strong>Private Sub Form_Resize() '当窗体改变时 MDIFrom.Width = Me.ScaleWidth '重新设置Mdi子窗体为窗体有效宽度 MDIFrom.Height = Me.ScaleHeight '重新设置Mdi子窗体为窗体有效高度 End Sub</strong></span>
但是我用了上面的代码并达到想要的效果,于是自己想了最笨的方法,设置窗体的大小和位置,当然最笨的办法也是最有效的办法,下图是后来的结果,不过觉得所有的窗体都这样设置是有些麻烦,但是也没有找到简便的方法,就将上面的代码复制一下粘到了所有的子窗体。
<span style="font-family:FangSong_GB2312;font-size:18px;"><strong>Private Sub Form_Load() '固定窗体大小位置 Me.Top = 0 Me.Left = 2500 Me.Width = 13000 Me.Height = 9000 end sub </strong></span>
【问题二】将工程设置为sub main启动,后方便调试改为frmMain启动,当最后改为sub main启动的时候,竟然出了426错误
426错误,所有的子窗体都不能显示,错误提示只允许一个MDI窗体,奇怪,我真的是只有一个MDI窗体的啊,为什么还是会报错?
①在网上查了很多,有10期的李雪师姐有过同样的错误和总结,我找到了他的博客细心研究,下面是博客链接,http://www.jb51.cc/article/p-xkpfpirg-vo.html 大家有兴趣的可以看一下。
②但是我和师姐出现的原因还是不太一样,我的登录窗体的代码真的只写了一个frmMaind的show,没有多写。
③于是我查了一下关于出现这个问题的原因,毕竟找到根源自己才会彻.底解决问题。
④一个工程只允许有一个 MDIForm。此错误产生的原因及解决方法如下:
* 试图向工程中加载包含MDIForm 的文件,该工程中已经包含一个 MDIForm。
在加载其它文件之前,先删除包含已加载 MDIForm 的文件。
* 试图加载 MDIForm 的第二个实例,该MDIForm 是用 Dim 或 Set 语句创建的。
在工程中仅能创建 MDIForm 的一个实例。
⑤看到这里我仿佛明白了些什么,大概意思就是不能同时加载两次MDI主窗体,我开始着手从代码里面找,因为错误出现在子窗体的加载,所以只可能是主窗体和模块以及子窗体的from load事件出的问题我按了之后发现真的是模块窗体出了问题。
⑥下面是模块窗体中sub main的代码,加了单引号变为注释的两行代码原来是有的,后来把这两句去掉之后就可以运行了,完美解决。
'系统启动后,需要对用户进行判读,如果登陆者是授权用户,将进入系统,否则程序停止运行
<span style="font-family:FangSong_GB2312;font-size:18px;"><strong>Sub main() Dim fLogin As New FrmLogin 'Dim FrmMain As New FrmMain fLogin.Show vbModal '显示登陆窗体实例 If Not fLogin.OK Then End End If Unload fLogin '判断是否进入系统 ' Set FrmMain = New FrmMain FrmMain.Show End Sub </strong></span>
【总结】
有时候小的问题也会困扰很久,但是最重要的是不能懈怠,多查多问,总会有点眉目,然后加以思考,实在解决不了还有其他同学和师傅,做好问题记录,只要肯用心,总有收获。