机房收费系统——解决子窗体被picturebox覆盖

在敲机房刚开始可谓大波大浪,在敲学生过程中侥幸逃过的问题,在这里全部遇到了,有些坑还是要跳的,该经历的总会经历,经历过后就会大彻大悟。。。。。


问题一:无可用的MDI窗体可加载


原因

帮助上这样解释:试图加载一个 MDIChild 属性设为 True 的窗体,但是在运行时工程中却没有可加载的MDIForm

这个问题在敲学生的时候侥幸逃过,是因为在敲学生的时候没有建立子窗体,然而在这里建立了子窗体,加载子窗体的时候提示无可用的MDI窗体,因为我根本就没有创建主窗体,只是添加了个form窗体。


知道了这个问题之后就点击工程——添加MDI窗体选项,添加了个主窗体,这个过程满眼的泪啊,以前在form窗体中建的菜单,控件都得重新再来。

不过通过这个问题,我就明白了,有些坑是必须跳的,前面侥幸逃过了,现在就得跳,踏实走好每一步吧。。。。。

添加了主窗体,这个问题解决了,但是向主窗体上添加控件的时候。接着新的朋友又来了。


问题二:无对齐属性的控件不能直接放置在MDI窗体上

机房收费系统——解决子窗体被picturebox覆盖_第1张图片

那我们就应该想:什么样的控件既有对齐属性,又可以当容器呢?当然是picturebox了,百度果然也是这样说的,MDI窗体上不能直接放置控件,需要借助picturebox,然后把控件画到picturebox上。

当我们把picturebox添加好之后,这样可以添加控件了,但是新的问题又来了哦,如下:


问题三:子窗体被picturebox遮挡

当我们把picturebox添加好之后,这样可以添加控件了,但是show不出子窗体,于是接着找度娘,用上了setparent函数。


步骤一:在模块中添加setparent函数

<span style="font-size:18px;">Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
</span>

函数功能:改变某个子窗口的父窗口,也就是说需要把子窗口放到另一个窗口或容器中显示,这样就不会出现子窗口被picturebox遮挡的情况了参数:

参数:hwndchild   子窗口句柄

           hwndnewparent   新的父窗口句柄


步骤二:编写代码


<span style="font-size:18px;">Private Sub registermenu_Click(Index As Integer)
    
    SetParent frmregister.hWnd, frmmain.hWnd
    frmregister.Show
End Sub</span>

       

frmregister为子窗体,frmmain为新的父窗体,本以为这样就可以给子窗体换一个新的父窗体,可是提示如下错误:

机房收费系统——解决子窗体被picturebox覆盖_第2张图片


于是接着找度娘,原因是:程序只允许一个主窗体。

可想而知我的程序不只是一个主窗体,于是看代码,恍然所悟,我们可以看到下面的sub main过程,登录成功后,会实例化主窗体frmmain,最后fmainform会显示出来,通过上面的给子窗体换显示的父窗体的代码可知,我们设置的新的父窗体是frmmain,而frmmain就是主窗体,这样程序就会出现两个主窗体,他也不知道该显示那个主窗体了,于是就会报错。

'定义一个过程,设置登录窗体为启动窗体
Sub main()
   Dim flogin As New frmlogin            '实例化登录窗体
   flogin.Show vbModal                   '显示登录窗体
   If Not flogin.ok Then
        End
    End If
    Unload flogin
    
    
    Set fmainform = New frmmain          '实例化主窗体
    fmainform.Show                       '显示主窗体
    
End Sub



于是我想可不可以在程序中添加一个一般的form窗体作为新的父窗体,让子窗体在他上面显示,接着给孩子换爹

<span style="font-size:18px;">Private Sub registermenu_Click(Index As Integer)
    Form1.Show
    SetParent frmregister.hWnd, Form1.hWnd
    frmregister.Show
End Sub</span>

这下子不会出现上面的错误了,因为没有要加载的主窗体了,同时子窗体可以在form里显示出来,可是form窗体和frmmain窗体是独立的,当拖动frmmain窗体的时候,子窗体不会跟着拖动,当关闭主窗体是,子窗体照样可以咋form里显示,这种方法看来还是有缺陷,没有把子窗体融入到frmmain里。


通过上面的两处错误,我知道了,新的父窗体不可以是主窗体,同时又不能是与frmmain脱离的一般的窗体,那该让谁来当新的父窗体呢???


于是接着百度,发现一句话,父窗体严格来说可以是一个容器,看到这句话,才明白我前面的理解有多么局限了,从刚开的以为新的父窗体只能是主窗体,到后来的可以是一般的form窗体,到现在我可以理解成一个picturebox控件也可以当作新的父窗体,让子窗体在上面显示,理解到这,就像发现一百万一样开心哈哈大笑

picture1不是主窗体,然而picture1又在主窗上,这样就可以让picture1当作新的父窗体,让子窗体在上面显示。

编写代码:

<span style="font-size:18px;">Private Sub registermenu_Click(Index As Integer)
  
    SetParent frmregister.hWnd, Picture1.hWnd
    frmregister.Show
End Sub</span>

结果成功地显示了子窗体,困扰我三天的问题就这样迎韧而解了,在一步步解决问题的过程中收获才是最多的。


总结:

通过这个问题,对盲人摸象又有了深刻的理解,有些问题刚开始即使百度,也理解不了问题的全貌,只是可以看到一个角度,就像刚开始我以为新的父窗体只能是主窗体,到后来理解可以是一般的form窗体,到最后理解可以是一个picturebox控件,只有不断地学习才可以看清楚全貌,有些坑是必须跳的,遇到问题自己不断解决的过程,收获的不仅仅是解决了的问题,更多的是心灵上的满足。




你可能感兴趣的:(vb,机房收)