Fork me on GitHub

Bunifu UI 的学习 ——C# Bunifu UI 窗体重建,无边框窗体大小调整

在网上看到一个winform的组件库,Bunifu UI,这个组件库可以实现一些特别美观的程序,包括了一些渐变之类的

就通过学习的方式来做一些学习笔记

本次案例实现两个功能,一个是创建一个应用程序的标题栏,另一个是创建Form的大小的拖拽

当然中间有些代码还是参照了网上的一些资源。

首先创建一个windows应用程序。

在默认的Form上添加两个Bunifu组件 

BunifuElipse 和 BunifuDragControl
第一个组件是用于方便的创建出一个无边框的Form,他会默认的把标题栏和边框给隐藏掉。
第二个组件是用于拖动窗体,因为标题栏已经隐藏,所以需要创建一个对应的可以拖动整个窗体的区域,具体的操作在后续会提现出来。

然后在窗体上添加一个Panel 命名为MainPanel 把 MainPanel 的DOCK设置为Fill 作为窗体的主框架
然后在添加一个Panel 命名为TopPanel 把 TopPanel d DOCK 设置为Top 作为程序的标题栏的容器,需要把 TopPanel 的高度调整为 40 (这个大小可以按照自己的需求设置)

第三步就是在 TopPanel 上添加一个 BunifuGradientPanel 命名为 FormTop 组件 BunifuGradientPanel 的Dock 设置为Fill ,

 

 

 

然后把BunifuGradientPanel的以下属性按照上述设置完成设置以后就出现了一个又渐变的Form标题栏

第四部 添加三个  BunifuFlatButton 按钮分别为 最小化,最大化 和关闭按钮

大小和位置就自己调整,我这边调整完以后就是这个样子的

 

 这三个按钮的后台代码:

复制代码
private void BtnExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void BtnMax_Click(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Maximized)
            {
                this.WindowState = FormWindowState.Normal;

            }
            else
            {
                this.WindowState = FormWindowState.Maximized;
            }

            

        }

        private void BtnMin_Click(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
        }
复制代码

就可以实现对窗体的最小化,做大化,关闭功能。

第五步,实现窗体的拖拽

窗体拖拽就是要bunifuDragControl1设置对应的组件,我们这里设置的组件为 FormTop 即可。

第六步 实现通过鼠标实现窗体大小的调整

在MainPanel上添加一个新的Panel 命名为 ContainerPanel 然后把 ContainerPanel 的DOCK 修改为FIll

给 ContainerPanel 添加三个事件   ContainerPanel_MouseDown  ContainerPanel_MouseUp  ContainerPanel_MouseMove

通过一下代码实现功能:

复制代码
private void ContainerPanel_MouseDown(object sender, MouseEventArgs e)
        {
            isMouseDown = true;
        }

        private void ContainerPanel_MouseUp(object sender, MouseEventArgs e)
        {
            isMouseDown = false;
            direction = MouseDirection.None;
        }

        private void ContainerPanel_MouseMove(object sender, MouseEventArgs e)
        {
            //鼠标移动过程中,坐标时刻在改变 
            //当鼠标移动时横坐标距离窗体右边缘5像素以内且纵坐标距离下边缘也在5像素以内时,要将光标变为倾斜的箭头形状,同时拖拽方向direction置为MouseDirection.Declining 
            int x = e.Location.X;
            int y = e.Location.Y;
            int x1 = this.Width;
            int y1 = this.Width;

            if (e.Location.X >= this.ContainerPanel.Width - 10 && e.Location.Y > this.ContainerPanel.Height - 10)
            {
                this.Cursor = Cursors.SizeNWSE;
                direction = MouseDirection.Declining;
                ResizeWindow();
            }
            //当鼠标移动时横坐标距离窗体右边缘5像素以内时,要将光标变为倾斜的箭头形状,同时拖拽方向direction置为MouseDirection.Herizontal
            else if (e.Location.X >= this.ContainerPanel.Width - 10)
            {
                this.Cursor = Cursors.SizeWE;
                direction = MouseDirection.Herizontal;
                ResizeWindow();
            }
            //同理当鼠标移动时纵坐标距离窗体下边缘5像素以内时,要将光标变为倾斜的箭头形状,同时拖拽方向direction置为MouseDirection.Vertical
            else if (e.Location.Y >= this.ContainerPanel.Height - 10)
            {
                this.Cursor = Cursors.SizeNS;
                direction = MouseDirection.Vertical;
                ResizeWindow();
            }
            //否则,以外的窗体区域,鼠标星座均为单向箭头(默认)
            else
                this.Cursor = Cursors.Arrow;

            //设定好方向后,调用下面方法,改变窗体大小  
            //ResizeWindow();
        }

private void ResizeWindow()
        {
            //这个判断很重要,只有在鼠标按下时才能拖拽改变窗体大小,如果不作判断,那么鼠标弹起和按下时,窗体都可以改变 
            if (!isMouseDown) return;



            //MousePosition的参考点是屏幕的左上角,表示鼠标当前相对于屏幕左上角的坐标this.left和this.top的参考点也是屏幕,属性MousePosition是该程序的重点
            if (direction == MouseDirection.Declining)
            {
                //此行代码在mousemove事件中已经写过,在此再写一遍,并不多余,一定要写
                this.Cursor = Cursors.SizeNWSE;
                //下面是改变窗体宽和高的代码,不明白的可以仔细思考一下
                this.Width = MousePosition.X - this.Left;
                this.Height = MousePosition.Y - this.Top;
            }

            if (direction == MouseDirection.Herizontal)
            {
                this.Cursor = Cursors.SizeWE;
                this.Width = MousePosition.X - this.Left;
            }
            else if (direction == MouseDirection.Vertical)
            {
                this.Cursor = Cursors.SizeNS;
                this.Height = MousePosition.Y - this.Top;
            }
            //即使鼠标按下,但是不在窗口右和下边缘,那么也不能改变窗口大小
            else
            {
                this.Cursor = Cursors.Arrow;
            }

        }
复制代码

另外还需要添加一个enum 

 public enum MouseDirection
    {
        Herizontal,//水平方向拖动,只改变窗体的宽度
        Vertical,//垂直方向拖动,只改变窗体的高度
        Declining,//倾斜方向,同时改变窗体的宽度和高度
        None//不做标志,即不拖动窗体改变大小
    }

 

到此为止就实现的对窗体创建的过程结果如下:

 

 

可以通过拖动窗体标题移动,也可以在右侧、下侧和右下侧拖动的方式实现窗体大小的调整

 

 



posted @   太阳出来遇到大海  阅读(2578)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示