C# winform窗体UI美化后实现最大化、最小化、还原、关闭、窗体移动等等-2023/1/11

C# winform窗体UI美化后实现最大化、最小化、还原、关闭、窗体移动等等

在做winform窗体UI美化时,一般都需要将窗体的FormBorderStyle属性设为None,之后窗体就会没有最上面的标题栏,然后按照UI进行界面的设计。美化的代价就是窗体本来标题栏的相关操作,例如双击自动最大化,再次双击又恢复正常大小,以及上窗体关闭、最小化等功能就都需要自己实现对应的功能。

以自己做得项目为例,窗体的最上面一块就是类似或者需要实现标题栏功能的,用panel划定一个范围。之后所有的操作都是重写panel里面的方法。

实现最大化和还原

如果UI设计的是有按钮,那就最好。

        /// 
        /// 窗体 最大化,正常
        /// 
        /// 
        /// 
        private void btn_Max_Click(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Maximized)
            {
                this.WindowState = FormWindowState.Normal;
                Image maxbackImage = Resources.最大化;//这里图片调用UI设计的图片
                btn_Max.BackgroundImage = maxbackImage;
            }
            else
            {
                this.WindowState = FormWindowState.Maximized;
                Image normalbackImage = Resources.正常;
                btn_Max.BackgroundImage = normalbackImage ;
            }
        }

如果为了美观UI连按钮也没有设计,那就模仿标题栏自带的功能,重写panel的MouseDoubleClick方法

        /// 
        /// 窗体 最大化,正常
        /// 
        /// 
        /// 
        private void panel_top_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (this.WindowState == FormWindowState.Maximized)
            {
                this.WindowState = FormWindowState.Normal;
            }
            else
            {
                this.WindowState = FormWindowState.Maximized;
            }
        }

最大化过程中可能遇到的问题

最大化了之后把屏幕下方的任务栏遮挡了

这个需要在窗体load的进行一些设置,vs自带的会对一些属性进行文字说明,看过之后就知道这么设置的目的了。

            private void FormMain_Load(object sender, EventArgs e)
            {
                this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea;
                this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
            }

需要注意的是,vs还自带了属性窗口,如果你在窗体的属性窗口中已经设置它的WindowState为Maximized的话,那么再用上面的代码来设置就会失效。所以,使用上面的代码时,要把窗体属性中的WindowState设置为Normal才行。
到这里就应该可以解决绝大多数的需求了,但是在项目中,又遇到了拓展显示屏的情况(就是需要屏幕1一个窗体,同时屏幕2也需要生成一个窗体)。这个实现也可以记录一下。

            //第二个窗体
            _Form2 = new Form2();
            Screen[] screens = Screen.AllScreens;
            if (screens.Length > 1)
            {
                _Form2 .Location = new Point(screens[1].Bounds.Left, screens[1].Bounds.Top);
            }
            _Form2 .Show();

需要注意的是,如果屏幕2运行软件的话,按照上面的load设置,软件生成的2个窗体会同时生成在屏幕2,在屏幕1运行软件的话,则会正常生成1个屏幕1个窗体

最小化

同理上面最大化,有按钮设计最好,没有按钮设计的话,那就依据需求,自己判断以什么方式触发。

        /// 
        /// 窗体 最小化
        /// 
        /// 
        /// 
        private void btn_Min_Click(object sender, EventArgs e)
        {
			this.WindowState = FormWindowState.Minimized;
        }

关闭

这没啥好说的,肯定会有设计的。这里设计是一个图片。

        /// 
        /// 退出程序
        /// 
        /// 
        /// 
        private void pictureBox_quit_Click(object sender, EventArgs e)
        {
            DialogResult rst = MessageBox.Show(this, "确认系统?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (rst == DialogResult.Yes)
            {
                Application.ExitThread();
                Application.Exit();
            }
        }

窗体移动

这里可以利用window的api函数

        //调用API函数  需要添加引用using System.Runtime.InteropServices;
        [DllImport("user32.dll")]
        public static extern bool ReleaseCapture();

        [DllImport("user32.dll")]
        public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
        /// 
        /// 窗体移动
        /// 
        /// 
        /// 
        private void panel_top_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Clicks == 1)
            {
                //窗体移动默认鼠标左键
                if (e.Button == MouseButtons.Left)
                {
                    ReleaseCapture(); //释放鼠标捕捉
                    SendMessage(this.Handle, 0xA1, 0x02, 0);//发送左键点击的消息至该窗体(标题栏)
                }
            }
        }

你可能感兴趣的:(杂七杂八,ui,c#,开发语言)