关于在Winform里自定义控制栏边框

目录

关于自定义控制栏

使用用户控件

使用外部插件

实现自定义控制栏

创建 Window 窗体应用(.NET Framework) 项目(不演示操作过程)

更改窗体FormBorderStyle属性

添加自定义用户控件

ControlBar的代码逻辑如下:

Form1的代码逻辑如下:

ControlBar、Form1样式如下:

自定义控制栏效果


关于自定义控制栏

我们在编写Winform程序时,也许会发现窗体默认的样式不足以满足我们的功能需求,或者控制栏样式不够漂亮,那么我们可能会考虑自行编写一个控制栏控件,或者使用已有的外部插件来满足我们的需求。

(在这里,主要介绍使用自定义用户控件去实现控制栏)

使用用户控件

我们可以自定义一个控制栏控件,其功能均自己定义/制作,即可突破默认控制栏的些许限制。

使用外部插件

我们可以在  “拓展-管理拓展”  中看到“管理拓展”窗口,如图1

图1:“拓展-管理拓展”
图1:“拓展-管理拓展”

“管理拓展”窗口中,我们可以右上角的“搜索框”中搜索并找到我们需要的第三方窗口样式下载并使用。

由于作者本人也并没有使用过这些拓展,所以就不详细写出可以使用哪个拓展、该如何使用了。

但这里有一个Microsoft提供的相关链接可以提供参考。

查找、安装和管理 Visual Studio 的扩展icon-default.png?t=N7T8https://learn.microsoft.com/zh-cn/visualstudio/ide/finding-and-using-visual-studio-extensions?view=vs-2022#:~:text=%E6%AF%8F%E7%94%A8%E6%88%B7%E6%89%A9%E5%B1%95%E5%92%8C%E7%AE%A1%E7%90%86%E6%89%A9%E5%B1%95%201%20%E6%89%93%E5%BC%80%E6%89%A9%E5%B1%95%E9%80%89%E9%A1%B9%E9%A1%B5%EF%BC%88%E2%80%9C%E5%B7%A5%E5%85%B7%E2%80%9D%20%3E%E2%80%9C%E9%80%89%E9%A1%B9%E2%80%9D%20%3E%E2%80%9C%E7%8E%AF%E5%A2%83%E2%80%9D%20%3E%E2%80%9C%E6%89%A9%E5%B1%95%E2%80%9D%20%EF%BC%89%E3%80%82,2%20%E6%B8%85%E9%99%A4%E2%80%9C%E4%BB%A5%E7%AE%A1%E7%90%86%E5%91%98%E8%BA%AB%E4%BB%BD%E8%BF%90%E8%A1%8C%E6%97%B6%E5%8A%A0%E8%BD%BD%E6%AF%8F%E7%94%A8%E6%88%B7%E6%89%A9%E5%B1%95%E2%80%9D%E5%A4%8D%E9%80%89%E6%A1%86%20%E3%80%82%203%20%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%20Visual%20Studio%E3%80%82

实现自定义控制栏

创建 Window 窗体应用(.NET Framework) 项目(不演示操作过程)

在此之前,我已经新建了一个名为“demo”的解决方案,其中有一个名为“WindowFormsApp1”的“Windows 窗体应用(.NET Framework)”项目,以此项目来演示效果,并且可以看到该项目默认有一个名为“Form1”的窗体,他的样式是这样的,如图2

图2:“默认的窗口样式”
图2:“默认的窗口样式”

更改窗体FormBorderStyle属性

首先,我们肯定是不需要系统默认的样式的,因此我们就需要把窗体的“FormBorderStyle”属性改成“None”,如图3

图3:“把窗体的FormBorderStyle属性改为None”
图3:“把窗体的FormBorderStyle属性改为None”

这时候你会发现窗口变成了一个白块,已经没有了边框和控制栏,如图4

图4:“窗体属性FormBorderStyle:None的效果”
图4:“窗体属性FormBorderStyle:None的效果”

此时,如果你尝试启动项目,你会发现这个窗口无法被拖动,也没有了最小化/最大化/关闭按钮。

作为演示,我仅制作部分功能和样式,实现基础的功能。

添加自定义用户控件

“WindowsFormApp1”项目中右键选择“添加-用户控件(Windows 窗体)”,如图5

图5:“添加-用户控件(Windows 窗体)”
图5:“添加-用户控件(Windows 窗体)”

将其命名为“ControlBar”,并为其添加部分基础控件,并设置样式和布局,如图6

图6:“ControlBar控件的布局”
图6:“ControlBar控件的布局”

ControlBar用户控件(512*32):

        pictureBox_title,16*16

        label_title,

        button_setup,32*32

        button_min,32*32

        button_max,32*32

        button_close,32*32

ControlBar内的基础控件布局好后,可以为其导入合适的图片用作于按钮,且编写部分基础代码,用于储存基本数据和实现部分逻辑。

ControlBar的代码逻辑如下:

public partial class ControlBar : UserControl
    {
        public Form form { get; set; }//控件的窗体
        public Image imgButtonMax { get; set; } = new Bitmap(Properties.Resources.Maximize_16x16);//最大化图片
        public Image imgButtonMaxCancel { get; set; } = new Bitmap(Properties.Resources.MaximizeCancel_16x16);//取消最大化图片
        private bool isEnableWindowDrag { get; set; } = false;//是否启用窗口拖动
        private bool isEnableButtonMinimize { get; set; } = false;//是否启用最小化按钮
        private bool isEnableButtonMaximize { get; set; } = false;//是否启用最大化按钮
        private bool isEnableButtonClose { get; set; } = false;//是否启用关闭按钮
        public Point MousePoint { get; set; }

        public ControlBar()
        {
            InitializeComponent();
        }
        //启用控制栏
        public void EnableControlBar(Form form2)
        {
            form = form2;
            EnableControlDragWindow(true);//启用窗口拖动
            EnableButtonMinimizeClick(true);//启用最小化按钮
            EnableButtonMaximizeClick(true);//启用最大化按钮
            EnableButtonCloseClick(true);//启用关闭按钮
        }
        //启用控制栏
        public void EnableControlBar(Image image,string str,Form form2)
        {
            pictureBox_title.BackgroundImage = image;
            label_title.Text = str;
            form = form2;
            EnableControlDragWindow(true);//启用窗口拖动
            EnableButtonMinimizeClick(true);//启用最小化按钮
            EnableButtonMaximizeClick(true);//启用最大化按钮
            EnableButtonCloseClick(true);//启用关闭按钮
        }
        //================================================================窗口拖动
        //窗口拖动的条件
        private bool WindowDragCondition(MouseEventArgs mouseEventArgs)
        {
            return form.WindowState == FormWindowState.Normal && mouseEventArgs.Button == MouseButtons.Left;
        }
        //窗口拖动-鼠标摁下
        private void WindowDragMouseDownControl(object sender, MouseEventArgs e)
        {
            if (WindowDragCondition(e))
            {
                MousePoint = new Point(e.X, e.Y);
            }
        }
        //窗口拖动-鼠标松开
        private void WindowDragMouseMoveControl(object sender, MouseEventArgs e)
        {
            if (WindowDragCondition(e))
            {
                form.Location = new Point(form.Location.X + e.X - MousePoint.X, form.Location.Y + e.Y - MousePoint.Y);
            }
        }
        //是否启用控件拖动窗口
        public void EnableControlDragWindow(bool value)
        {
            if (isEnableWindowDrag != value)
            {
                if (value)
                {
                    this.MouseDown += new MouseEventHandler(WindowDragMouseDownControl);
                    this.MouseMove += new MouseEventHandler(WindowDragMouseMoveControl);
                }
                else
                {
                    this.MouseDown -= new MouseEventHandler(WindowDragMouseDownControl);
                    this.MouseMove -= new MouseEventHandler(WindowDragMouseMoveControl);
                }
                isEnableWindowDrag = value;
            }
        }
        //================================================================窗口最小化
        public void ButtonMinimizeClick(object sender, EventArgs e)
        {
            form.WindowState = FormWindowState.Minimized;
        }
        //是否启用最小化按钮
        public void EnableButtonMinimizeClick(bool value)
        {
            if (isEnableButtonMinimize != value)
            {
                if (value)
                {
                    button_min.Click += new EventHandler(ButtonMinimizeClick);
                }
                else
                {
                    button_min.Click -= new EventHandler(ButtonMinimizeClick);
                }
                isEnableButtonMinimize = value;
            }
        }
        //================================================================窗口最大化
        public void ButtonMaximizeClick(object sender, EventArgs e)
        {
            if (form.WindowState == FormWindowState.Maximized)
            {
                form.WindowState = FormWindowState.Normal;
                button_max.BackgroundImage = imgButtonMax;
            }
            else
            {
                form.WindowState = FormWindowState.Maximized;
                button_max.BackgroundImage = imgButtonMaxCancel;
            }
        }
        //是否启用最小化按钮
        public void EnableButtonMaximizeClick(bool value)
        {
            if (isEnableButtonMaximize != value)
            {
                if (value)
                {
                    button_max.Click += new EventHandler(ButtonMaximizeClick);
                }
                else
                {
                    button_max.Click -= new EventHandler(ButtonMaximizeClick);
                }
                isEnableButtonMaximize = value;
            }
        }
        //================================================================窗口关闭
        public void ButtonCloseClick(object sender, EventArgs e)
        {
            form.Close();
        }
        public void EnableButtonCloseClick(bool value)
        {
            if (isEnableButtonClose != value)
            {
                if (value)
                {
                    button_close.Click += new EventHandler(ButtonCloseClick);
                }
                else
                {
                    button_close.Click -= new EventHandler(ButtonCloseClick);
                }
                isEnableButtonClose = value;
            }
        }
    }

Form1的代码逻辑如下:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Image image = new Bitmap(Properties.Resources.Tian_32x32);
            string str = "演示标题";
            controlBar1.EnableControlBar(this);
            controlBar2.EnableControlBar(image,str,this);
        }
    }

ControlBar、Form1样式如下:

“ControlBar”样式
“ControlBar”样式
“Form1”样式
“Form1”样式

自定义控制栏效果

演示效果-拖动
演示效果-拖动

该演示中展示了,ControlBar控件拖动窗口的效果,另外还拥有最小化、最大化、向下还原、关闭窗口的基础功能。但有一个齿轮按钮作者并未写任何逻辑效果,主要目的仅是展示自定义控制栏的自由性,根据以上图片不难看出,其控制栏可以自定义若干个按钮、标题,图标,由你设计。

由于该文章仅是演示,其中ControlBar的很多控件布局是写死的。你可以根据你的所需,设计动态的布局,甚至是变化多端的布局。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Winform中绘制自定义角度椭圆,可以利用C#语言中的System.Drawing命名空间中的Graphics类的方法来实现。首先,我们可以在Winform窗体的Paint事件中编写绘制椭圆的代码。在该事件中,我们可以创建一个Graphics对象,并通过其方法来绘制自定义角度的椭圆。 首先,我们可以创建一个Pen对象,用于定义绘制椭圆的边框颜色和宽度。然后,我们可以创建一个Rectangle对象,用于定义椭圆的位置和大小。接下来,我们可以使用Graphics对象的DrawEllipse方法来绘制椭圆,其中可以通过指定角度来绘制自定义角度椭圆。 例如,我们可以通过Graphics对象的RotateTransform方法来实现对椭圆进行旋转,从而绘制自定义角度的椭圆。通过指定旋转角度和旋转点的坐标,我们可以实现对椭圆的旋转,从而实现自定义角度的绘制。 另外,我们也可以通过Graphics对象的TranslateTransform方法来实现对椭圆的平移,从而调整椭圆的位置。通过指定平移的距离和方向,我们可以实现对椭圆的位置调整,从而实现自定义角度的绘制。 综上所述,通过在Winform的Paint事件中利用C#语言中的System.Drawing命名空间中的Graphics类的方法,我们可以实现绘制自定义角度椭圆的功能。利用旋转和平移等方式,我们可以实现对椭圆的角度和位置的自定义调整,从而实现自定义角度椭圆的绘制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值