C# 设置窗体最大化,以及窗体最大化时的坐标

文章讲述了如何在WindowsForm的WndProc方法中处理WM_GETMINMAXINFO消息,以控制窗口的最大化、最小化状态,并利用屏幕工作区信息调整窗口大小。开发者展示了如何获取屏幕工作区、屏幕总大小以及如何根据用户操作改变窗口状态。
摘要由CSDN通过智能技术生成

reference:

https://www.cnblogs.com/adandelion/archive/2008/04/03/1136198.html

        protected override void WndProc(ref Message m)
        {            
            if (m.Msg == (int)WM.WM_GETMINMAXINFO)
            {
                MINMAXINFO mmi = (MINMAXINFO)m.GetLParam(typeof(MINMAXINFO));
                //mmi.ptMinTrackSize.x = this.MinimumSize.Width;
                //mmi.ptMinTrackSize.y = this.MinimumSize.Height;
                //if (this.MaximumSize.Width != 0 || this.MaximumSize.Height != 0)
                //{
                //    mmi.ptMaxTrackSize.x = this.MaximumSize.Width;
                //    mmi.ptMaxTrackSize.y = this.MaximumSize.Height;
                //}
                mmi.ptMaxPosition.x = _location.X;
                mmi.ptMaxPosition.y = _location.Y;

                System.Runtime.InteropServices.Marshal.StructureToPtr(mmi, m.LParam, true);
            }

            base.WndProc(ref m);
        }
        
        private void _UpdateMaxSizeInfo()
        {
            try
            {               
                // 获取当前窗体所在的屏幕
                Screen screen = Screen.FromControl(this);
                // 获取屏幕的工作区大小(排除了任务栏和停靠窗口的空间)
                Rectangle workingArea = screen.WorkingArea;
                //MessageBox.Show($"工作区大小: 宽度={workingArea.Width}, 高度={workingArea.Height}");
                // 获取整个屏幕的大小
                //Rectangle bounds = screen.Bounds;
                //MessageBox.Show($"屏幕总大小: 宽度={bounds.Width}, 高度={bounds.Height}");

                var x = workingArea.Location.X + index * workingArea.Width / count;
                x = index * workingArea.Width / count;
                _location =  new Point(x, 0);
                this.MaximumSize = new Size(workingArea.Width/count, workingArea.Height);
            }
            catch (Exception ex)
            {
                ex.ToErrorObject().Show();                
            }                     
        }
        private void BarControl_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if(this.WindowState==FormWindowState.Maximized)
            {
                this.WindowState = FormWindowState.Normal;
            }
            else
            {
                _UpdateMaxSizeInfo();
                this.WindowState = FormWindowState.Maximized;
            }
        }              

注意WndProc中在处理WM_GETMINMAXINFO后,可以继续运行 base.WndProc(ref m)
不会影响,可能系统默认不修改其中的内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值