在敲机房刚开始可谓大波大浪,在敲学生过程中侥幸逃过的问题,在这里全部遇到了,有些坑还是要跳的,该经历的总会经历,经历过后就会大彻大悟。。。。。
问题一:无可用的MDI窗体可加载
原因:
帮助上这样解释:试图加载一个 MDIChild 属性设为 True 的窗体,但是在运行时工程中却没有可加载的MDIForm。
这个问题在敲学生的时候侥幸逃过,是因为在敲学生的时候没有建立子窗体,然而在这里建立了子窗体,加载子窗体的时候提示无可用的MDI窗体,因为我根本就没有创建主窗体,只是添加了个form窗体。
知道了这个问题之后就点击工程——添加MDI窗体选项,添加了个主窗体,这个过程满眼的泪啊,以前在form窗体中建的菜单,控件都得重新再来。
不过通过这个问题,我就明白了,有些坑是必须跳的,前面侥幸逃过了,现在就得跳,踏实走好每一步吧。。。。。
添加了主窗体,这个问题解决了,但是向主窗体上添加控件的时候。接着新的朋友又来了。
问题二:无对齐属性的控件不能直接放置在MDI窗体上
那我们就应该想:什么样的控件既有对齐属性,又可以当容器呢?当然是pictureBox了,百度果然也是这样说的,MDI窗体上不能直接放置控件,需要借助pictureBox,然后把控件画到pictureBox上。
当我们把pictureBox添加好之后,这样可以添加控件了,但是新的问题又来了哦,如下:
问题三:子窗体被pictureBox遮挡
当我们把pictureBox添加好之后,这样可以添加控件了,但是show不出子窗体,于是接着找度娘,用上了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为新的父窗体,本以为这样就可以给子窗体换一个新的父窗体,可是提示如下错误:
于是接着找度娘,原因是:程序只允许一个主窗体。
可想而知我的程序不只是一个主窗体,于是看代码,恍然所悟,我们可以看到下面的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
<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控件,只有不断地学习才可以看清楚全貌,有些坑是必须跳的,遇到问题自己不断解决的过程,收获的不仅仅是解决了的问题,更多的是心灵上的满足。
原文链接:https://www.f2er.com/vb/256956.html