WinForm无边框窗体:纯代码绘制标题栏及其控件,窗体四周阴影,可拖拽。可直接继承使用。

说明:

因WinForm本身的窗体界面太过传统,需要自定义标题栏部分时,又因修改难度较大或始终有点不理想,基于对于C#的热爱,只好选择动手纯代码绘制,所以记录了此文章,以作备用。

原理:

通过设置原窗体属性为无边框属性,再通过OnPaint绘制标题栏部分(实则是在客户区绘制一个模拟标题栏)并实现其基本功能。

新增属性:

CaptionColor:标题栏的背景色。默认颜色:WhiteSmoke。

ShowCaption:是否显示窗体标题栏及其控件。默认值:true。

CaptionHeight:标题栏的高度。默认值:50。

ShowCaptionLine:是否显示标题栏与客户区的分界线。默认值:false。

CloseMode:关闭窗体时执行的操作。Exit退出程序,HideToNotify隐藏到通知栏。默认值:Exit。

NotifyIcon:当程序需要在通知栏显示图标时,通知栏显示的图标。默认值:窗体图标。

NotifyMenuStrip:当程序需要在通知栏显示图标时,鼠标右键点击通知栏图标后显示的菜单项。默认值:空。

NotifyVisible:指示程序的通知栏图标无论是否窗口关闭都显示。默认值:false。

窗体截图:

1、当ShowCaption属性值为FALSE时,窗体为一个不含任何控件的四周阴影、可拖拽窗体。此时鼠标在窗体内任何部位按下均可进行窗体的拖拽操作。

 2、当ShowCaption属性值为TRUE时,窗体为一个包含标题栏的四周阴影、可拖拽窗体。此时鼠标仅在标题栏范围内按下才可进行窗体的拖拽操作。

 3、当窗体的MaximizeBox属性值为FALSE时,窗体的大小是不可调整的。

源代码:

namespace DotNetFramework.WinForm.Forms
{
    public class Form : System.Windows.Forms.Form
    {
        #region 属性
        private readonly System.Windows.Forms.NotifyIcon NotifyIconMain = new System.Windows.Forms.NotifyIcon();

        /// <summary>
        /// 初始化部分
        /// </summary>
        private void InitializeComponent()
        {
            SuspendLayout();
            BackColor = System.Drawing.Color.White;
            ClientSize = new System.Drawing.Size(800, 450);
            ControlBox = false;
            Font = new System.Drawing.Font("Microsoft Yahei UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134);
            FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            Name = "Form";
            StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            Resize += new System.EventHandler(Form_Resize);
            ResumeLayout(false);

            NotifyIconMain.MouseClick += new System.Windows.Forms.MouseEventHandler(NotifyIconMain_MouseClick);
        }

        private System.Drawing.Color captionColor = System.Drawing.Color.WhiteSmoke;
        [System.ComponentModel.Category("Appearance"), System.ComponentModel.Description("标题栏的背景色。")]
        public System.Drawing.Color CaptionColor
        {
            get => captionColor;
            set
            {
                captionColor = value;
                Invalidate();
            }
        }

        private bool showCaption = true;
        [System.ComponentModel.Category("Appearance"), System.ComponentModel.Description("是否显示窗体标题栏及其控件。"), System.ComponentModel.DefaultValue(true)]
        public bool ShowCaption
        {
            get => showCaption;
            set
            {
                showCaption = value;
                Invalidate();
            }
        }

        private int captionHeight = 50;
        [System.ComponentModel.Category("Appearance"), System.ComponentModel.Description("标题栏的高度。"), System.ComponentModel.DefaultValue(50)]
        public int CaptionHeight
        {
            get => captionHeight;
            set
            {
                captionHeight = value;
                Invalidate();
            }
        }

        private bool showCaptionLine = false;
        [System.ComponentModel.Category("Appearance"), System.ComponentModel.Description("是否显示标题栏与客户区的分界线。"), System.ComponentModel.DefaultValue(false)]
        public bool ShowCaptionLine
        {
            get => showCaptionLine;
            set
            {
                showCaptionLine = value;
                Invalidate();
            }
        }

        private bool maximizeBox = true;
        [System.ComponentModel.Category("WindowStyle"), System.ComponentModel.Description("确定窗体标题栏的右上角是否有最大化框。"), System.ComponentModel.DefaultValue(true)]
        public new bool MaximizeBox
        {
            get => maximizeBox;
            set
            {
                maximizeBox = value;
                Invalidate();
            }
        }

        private bool minimizeBox = true;
        [System.ComponentModel.Category("WindowStyle"), System.ComponentModel.Description("确定窗体标题栏的右上角是否有最小化框。"), System.ComponentModel.DefaultValue(true)]
        public new bool MinimizeBox
        {
            get => minimizeBox;
            set
            {
                minimizeBox = value;
                Invalidate();
            }
        }

        /// <summary>
        /// 关闭窗体时执行的操作
        /// </summary>
        public enum CloseModes
        {
            /// <summary>
            /// 退出程序
            /// </summary>
            Exit,
            /// <summary>
            /// 隐藏到通知栏
            /// </summary>
            HideToNotify
        }

        [System.ComponentModel.Category("Behavior"), System.ComponentModel.Description("关闭窗体时执行的操作。Exit退出程序,HideToNotify隐藏到通知栏。")]
        public CloseModes CloseMode { get; set; } = CloseModes.Exit;

        /// <summary>
        /// 窗体最大化模式
        /// </summary>
        public enum MaximumSizeModes
        {
            /// <summary>
            /// 默认
            /// </summary>
            Default,
            /// <summary>
            /// 覆盖任务栏
            /// </summary>
            CoverTaskbar,
            /// <summary>
            /// 不覆盖任务栏
            /// </summary>
            UnCoverTaskbar
        }

        private MaximumSizeModes maximumSizeMode = MaximumSizeModes.Default;
        [System.ComponentModel.Category("Behavior"), System.ComponentModel.Description("最大化模式。")]
        public MaximumSizeModes MaximumSizeMode
        {
            get => maximumSizeMode;
            set
            {
                maximumSizeMode = value;
                MaximumSizeModeChanged();
            }
        }

        private System.Drawing.Icon notifyIcon = null;
        [System.ComponentModel.Category("Behavior"), System.ComponentModel.Description("当程序需要在通知栏显示图标时,通知栏显示的图标。")]
        public System.Drawing.Icon NotifyIcon
        {
            get => notifyIcon ?? Icon;
            set => NotifyIconMain.Icon = notifyIcon = value;
        }

        private System.Windows.Forms.ContextMenuStrip notifyMenuStrip = null;
        [System.ComponentModel.Category("Behavior"), System.ComponentModel.Description("当程序需要在通知栏显示图标时,鼠标右键点击通知栏图标后显示的菜单项。")]
        public System.Windows.Forms.ContextMenuStrip NotifyMenuStrip
        {
            get =>
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值