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

这篇具有很好参考价值的文章主要介绍了C# winform窗体UI美化后实现最大化、最小化、还原、关闭、窗体移动等等-2023/1/11。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

实现最大化和还原

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

        /// <summary>
        /// 窗体 最大化,正常
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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方法

        /// <summary>
        /// 窗体 最大化,正常
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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个窗体

最小化

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

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

关闭

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

        /// <summary>
        /// 退出程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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函数文章来源地址https://www.toymoban.com/news/detail-478821.html

        //调用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);
        /// <summary>
        /// 窗体移动
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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);//发送左键点击的消息至该窗体(标题栏)
                }
            }
        }

到了这里,关于C# winform窗体UI美化后实现最大化、最小化、还原、关闭、窗体移动等等-2023/1/11的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt 自定义窗口的标题栏,重写鼠标事件实现,关闭隐藏,最大化/最小化,重写窗口事件函数,实现鼠标选中边框拉大拉小,双击标题栏切换窗口最大化和最小化

    Qt 自定义窗口的标题栏,重写鼠标事件实现,关闭隐藏,最大化/最小化,重写窗口事件函数,实现鼠标选中边框拉大拉小,双击标题栏切换窗口最大化和最小化 1、main.cpp 2、widget.h 3、widget.cpp 4、效果展示 5、完成

    2024年02月16日
    浏览(45)
  • ApeForms | WinForm窗体UI美化库(Metro扁平风格)演示与安装

    ApeForms 是一套基于WinForm框架免费的UI库,提供了丰富的Metro风格控件、针对WinForm开发中常见类型的扩展、通用Dialog/Notification的模板等。 目前 ApeForms 仍在持续开发扩充更多的控件,如果有好的建议可以在评论区留言。 通过NuGet可以直接将 ApeForms 引用到项目中。 演示视频 录制

    2024年01月18日
    浏览(32)
  • 【EI复现】梯级水光互补系统最大化可消纳电量期望短期优化调度模型(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 文献来源

    2024年02月13日
    浏览(38)
  • 【深度学习】什么是互信息最大化?

      在学习无监督学习时,最常用的loss就是最大化互信息。所以本文对互信息最大化做了一个总结。内容和图片多有参考其他资料,相关的文献一并在参考文献列出。(如果使用对比学习含有温度系数的那个损失函数可能会更简单一点) [1]什么是「互信息」? [2]DIM:通过最

    2024年02月13日
    浏览(38)
  • 【混合时变参数系统参数估计算法】使用范数总和正则化和期望最大化的混合时变参数系统参数估计算法(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 文献来

    2024年02月10日
    浏览(32)
  • Duilib中禁止一个窗口双击最大化

    用 duilib 开发了一个窗口,比如是登录窗口,那么这个窗口的窗口的双击最大化就毫无意义,甚至带来灾难,我们就要明确禁止这样的行为。 我们应该明确,一个窗口创建的时候就赋予了它一些属性,那我们就首先看看如何创建窗口的,即Create函数。 例如,你定义了一个窗口

    2024年02月12日
    浏览(30)
  • 如何使音频类app广告变现收益最大化

    要使音频类应用程序的广告变现收益最大化,可以采取以下策略: admaoyan猫眼聚合 精准定位受众: 了解你的用户群体,包括他们的兴趣、偏好和行为,以便向他们展示相关性更高的广告。使用用户数据分析工具,如Google Analytics或Firebase Analytics,以获取深入的洞察。 多样化

    2024年02月20日
    浏览(43)
  • MySQL | 深入了解如何最大化利用 MySQL 函数(一)

    前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL字符串函数和数学函数的讲解 ✨ 一、字符串函数 函数 作用 UPPER(列|字符串) 将字符串每个字符转为大写 LOWER(列|字符串) 将字符串每个字符转为小写 CONCAT(str1,str2,…) 将所有字符串连接成一个字符串 REPLACE(列|字符串,新字符

    2024年02月08日
    浏览(41)
  • Gvim显示行号、最大化、字号、主题等常用配置修改

    Gvim的设置分两种:1. 临时设置,2. 永久设置 ,本文只关注永久设置的情况。 配置Gvim只需修改Gvim配置文件即可, Linux中,配置文件的地址是~/.vimrc ,若没有该文件则创建即可,我们可以直接输入 gvim ~/.vimrc 来进行配置,windows中的配置文件地址在vim的安装地址下,文件名叫做

    2024年02月15日
    浏览(43)
  • 【元宇宙】区块链,元宇宙最大化的驱动力

    如今,一些观察者认为区块链是在结构上实现元宇宙的必要条件,而其他人则认为这种说法是荒谬的。人们对于区块链技术本身仍然有很多困惑,所以根本谈不上清楚地了解込块链技术与元宇宙的关系。所以,我们可以从区块链的定义开始介绍。 简侧言之,区块链是由一个去

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包