winform 无边框窗口 可改变窗体大小

最近项目需要做一个无边框的悬浮窗,在网上搜索相关资料,大多都需要引入别的库,或者语焉不详或者代码不能运行。本文参考了以下文章实现改变窗体大小,原文代码直接使用会出现些状况,比如说,往外拖动就再也不能往回拖动,等。因此使用本人修改过后的代码,记录到博客,方便日后查询。

参考文章


1.无边框

FormBroderStyle 的值设置为 None,即可去掉边框。




2.改变窗体大小

这一步需要通过代码来实现

导入相关包

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

做一个结构体

 //定义一个枚举,表示拖动方向

public enum MouseDirection {  

Herizontal,//水平方向拖动,只改变窗体的宽度  

Vertical,//垂直方向拖动,只改变窗体的高度  

Declining,//倾斜方向,同时改变窗体的宽度和高度

None//不做标志,即不拖动窗体改变大小 }


设置全局变量

        bool isMouseDown = false; //表示鼠标当前是否处于按下状态,初始值为否 
        MouseDirection direction = MouseDirection.None;//表示拖动的方向,起始为None,表示不拖动
	Point mouseOff;//鼠标移动位置变量  

鼠标按下事件

  private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
          mouseOff = new Point(-e.X, -e.Y); //记录鼠标位置
	    //当鼠标的位置处于边缘时,允许进行改变大小。
           
            if (e.Location.X >= this.Width - 10 && e.Location.Y > this.Height - 10)
            {
                isMouseDown = true;
            }
            else if (e.Location.X >= this.Width - 5)
            {
                isMouseDown = true;
            }
            else if (e.Location.Y >= this.Height - 5)
            {
                isMouseDown = true;
            }
            else
            {
                this.Cursor = Cursors.Arrow;//改变鼠标样式为原样
                isMouseDown = false;
                SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);//鼠标移动事件
            }
        }

鼠标松开事件

 private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            Console.WriteLine("松开鼠标");
            isMouseDown = false;
            direction = MouseDirection.None;
            if (isDown)
                isDown = false;
        }

鼠标移动事件

  private void Form1_MouseMove(object sender, MouseEventArgs e)
        {    
             //鼠标移动到边缘,改变鼠标的图标
            if (e.Location.X >= this.Width - 5)
            {
                this.Cursor = Cursors.SizeWE;
                direction = MouseDirection.Herizontal;
            }
            else if (e.Location.Y >= this.Height - 5)
            {
                this.Cursor = Cursors.SizeNS;
                direction = MouseDirection.Vertical;
            }
            //否则,以外的窗体区域,鼠标星座均为单向箭头(默认)             
            else
            {
                this.Cursor = Cursors.Arrow;

            }
            if (e.Location.X >= (this.Width + this.Left + 10) || (e.Location.Y > this.Height + this.Top + 10))
            {
                isMouseDown = false;
            }

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

改变窗体大小

private void ResizeWindow()
        {
            
            if (!isMouseDown)
                return;
            
            if (direction == MouseDirection.Herizontal)
            {
                this.Cursor = Cursors.SizeWE;
                this.Width = MousePosition.X - this.Left + 5;//改变宽度
            }
            else if (direction == MouseDirection.Vertical)
            {
                this.Cursor = Cursors.SizeNS;
                this.Height = MousePosition.Y - this.Top + 5;//改变高度
            }
            //鼠标不在窗口右和下边缘,把鼠标打回原型
            else
            {
                this.Cursor = Cursors.Arrow;
                isMouseDown = false;
            }
        }




以上。





  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值