c#: 模态窗口最小化主窗口

起源:

产品中,通常有些耗时操作比如视频转换、DVD刻录等,在模态窗口中执行。此时最小化它,主窗体不能跟着最小化,影响操作体验。

如何让主窗体最小化,并且可以还原呢?搜索一番,未找到满意结果,自己动手吧!

 

1、改造Program.cs文件

其目的即以MainForm静态属性记录程序主窗体以为它用。

    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            MainForm = new MainForm();
            Application.Run(MainForm);
        }

        public static MainForm MainForm
        {
            get;
            set;
        }
    }

 

2、改写Modal窗体SizeChanged事件

在OnSizeChanged事件中处理FormWindowState.Minimized信号,最小化主窗体

    public partial class TestForm : Form
    {
        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
        [DllImport("User32.dll")]
        public static extern int SetWindowPos(IntPtr hwnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
        //ShowWindow参数   
        private const int SW_SHOWMINIMIZED = 2;
        private const int SWP_SHOWWINDOW = 0x40;

        public TestForm()
        {
            InitializeComponent();
            this.ShowInTaskbar = false;
        }

        protected override void OnSizeChanged(EventArgs e)
        {
            base.OnSizeChanged(e);

            if (this.WindowState == FormWindowState.Minimized)
            {
                ShowWindow(Program.MainForm.Handle, SW_SHOWMINIMIZED);
                this.Visible = true;
                //移到屏幕外面,模拟最小化效果
                SetWindowPos(this.Handle, IntPtr.Zero, Program.MainForm.Left, Program.MainForm.Top, 0, 0, SWP_SHOWWINDOW);
                //Trace.WriteLine(string.Format("x: {0}, y: {1}", Program.MainForm.Left, Program.MainForm.Top));
            }
        }
    }

或直接用Owner做控制。如果其Owner为主窗体,这样就不需第1步设置MainForm属性记录:

        protected override void OnSizeChanged(EventArgs e)
        {
            base.OnSizeChanged(e);

            if (this.WindowState == FormWindowState.Minimized)
            {
                var owner = this.Owner;
                if (owner != null)
                {
                    ShowWindow(owner.Handle, SW_SHOWMINIMIZED);
                    this.Visible = true;
                    //移到屏幕外面,模拟最小化效果
                    SetWindowPos(this.Handle, IntPtr.Zero, owner.Left, owner.Top, 0, 0, SWP_SHOWWINDOW);
                    //Trace.WriteLine(string.Format("x: {0}, y: {1}", Program.MainForm.Left, Program.MainForm.Top));
                }
            }
        }

 

3、主窗体调用

        using (var form = new TestForm())
        {
            form.ShowDialog(this);
        }

 

显示效果如图:

转载于:https://www.cnblogs.com/crwy/p/9707648.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值