我想设计一个程序,就是两个窗口a、b上的按钮都显示同一个另外窗口c
但我要判断其中c窗口是否打开,如果已经被a打开了,则点b上面再点此按钮的时候
不重新打开新的c窗口
谢谢

解决方案 »

  1.   

    private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Public Function IsShow(FormName As String) As Boolean
        Dim lR As Long
        lR = FindWindow(vbNullString, FormName)
        If lR <> 0 Then
            IsShow = True 
        Else
            IsShow = False 
        End If
    End Function
    Private Sub Command1_Click()
    if IsShow("C窗体的标题")=False then
        c.show
    else
        msgbox "c窗体已经打开"
    end if
    End Sub
      

  2.   

    同意 tztz520(午夜逛街)
    呵呵,而且代码写得很漂亮
      

  3.   

    不要用API也可以,你建立一个全局静态变量在模块中,当那个窗口打开时将变量设为某一个值,关闭时设为另一个值,比如为false。当你点另一个按钮时去判断那个变量的值就可以了。我常常用这种方法,感觉还可以吧
      

  4.   

    呵呵,我总结了一下,写了一些函数,大家参考一下
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
      (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
      
    Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As LongPublic Function IsLoad(strFormName As String) As Boolean
    '\\******************************************************
    '\\函数作用:判断某窗体是否加载
    '\\函数参数:strFormName,窗体的名称
    '\\函数返回:窗体显示则返回True,否则返回False
    '\\******************************************************
        Dim lngFormHandle As Long
        lngFormHandle = FindWindow(vbNullString, strFormName)
        If lngFormHandle <> 0 Then
            IsLoad = True
        Else
            IsLoad = False
        End If
    End Function
    Public Function IsShow(strFormName As String) As Boolean
    '\\******************************************************
    '\\函数作用:判断某窗体是否显示
    '\\函数参数:strFormName,窗体的名称
    '\\函数返回:窗体显示则返回True,否则返回False
    '\\******************************************************    Dim objForm As Form
        IsShow = False
        For Each objForm In Forms
            If objForm.Name = strFormName Then
                If objForm.Visible = True Then
                    IsShow = True
                End If
                Exit For
            End If
        NextEnd Function
    Public Function IsShow1(strFormName As String) As Boolean
    '\\******************************************************
    '\\函数作用:判断某窗体是否显示,使用API方法
    '\\函数参数:strFormName,窗体的名称
    '\\函数返回:窗体显示则返回True,否则返回False
    '\\******************************************************    Dim lngFormHandle As Long
        lngFormHandle = FindWindow(vbNullString, strFormName)  '查找该窗体的句柄
        If lngFormHandle = 0 Then                              '如果窗体没有加载,自然,也就没有显示
            IsShow1 = False
            Exit Function
        End If
        'Debug.Print IsWindowVisible(lngFormHandle)
        If IsWindowVisible(lngFormHandle) = 1 Then             '使用IsWindowVisible这个API函数进行判断
            IsShow1 = True
        Else
            IsShow1 = False
        End IfEnd Function
      

  5.   

    另外,使用FindWindow有一个弊病
    如果你另外一个工程有叫相同名字的Form时
    它同样会说找到叫这个名字的窗体
      

  6.   

    这样子不行么:if c.visible = false then c.show?
      

  7.   

    根据楼主的意思当你按钮A和按钮B的写法是这样的时候
    Private Sub CommandA_Click()
        frmC.Show
    End Sub
    Private Sub CommandB_Click()
        frmC.Show
    End Sub
    这样不需要做任何别的处理,因为不会弹出新的C窗体,内存中只有这一个C窗体对象如果是另外一种写法:
    Private Sub CommandA_Click()
        Dim objFm As New frmC
        objFm.Show
    End Sub
    Private Sub CommandB_Click()
        Dim objFm As New frmC
        objFm.Show
    End Sub
    这样可以创建多个frmC的实例,那么就需要加一下处理的语句先判断在工程中的Forms集合是否还有叫做frmC的窗体,有的话表示frmC已经显示了。
      

  8.   

    上面我写的那些IsLoad,IsShow等函数,麻烦楼主结贴的时候删掉
    因为我考虑的不是很周全,免得误导他人另外小结一下:判断窗体是否显示,直接看 form对象的visible属性即可至于窗体是否已经加载,只要 if not form is nothing就可以了True的话,表示窗体已经加载,剩下的只是显示与否的问题
     
      

  9.   

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function SetActiveWindow Lib "user32" (ByVal hwnd As Long) As LongPublic Function IsShow(FormName As String) As Boolean
        Dim lR As Long
        lR = FindWindow(vbNullString, FormName)
        If lR <> 0 Then
            IsShow = True
            lR = SetActiveWindow(lR)
            SendKeys ("{ENTER}")
            
        Else
            IsShow = False
        End If
    End FunctionPrivate Sub Command1_Click()   
      If IsShow("c窗体标题") = False Then
         c窗体.Show
      End If
    End Sub
    就是这样了,问题解决