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

来源:互联网 发布:职前教育网络学堂 编辑:程序博客网 时间:2024/06/05 07:25

前言: 

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

    

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



方法:用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 = 9000end 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>

 

【总结】

    有时候小的问题也会困扰很久,但是最重要的是不能懈怠,多查多问,总会有点眉目,然后加以思考,实在解决不了还有其他同学和师傅,做好问题记录,只要肯用心,总有收获。




0 0
原创粉丝点击