📄 frmmainmdi.frm
字号:
mintChildWinCount = mintChildWinCount - 1
If mintChildWinCount <= 0 Then
mnuWindowClose.Enabled = False
mnuWindowCloseAll.Enabled = False
End If
End Sub
Private Sub cmdCancelTree_Click()
'通过设置PictureBox的可见属性,即可完成对目录树的关闭
picTreeView.Visible = False
'注意,把工具栏按钮“目录树”的状态进行相应的调整
tlbMainMdi.Buttons("目录树").value = tbrUnpressed
End Sub
Private Sub MDIForm_Initialize()
'这一段程序,主要用于对应用程序主界面的定制
'需要根据不同的用户进行不同的操作
'菜单的控制
Dim i As Long
Dim mNode As Node '定义一个结点类型
Dim childNode As Node '定义一个结点类型,主要用于存储子结点
Dim lngIndex As Long '定义一个Long变量,用于存储结点的索引
'设置目录树
Set mNode = treMenu.Nodes.Add(, , "root", "学生管理系统")
'为该结点设置图片索引,对应与iamgelist控件中的索引号
mNode.Image = 1
'设置目录树处于打开的状态
mNode.Expanded = True
'检测是否有子窗体,以便使得相应的关闭窗体的菜单可用
If frmMainMDI.ActiveForm Is Nothing Then
mnuWindowClose.Enabled = False
mnuWindowCloseAll.Enabled = False
Else
mnuWindowClose.Enabled = True
mnuWindowCloseAll.Enabled = True
End If
'根据不同用户配备不同权限,利用存放菜单信息的集合控制目录树
If Trim$(strUsrLevel) <> "系统" Then
frmMainMDI.mnuInfo.Visible = False
frmMainMDI.mnuScoreInput.Visible = False
frmMainMDI.mnuUserManage.Visible = False
'根结的索引是1,在此,为根结点添加子结点
Set mNode = treMenu.Nodes.Add(1, tvwChild, "Score", "成绩管理")
'为该结点设置图片
mNode.Image = 2
'为该结点的选中状态设置图片
mNode.SelectedImage = 3
'取得该数字,是因为要根据这个索引号来作定位,为其添加子结点
lngIndex = mNode.Index
For i = 2 To colScore.Count
'为上面添加的结点添加子结点
Set mNode = treMenu.Nodes.Add(lngIndex, tvwChild, , colScore(i))
mNode.Image = 2
mNode.SelectedImage = 3
Next i
Else
'如果是系统级别的用户,这需要为跟结点添加两个子结点
Set mNode = treMenu.Nodes.Add(1, tvwChild, "Info", "学生信息管理")
mNode.Image = 2
mNode.SelectedImage = 3
'取得该数字,是因为要根据这个索引号来作定位,为其添加子结点
lngIndex = mNode.Index
'对集合遍历,同时添加子结点
For i = 1 To colInfo.Count
Set mNode = treMenu.Nodes.Add(lngIndex, tvwChild, , colInfo(i))
mNode.Image = 2
mNode.SelectedImage = 3
Next i
Set mNode = treMenu.Nodes.Add(1, tvwChild, "Score", "成绩管理")
mNode.Image = 2
mNode.SelectedImage = 3
'取得该数字,是因为要根据这个索引号来作定位,为其添加子结点
lngIndex = mNode.Index
'对集合遍历,同时添加子结点
For i = 1 To colScore.Count
Set mNode = treMenu.Nodes.Add(lngIndex, tvwChild, , colScore(i))
mNode.Image = 2
mNode.SelectedImage = 3
Next i
End If
'启动时候,窗体显示目录树,因此相应的工具栏状态值应该设置为选中状态
tlbMainMdi.Buttons("目录树").value = tbrPressed
End Sub
Private Sub MDIForm_Load()
'调用函数,初始化MDI窗体的背景图片
'该函数在应用程序的标准模块MPaintMDIBackground中定义
'关于该模块中所有API函数的定义以及封装,在前面章节有详细讲述
MPaintMDIBackground.InitializePaintBackground hwnd, Me
Move (Screen.Width - Me.Width) / 2, _
(Screen.Height - Me.Height) / 2
'如果图片在资源文件中,发送WM_SIZE消息,使得图片
'在MDI显示时候就能显现
'否则需要等MDI窗体大小发生变化的时候或接受到其他方式
'产生的重绘消息的时候背景图片才能显现图片
'由于使用MDI窗体自身Picture属性里的图片,因此,也可以不必有此处代码
SendMessage hwnd, WM_SIZE, 0&, 0&
'将TreeView控件的imageList属性设置为ilsTreeView
'使得TreMenu能够显示图片。
treMenu.ImageList = ilsTreeView
'初始化公用部分定义的三个集合,使得这三个集合能够在应用程序中正常工作
Call Info_Initialize
Call Score_Initialize
Call AllMenu_initialize
End Sub
'该段代码用来限制窗口在还原或是拖动改变大小时候能保持一个最小的大小限度
Private Sub MDIForm_Resize()
If Not (Me.WindowState = vbMaximized Or Me.WindowState = vbMinimized) Then
If Me.ScaleWidth < 14000 Or Me.ScaleHeight < 9550 Then
Me.Enabled = False
Me.Height = 9550
Me.Width = 14000
Me.Enabled = True
'移动窗体到屏幕中部
Move (Screen.Width - Me.Width) / 2, _
(Screen.Height - Me.Height) / 2
End If
End If
End Sub
Private Sub MDIForm_Unload(Cancel As Integer)
'该函数在应用程序的标准模块MPaintMDIBackground中定义
'关于该模块中所有API函数的定义以及封装,在前面章节有详细讲述
MPaintMDIBackground.TerminatePaintMDIBackground
End Sub
Private Sub mnuInfoExit_Click()
Unload frmMainMDI
End Sub
Private Sub mnuInfoManage_Click()
'显示出学生的信息录入窗体。
frmInfoInput.Show
On Error GoTo err
frmInfoInput.SetFocus
Exit Sub
err:
End Sub
Private Sub mnuInfoQuery_Click()
'该过程中,需要先调用ActiveX DLL中的一个窗体。
'执行完查询后再显示学生查询窗体。
'定义一个用户自定义类的对象,该类位于ActiveX DLL中。
Dim clsStud As New clsScoreQuery
On Error GoTo err
Dim strStudSql As String
Dim rsStud As New ADODB.Recordset
'SQL语句,从学生基本信息表中返回记录集。
strStudSql = "select * from uStudBaseInfo"
Set rsStud = GetRecordSet(strStudSql)
'下面两条语句,可以通过直接为类clsStdu的Public属性赋值
'而传递有关数据库链接和记录集的参数,以备DLL中的Form使用
'Set clsStud.cnnQuery = gcnnConnection
'Set clsStud.rsSource = rsStud
'利用类中定义的初始化数据库信息的公有方法InitDB,可以不用直接对属性赋值。
clsStud.InitDB gcnnConnection, rsStud
'利用类中显示窗体的方法,显示通用查询窗口
clsStud.ShowQueryForm
'通用查询窗口将向类返回一个查询结果数据集。
If Not (clsStud.rsQuery Is Nothing) Then
'如果返回的数据集非空,那么就通过类将该数据集传递给应用程序
'的窗口frmStudQuery所使用,用来显示查询结果。
Set frmStudQuery.rsStudQuery = clsStud.rsQuery
frmStudQuery.Show
frmStudQuery.SetFocus
Set frmStudQuery.dgrStudQuery.DataSource = frmStudQuery.rsStudQuery
End If
'释放rsStud
On Error Resume Next
rsStud.Close
Set rsStud = Nothing
Exit Sub
err:
End Sub
Private Sub mnuScoreInput_Click()
'显示成绩录入窗体
frmScoreInput.Show
On Error GoTo err
frmScoreInput.SetFocus
Exit Sub
err:
End Sub
Private Sub mnuScoreQuery_Click()
'该过程中,需要先调用ActiveX DLL中的一个窗体
'执行完查询后再显示学生查询窗体
'定义一个用户自定义类的对象,该类位于ActiveX DLL中
Dim clsScore As New clsScoreQuery
Dim strScoreSql As String
Dim rsScore As New ADODB.Recordset
'SQL语句,从成绩表中返回记录集。
strScoreSql = "select * from v_ScoreInfo"
Set rsScore = GetRecordSet(strScoreSql)
'下面两条语句,可以通过直接为类clsStdu的Public属性赋值
'而传递有关数据库链接和记录集的参数,以备DLL中的Form使用
'Set clsScore.cnnQuery = gcnnConnection
'Set clsScore.rsSource = rsScore
'利用类中定义的初始化数据库信息的公有方法InitDB,可以不用直接对属性赋值。
clsScore.InitDB gcnnConnection, rsScore
'利用类中显示窗体的方法,显示通用查询窗口
clsScore.ShowQueryForm
'通用查询窗口将向类返回一个查询结果数据集。
If Not (clsScore.rsQuery Is Nothing) Then
'如果返回的数据集非空,那么就通过类将该数据集传递给应用程序
'的窗口frmQueryResult所使用,用来显示查询结果。
Set frmQueryResult.rsQueryResult = clsScore.rsQuery
frmQueryResult.Show
frmQueryResult.SetFocus
Set frmQueryResult.dgrQueryScore.DataSource = frmQueryResult.rsQueryResult
End If
On Error Resume Next
rsScore.Close
Set rsScore = Nothing
End Sub
Private Sub mnuUserManage_Click()
'显示用户维护窗体
frmUserManage.Show
On Error GoTo err
frmUserManage.SetFocus
err:
End Sub
Private Sub mnuUserPsw_Click()
'用模态对话框的方式显示修改密码窗体
frmModifyPsw.Show vbModal
End Sub
Private Sub mnuWindowCascade_Click()
'用层叠的方式排列子窗体
frmMainMDI.Arrange vbCascade
End Sub
Private Sub mnuWindowClose_Click()
'如果当前活动窗体非空,则关闭当前活动窗体,利用ActiveForm
If Not (frmMainMDI.ActiveForm Is Nothing) Then
Unload frmMainMDI.ActiveForm
End If
End Sub
Private Sub mnuWindowCloseAll_Click()
'通过一个循环,关闭所有活动子窗体
Do While Not (frmMainMDI.ActiveForm Is Nothing)
Unload frmMainMDI.ActiveForm
Loop
End Sub
Private Sub mnuWindowCloseTree_Click()
'通过调用按钮事件,关闭目录树
cmdCancelTree_Click
'设置工具栏上复选风格的“目录树”按钮状态为未按下
tlbMainMdi.Buttons("目录树").value = tbrUnpressed
End Sub
Private Sub mnuWindowHorizontal_Click()
'水平平铺
frmMainMDI.Arrange vbHorizontal
End Sub
Private Sub mnuWindowIcon_Click()
'按图标排列子窗口
frmMainMDI.Arrange vbArrangeIcons
End Sub
Private Sub mnuWindowShowTree_Click()
'显示目录树
picTreeView.Visible = True
'设置工具栏目录树的复选风格按钮为按下状态
tlbMainMdi.Buttons("目录树").value = tbrPressed
End Sub
Private Sub mnuWindowVertical_Click()
'垂直平铺子窗口
frmMainMDI.Arrange vbVertical
End Sub
Private Sub picTreeView_Resize()
treMenu.Height = picTreeView.Height
End Sub
'对工具栏进行编程,需要利用到工具栏上按钮的一些属性
Private Sub tlbMainMdi_ButtonClick(ByVal Button As MSComctlLib.Button)
'该过程传递的参数是工具栏按钮,由于按钮具有唯一的标志Key,因此可以根据
'Key属性来对每个按钮进行识别
'由于Key属性是可选项,如果在程序设计时候没有为每个按钮设定Key,那么此处
'的编程将会比较麻烦
'也可以通过按钮的索引来进行,只是不如Key灵活
Select Case Button.Key
Case "水平排列"
mnuWindowHorizontal_Click
Case "垂直排列"
mnuWindowVertical_Click
Case "层叠排列"
mnuWindowCascade_Click
Case "关闭当前窗口"
mnuWindowClose_Click
Case "关闭所有窗口"
mnuWindowCloseAll_Click
Case "目录树"
'如果单击按钮前的状态处于未按下状态,那么单击后
'自动设置其状态为按下状态,同时显示出目录树
'这些判断语句是在单击完按钮后才开始判断的
'此时按钮的状态已经不是单击前的状态了,因为单击该按钮
'的同时就改变了按钮的“按下/弹起”的状态
'这个先后关系不可以搞混淆了
If Button.value = tbrPressed Then
mnuWindowShowTree_Click
'如果单击按钮前的状态未按下状态,即,目录树已经显现的时候,单击该按钮
'那么将自动设置其状态为未按下状态,同时关闭目录树
ElseIf Button.value = tbrUnpressed Then
mnuWindowCloseTree_Click
End If
End Select
End Sub
Private Sub tmrStat_Timer()
'如果没有当前活动窗体,就跳转到Err处执行相应的代码
On Error GoTo err
staMainMdi.Panels(1).Text = "当前窗口:" & frmMainMDI.ActiveForm.Caption
Exit Sub
err:
staMainMdi.Panels(1).Text = "当前没有打开的子窗口!"
End Sub
'利用NodeClick事件而不是TreeView的Click事件
'如果利用CLick事件,在单击树状控件的左侧的“+”展开控件的时候也会激发Click
'事件,此时,如果有与菜单对应的结点被选中,那么就会重复该操作
'因此,应该避免这种操作,直接利用NodeCLick事件
Private Sub treMenu_NodeClick(ByVal Node As MSComctlLib.Node)
'定义字符串变量,存放取得的结点上的文本
Dim strOperate As String
Dim i As Integer '可以用作调用菜单时候,集合的索引;控制循环
'利用被选择的树的结点来取得该结点在集合中的序号,
'以次来调用对应的菜单过程
strOperate = treMenu.SelectedItem.Text
For i = 1 To colAllMenu.Count
'如果在集合中搜索到与选中结点文本相匹配的字符串
'就按照此时集合的索引进行相应菜单的调用
If strOperate = colAllMenu(i) Then
Call MenuOperate(i)
End If
Next i
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -