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