MDI窗体:MainMDIFrm1
子窗体:frm_1、frm_2...frm_n
控件:frm1.shape1、frm2.shape1...frm_n..shape1
要实现的功能:
当frm_1处于活动(Activate)状态时,frm_1.shape1.BackColor=红色
frm_2.shape1.BackColor=蓝色
......
frm_n.shape1.BackColor=蓝色当frm_2处于活动(Activate)状态时,frm_2.shape1.BackColor=红色
frm_1.shape1.BackColor=蓝色
......
frm_n.shape1.BackColor=蓝色
......请教:
1.如何知道哪个子窗体是活动的?哪个子窗体是非活动的?
2.像这样处理根据窗体状态决定shape1边框颜色的代码写在子窗体中还是写在父窗体中?
如果写在父窗体中,那父窗体中该用何种过程来随时检查各子窗体的状态?有劳各位高人指点,谢谢!
'写在子窗体中
'窗体活动时
private sub frm1_Activate()
'使Me.Shape1.BorderColor=红色
end sub'窗体不活动时
private sub frm1_Activate()
'使Me.Shape1.BorderColor=蓝色
end sub
窗体上,此时再此事件中设置Me.Shape1.BorderColor=蓝色,窗体又变成活动的了,
然后它自动执行frm1_Activate,我晕......
Private WithEvents m_objForm As FormPublic Sub Attach(objForm As Form)
Set m_objForm = objForm
End SubPublic Function Detach() As Form
Set Detach = m_objForm
Set m_objForm = Nothing
End FunctionPrivate Sub m_objForm_Activate()
Dim obj As Object
For Each obj In m_objForm.Controls
If TypeOf obj Is Shape Then
obj.FillStyle = 0
obj.FillColor = RGB(255, 0, 0)
End If
Next
End SubPrivate Sub m_objForm_Deactivate()
Dim obj As Control
For Each obj In m_objForm.Controls
If TypeOf obj Is Shape Then
obj.FillStyle = 0
obj.FillColor = RGB(0, 0, 255)
End If
Next
End Sub2、 在每个form中添加对该类的引用,并挂接form
Private cs As New Class1Private Sub Form_Load()
cs.Attach Me
End Sub3、 OK. 你所需的功能实现了, 当激活FORM为当前窗口时,所有shape为红色,所有非活动窗口的shape为蓝色
在每一个子窗体的LostFocus事件中加入代码:Shape1.BorderColor=VbBlue
Option ExplicitPublic Sub ActiveChildChange()
Dim frm As Form
For Each frm In Forms
If Not frm Is MDIForm1 Then
If frm Is Me.ActiveForm Then
frm.Shape1.BackColor = vbRed
Else
frm.Shape1.BackColor = vbBlue
End If
End If
Next
End Sub
'所有的子窗体中'
Option ExplicitPrivate Sub Form_Activate()
MDIForm1.ActiveChildChange
End Sub