下面是按Command1钮弹出的对话框,如何加一组代码,实现点击窗体的关闭钮也弹出同样的对话框?
Private Sub Command1_Click()
If MsgBox("你确实要退出吗?", vbYesNo + vbExclamation, "系统询问") = vbYes Then
   Unload Me
   End
   Else
   Cancel = True
    End If
End Sub

解决方案 »

  1.   

    Private Sub Form_Unload(Cancel As Integer)
     If MsgBox("你确实要退出吗?", vbYesNo + vbExclamation, "系统询问") = vbYes Then
         Unload Me
         End
     Else
       Cancel = True
     End If
    End Sub
      

  2.   

    楼上两位的方法偶放在单窗体上可以,但有多个窗体之间需要跳转时,就会出现下面情况:
    在跳转窗体时,点跳转窗体的钮也会弹出"退出"对话框.跳接窗体代码如下:(按Command2钮,从窗体1切换到窗体2)
    Private Sub Command2_Click()
    Unload 窗体2
    Load 窗体2
    窗体2.Show
    End Sub
    由于跳转到另一窗体时,要求该窗体要在最大化状态,如果该窗体事先已打开,而是最小化在任务栏上,若再次由其它窗体重复跳接到该窗体,还时最小化在任务栏上.所以加上了关闭窗体2一句,即先关闭再打开.这样不论跳接到哪个窗体都是最大化.
    如有不对请指正.
      

  3.   

    简单:用CALL调用Command1按钮的代码即可。Private Sub Form_Unload(Cancel As Integer)
            Call Command1_Click
    End Sub
      

  4.   

    如有跳转窗体,只需要将Command1过程中的Private 改为Public即可,对所有窗体都适用。如
    下:Private Sub Form_Unload(Cancel As Integer)
            Call Form1.Command1_Click
    End Sub在每一个窗体的Unload事件中都写上上面的代码即可。Public Sub Command1_Click()
           If MsgBox("你确实要退出吗?", vbYesNo + vbExclamation, "系统询问") = vbYes Then
              Unload Me
              End
           Else
              Cancel = True
           End If
    End Sub
      

  5.   

    我被弄糊涂了,没太明白楼主的意思,不知是不是不想关闭这个窗口时不关闭整个程序,而是保留其他窗口呢?
    如果是这样,就简单了:Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        Cancel = (MsgBox("你确实要退出吗?", vbYesNo + vbExclamation, "系统询问") = vbNo)
    End Sub使用QueryUnload事件的另一个好处是可以根据 unloadmode 参数得知是什么原因导致的窗口关闭:常数                  值       描述 
    vbFormControlMenu     0        用户从窗体上的“控件”菜单中选择“关闭”指令。 
    vbFormCode            1        Unload 语句被代码调用。 
    vbAppWindows          2        当前 Microsoft Windows 操作环境会话结束。 
    vbAppTaskManager      3        Microsoft Windows 任务管理器正在关闭应用程序。 
    vbFormMDIForm         4        MDI 子窗体正在关闭,因为 MDI 窗体正在关闭。 
    vbFormOwner           5        因为窗体的所有者正在关闭,所以窗体也在关闭。 
      

  6.   

    由于本人采用了一个工程引进另外二个工程中的窗体方式,并有悬浮窗体,有模块,在用了"东方之珠"的方案后,出现了一些新的问题,
    本论坛无法上传附件,所以只好放在下面的论坛,请各位前往更正一下:
    http://www.vbgood.com/viewthread.php?tid=50452&extra=page%3D1
      

  7.   

    用下面的代码可以实现上面功能,但只能对exe窗体文件起作用,而对本工程内的窗体就不起作用,不知何故?
    原代码60多K在下面网站有:
    http://www.vbgood.com/viewthread.php?tid=50527&extra=page%3D1
    http://bbs.bc-cn.net/dispbbs.asp?boardID=6&ID=122405&page=1
    部分代码如下:改的地方是"关闭钮用(1)-(6)"
    Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
    Private Declare Function GetWindowThreadProcessId Lib "USER32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Const PROCESS_TERMINATE = 1Private bQuestion As Boolean '关闭钮用(1)
    Private Sub Command3_Click() '在本工程内用下面代码就出错,不知何故?
    Load dd
    dd.Show
    Unload Me
    End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) '关闭钮用(2)
        If UnloadMode = 0 Then bQuestion = True
    End Sub
    Private Sub Command1_Click()
    Shell "rundll32.exe url.dll,FileProtocolHandler " & App.Path & "\aa.exe", vbMaximizedFocus
    bQuestion = False '关闭钮用(3)
        Unload Me
    End Sub
    Private Sub Command2_Click()
    Shell "rundll32.exe url.dll,FileProtocolHandler " & App.Path & "\bb.exe", vbMaximizedFocus
    bQuestion = False '关闭钮用(4)
        Unload Me
    End SubPrivate Sub Command4_Click() '退出系统钮
    bQuestion = True '关闭钮用(5)
        Unload Me
    End Sub
    Private Sub Command5_Click() '在本工程内用下面代码就出错,不知何故?
    Load ee
    ee.Show
    Unload Me
    End SubPrivate Sub Form_Unload(Cancel As Integer) '关闭钮用(6)
       Dim Ltem As Long
        Dim LpID As Long
        Dim hLong As Long
        Dim pForm As Form
        Const strWinName As String = "olp"
        If bQuestion Then
            If MsgBox("你确实要退出吗?", vbYesNo + vbExclamation, "系统询问") <> vbYes Then
                Cancel = True
                Exit Sub
            Else
                hLong = FindWindow(vbNullString, strWinName)
                If hLong Then
                    GetWindowThreadProcessId hLong, LpID
                    Ltem = OpenProcess(PROCESS_TERMINATE, False, LpID)
                    TerminateProcess Ltem, 0
                    hLong = 0
                End If
            End If
        End If
        UnHook Me.hWnd '鼠标滚轮事件用
        For Each pForm In Forms
            Unload pForm
        Next
    End Sub
      

  8.   

    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        Cancel = (MsgBox("你确实要退出吗?", vbYesNo + vbExclamation, "系统询问") = vbNo)
    End Sub使用QueryUnload事件的另一个好处是可以根据 unloadmode 参数得知是什么原因导致的窗口关闭:常数                  值       描述 
    vbFormControlMenu     0        用户从窗体上的“控件”菜单中选择“关闭”指令。 
    vbFormCode            1        Unload 语句被代码调用。 
    vbAppWindows          2        当前 Microsoft Windows 操作环境会话结束。 
    vbAppTaskManager      3        Microsoft Windows 任务管理器正在关闭应用程序。 
    vbFormMDIForm         4        MDI 子窗体正在关闭,因为 MDI 窗体正在关闭。 
    vbFormOwner           5        因为窗体的所有者正在关闭,所以窗体也在关闭。