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边框颜色的代码写在子窗体中还是写在父窗体中?
  如果写在父窗体中,那父窗体中该用何种过程来随时检查各子窗体的状态?有劳各位高人指点,谢谢!

解决方案 »

  1.   


    '写在子窗体中
    '窗体活动时
    private sub frm1_Activate()
    '使Me.Shape1.BorderColor=红色
    end sub'窗体不活动时
    private sub frm1_Activate()
    '使Me.Shape1.BorderColor=蓝色
    end sub
      

  2.   

    这个就是最明显的矛盾,当frm1_Activate,明显焦点已经在其他
    窗体上,此时再此事件中设置Me.Shape1.BorderColor=蓝色,窗体又变成活动的了,
    然后它自动执行frm1_Activate,我晕......
      

  3.   

    1、 创建一个类 假设类名称 为class1
    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为蓝色
      

  4.   

    if frm1 is MainMDIFrm1.ActiveForm thenendif
      

  5.   

    在每一个子窗体的GotFocus事件中加入代码:Shape1.BorderColor=VbRed
    在每一个子窗体的LostFocus事件中加入代码:Shape1.BorderColor=VbBlue
      

  6.   

    'MDIForm1 
    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