none
请教主从窗口状态同步的问题 RRS feed

  • 问题

  • 直接说问题了:
    我用VB.NET写个小程序,程序主窗口用showdialog打开一个模式窗口,我想让从窗口最小化时,主窗口也同时最小化。请问如何实现?谢谢了。
    2009年12月27日 12:22

答案

  • Public Class Form2
    
        Public Event Event1(ByVal str As String)
    
        Private Sub Form2_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
    
            If Me.WindowState = FormWindowState.Minimized Then
    
                RaiseEvent Event1("Form2 is Minimized!")
            End If
        End Sub
    
    End Class
    
    ''Form1
    
    Dim f As New Form2
            AddHandler f.Event1, AddressOf EventHandler
            f.ShowDialog()
    
    Private Sub EventHandler(ByVal str As String)
            MsgBox(str)
        End Sub

    http://feiyun0112.cnblogs.com/
    2009年12月28日 4:15
    版主

全部回复

  • 你好!
         你使用ShowDialog方法显示了一个模态窗体,默认情况下就是你的从窗口最小化时,主窗口也同时最小化了!你试试看!
    周雪峰
    2009年12月27日 16:34
    版主
  • 我试过,从窗口最小化了,但主窗口还显示在桌面上。
    我的从窗口是没有图标的,最小化时没有收缩到任务栏上,而是到了桌面的左下角任务栏上方(也就是开始按钮的上方),但主窗口还显示在桌面上。
    2009年12月27日 23:54
  • 在子窗体上定义一个事件,ShowDialog前让主窗体先绑定这个事件,从窗口最小化时触发
    http://feiyun0112.cnblogs.com/
    2009年12月28日 0:52
    版主
  • 我试过,从窗口最小化了,但主窗口还显示在桌面上。
    我的从窗口是没有图标的,最小化时没有收缩到任务栏上,而是到了桌面的左下角任务栏上方(也就是开始按钮的上方),但主窗口还显示在桌面上。
    你好!
         你还设置了其他属性吗?请问可以提供给我相关的代码吗?我测试不是这样的结果啊!

    周雪峰
    2009年12月28日 2:08
    版主
  • 谢谢你的回复,我刚才作了一个测试(我用的是vs2008):
    建立从窗口frmSlave,所有属性取默认值。
    建立主窗口frmMaster,所有属性默认,上面加一个按钮,加语句frmSlave.ShowDialog(Me)
    测试时,点击主窗口的按钮,再点击从窗口的最小化按钮时现象和我上面描述的一致。
    请问feiyun0112如何绑定事件并触发主窗口的最小化呢?谢谢!

    2009年12月28日 3:28
  • 你把frmSlave.ShowDialog(Me)里的Me去掉,就实现你要的效果了!
    实际上我加上Me也没有重现你说的问题啊!十分奇怪!
    周雪峰
    2009年12月28日 3:41
    版主
  • 晕,按照你说的测试了一下,还是一样的。整个程序只有一条语句,frmSlave.ShowDialog()。
    请帮我分析一下,还有没有别的可能呢?

    2009年12月28日 4:11
  • Public Class Form2
    
        Public Event Event1(ByVal str As String)
    
        Private Sub Form2_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
    
            If Me.WindowState = FormWindowState.Minimized Then
    
                RaiseEvent Event1("Form2 is Minimized!")
            End If
        End Sub
    
    End Class
    
    ''Form1
    
    Dim f As New Form2
            AddHandler f.Event1, AddressOf EventHandler
            f.ShowDialog()
    
    Private Sub EventHandler(ByVal str As String)
            MsgBox(str)
        End Sub

    http://feiyun0112.cnblogs.com/
    2009年12月28日 4:15
    版主
  • 谢谢,我过会儿试一下。
    2009年12月28日 4:42
  • 我晕要这么麻烦吗??

     Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
            If Me.WindowState = FormWindowState.Minimized Then
                '在这里加上让主窗体最小化的代码,假如主窗体名字是frmMain
                frmMain.WindowState = FormWindowState.Minimized
            End If
        End Sub

    欢迎到我的博客一起讨论 http://www.raymanzhai.com
    2009年12月28日 4:59
  • feiyun0112,刚才测试了一下,可以最小化,但恢复的时候从窗口不能显示(可能与从窗口没有图标不在任务栏上显示有关),请问有没有解决的办法呢?

    2009年12月28日 7:46
  • 你怎样设置的从窗体没有图标,是使用的ShowIcon属性吗?我这里把ShowIcon属性设置成false也是可以一起最小化的啊!
    周雪峰
    2009年12月28日 9:23
    版主
  • 明白了,你应该是把ShowInTaskbar设置成false了吧!这样就是你说的效果!
    如果不在任务栏显示,这个窗体最小化的的效果是最小化到开始按钮的上方!而且即使这样,主窗体也会一起最小化的!
    周雪峰
    2009年12月28日 9:25
    版主
  • 同样原理,你可以在主窗体创建事件,从窗口打开前绑定事件
    http://feiyun0112.cnblogs.com/
    2009年12月28日 9:29
    版主
  • 明白了,你应该是把ShowInTaskbar设置成false了吧!这样就是你说的效果!
    如果不在任务栏显示,这个窗体最小化的的效果是最小化到开始按钮的上方!而且即使这样,主窗体也会一起最小化的!
    周雪峰

    对的,我是把从窗口的ShowInTaskbar设成了False, 目的是让主从窗口只在人物栏显示一个图标,但主窗口并没有同步最小化。
    下午我也尝试将从窗口的ShowInTaskbar属性设成True,但主窗口仍然没有消失。我目前是在ShowDialog前将主窗口hide,从窗口关闭后再show,用这个笨方法暂时解决的。
    2009年12月28日 15:26
  • 这个比较困难吧,从窗口是封装在DLL里的,怎么在从窗口里引用主窗口事件呢?
    2009年12月28日 15:33
  • 明白了,你应该是把ShowInTaskbar设置成false了吧!这样就是你说的效果!
    如果不在任务栏显示,这个窗体最小化的的效果是最小化到开始按钮的上方!而且即使这样,主窗体也会一起最小化的!
    周雪峰

    对的,我是把从窗口的ShowInTaskbar设成了False, 目的是让主从窗口只在人物栏显示一个图标,但主窗口并没有同步最小化。
    下午我也尝试将从窗口的ShowInTaskbar属性设成True,但主窗口仍然没有消失。我目前是在ShowDialog前将主窗口hide,从窗口关闭后再show,用这个笨方法暂时解决的。
    相当奇怪啊!我这里可以一起最小化的,你还设置了其他属性吗?

    周雪峰
    2009年12月28日 15:38
    版主
  • 我罗列一下从窗口自定义的属性和值:
    AutoScaleMode:Font;Size:xxx,xxx;StartPosition:CenterScreen;MaximizeBox:False;Name:frmSlave;FormBorderStyle:FixedDialog;AutoValidate:EnableAllowFocusChange;
    AcceptButton:btnOk;CancelButton:btnCancel
    主窗口属性和值:
    AutoScaleMode:Font;Size:xxx,xxx;StartPosition:CenterScreen;MaximizeBox:False;SizeGripStyle:Hide;Name:frmMain;FormBorderStyle:Fixed3D;AutoValidate:EnableAllowFocusChange;
    AcceptButton:btnOk;CancelButton:btnCancel
    还有自定义的Text属性无关紧要,其它都是默认值。
    请帮我分析一下,谢谢了!最奇怪的是,我随便建立两个窗口,用ShowDialog方法,都不能奏效,和你的测试结果完全相反,实在是奇怪。

    麻烦周雪峰可不可以把你的测试例子打个压缩包给我,我想对比一下。谢谢!
    Em:friendyyjj@yahoo.com.cn

    2009年12月28日 16:42