博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#: 模态窗口最小化主窗口
阅读量:4471 次
发布时间:2019-06-08

本文共 2617 字,大约阅读时间需要 8 分钟。

起源:

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

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

 

1、改造Program.cs文件

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

static class Program    {        ///         /// 应用程序的主入口点。        ///         [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

你可能感兴趣的文章
vue 小记
查看>>
CURRICULUM VITAE
查看>>
Groovy 程序结构
查看>>
使用 WordPress 的导航菜单
查看>>
input只能输入数字和小数点,并且只能保留小数点后两位 - CSDN博客
查看>>
js 不固定传参
查看>>
远程调试UWP遇到新错误Could not generate the root folder for app package ......
查看>>
[倍增][最短路-Floyd][dp]
查看>>
SpringAOP用到了什么代理,以及动态代理与静态代理的区别
查看>>
利用STM32CubeMX来生成USB_HID_Mouse工程【添加ADC】(1)
查看>>
【leetcode】Populating Next Right Pointers in Each Node
查看>>
获取请求参数乱码的问题
查看>>
代码实现:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称...
查看>>
Android客户端测试点
查看>>
Jquery:怎样让子窗体的div显示在父窗体之上
查看>>
01概率
查看>>
Shell脚本
查看>>
MatLab Load cv::Mat 导入数据
查看>>
html+css相关笔记(一)
查看>>
基于块流协议保证音频优先发送
查看>>