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//不做標志,即不拖動窗體改變大小
    }

 

到此為止就實現的對窗體創建的過程結果如下:

 

 

可以通過拖動窗體標題移動,也可以在右側、下側和右下側拖動的方式實現窗體大小的調整

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM