您的位置:首页 > 其它

【机房收费】---(窗体显示) 实时错误426 只允许一个MDI窗体 (二)

2016-07-19 10:53 363 查看
前言: 

    关于窗体显示的问题一开始就遇到了,后来又遇到了,前后原因不一样,但是关于窗体显示的问题即便很小也有必要总结一下,毕竟窗体如果不显示,所有的东西都白费了。

    

【问题一】 主窗体显示之后,点击菜单中的选项却显示不出子窗体.





方法:用API函数SetParent来解决这个问题。

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://blog.csdn.net/u010196821/article/details/16369443 
大家有兴趣的可以看一下。


②  但是我和师姐出现的原因还是不太一样,我的登录窗体的代码真的只写了一个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>



 

【总结】

    有时候小的问题也会困扰很久,但是最重要的是不能懈怠,多查多问,总会有点眉目,然后加以思考,实在解决不了还有其他同学和师傅,做好问题记录,只要肯用心,总有收获。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: