在winform项目开发中,偶尔需要用到边框拖拽。度娘也没找到相关的轮子(可能是我不配,没推给我)。只能自己造一个

上效果图(鼠标没录制上,问题不大)

上代码

  private void Form1_Load(object sender, EventArgs e)
{//使用方式
panelLeft.SetContorlMove(this, ContorlMove.Left);
panelRight.SetContorlMove(this, ContorlMove.Right);
panelTop.SetContorlMove(this, ContorlMove.Top);
panelDown.SetContorlMove(this, ContorlMove.Down);
dataGridView1.SetContorlMove(this, ContorlMove.All);
}

  

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace MoveControlBorder
{
public static class ContorlExt
{
#region 设置控件拖大拖小
public static void SetContorlMove(this DataGridView con, Form form, ContorlMove moveEnum, Size? maxSize = null, Size? minSize = null)
{
new SetContorlMove(con, form, moveEnum, maxSize, minSize);
}
public static void SetContorlMove(this Panel con, Form form, ContorlMove moveEnum, Size? maxSize = null, Size? minSize = null)
{
new SetContorlMove(con, form, moveEnum, maxSize, minSize);
}
#endregion
}
public enum ContorlMove
{
/// <summary>
/// 左边可以拉动宽度调整
/// </summary>
Left,
/// <summary>
/// 右边可以拉动宽度调整
/// </summary>
Right,
/// <summary>
/// 上边框可以拉动高度调整
/// </summary>
Top,
/// <summary>
/// 下边框可以拉动高度调整
/// </summary>
Down,
/// <summary>
/// 四个边都可以调整
/// </summary>
All
/// <summary>
/// 左上斜角
/// </summary>
//LeftTop,
//LeftDown,
//RightTop,
//RightDown
}
public class SetContorlMove
{
private Control CON;
private Form FORM;
private ContorlMove MOVEENUM;
private Size MaxSize;
private Size MinSize;
private bool IsAll = false;
public SetContorlMove(Control _con, Form _form, ContorlMove _moveEnum, Size? _maxSize, Size? _minSize)
{
CON = _con;
FORM = _form;
MOVEENUM = _moveEnum;
if (_moveEnum==ContorlMove.All)
{
IsAll = true;
}
if (_maxSize != null)
{
MaxSize = (Size)_maxSize;
}
else
{
MaxSize = new Size()
{
Height = 1000,
Width = 1000
};
}
if (_minSize != null)
{
MinSize = (Size)_minSize;
}
else
{
MinSize = new Size() { Height = 100, Width = 100 };
}
_con.MouseDown += new System.Windows.Forms.MouseEventHandler(MouseDown);
_con.MouseLeave += new System.EventHandler(MouseLeave);
_con.MouseMove += new System.Windows.Forms.MouseEventHandler(MouseMove);
_con.MouseUp += new System.Windows.Forms.MouseEventHandler(MouseUp);
}
private void MouseUp(object sender, MouseEventArgs e)
{
if (IsAll)
{
MOVEENUM = ContorlMove.All; Now_MOVEENUM = ContorlMove.All;
}
moveflag = false;
CON.Cursor = Cursors.Default;
}
bool moveflag = false;
ContorlMove Now_MOVEENUM = ContorlMove.All;
private void MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && (CON.Cursor == Cursors.SizeWE || CON.Cursor == Cursors.SizeNS))
{
if(MOVEENUM== ContorlMove.All)//判定当前按下了哪个的边
{
Point ms = Control.MousePosition;
Point p;
p = FORM.PointToScreen(new Point(CON.Location.X, CON.Location.Y));
if (ms.X > p.X - 5 && ms.X < p.X + 5)//left
{
if (ms.Y >= p.Y)
{
Now_MOVEENUM = ContorlMove.Left;
}
}
else if (ms.Y > p.Y - 5 && ms.Y < p.Y + 5)//top
{
if (ms.X >= p.X)
{
Now_MOVEENUM = ContorlMove.Top;
}
}
p = FORM.PointToScreen(new Point(CON.Location.X + CON.Width, CON.Location.Y));
if (ms.X > p.X - 5 && ms.X < p.X + 5)//right
{
if (ms.Y >= p.Y)
{
Now_MOVEENUM = ContorlMove.Right;
}
}
p = FORM.PointToScreen(new Point(CON.Location.X, CON.Location.Y + CON.Height)); if (ms.Y > p.Y - 5 && ms.Y < p.Y + 5)//down
{
if (ms.X >= p.X)
{
Now_MOVEENUM = ContorlMove.Down;
}
} } this.moveflag = true;
}
}
private void MouseMove(object sender, MouseEventArgs e)
{
Point ms = Control.MousePosition;
bool b = false;
Point p;
switch (MOVEENUM)
{
case ContorlMove.Left:
p = FORM.PointToScreen(new Point(CON.Location.X, CON.Location.Y));
if (ms.X > p.X - 5 && ms.X < p.X + 5)
{
if (ms.Y >= p.Y)
{
b = true;
CON.Cursor = Cursors.SizeWE;
}
}
break;
case ContorlMove.Right:
p = FORM.PointToScreen(new Point(CON.Location.X + CON.Width, CON.Location.Y));
if (ms.X > p.X - 5 && ms.X < p.X + 5)
{
if (ms.Y >= p.Y)
{
b = true;
CON.Cursor = Cursors.SizeWE;
}
}
break;
case ContorlMove.Top:
p = FORM.PointToScreen(new Point(CON.Location.X, CON.Location.Y)); if (ms.Y > p.Y - 5 && ms.Y < p.Y + 5)
{
if (ms.X >= p.X)
{
b = true;
CON.Cursor = Cursors.SizeNS;
}
}
break;
case ContorlMove.Down:
p = FORM.PointToScreen(new Point(CON.Location.X, CON.Location.Y + CON.Height)); if (ms.Y > p.Y - 5 && ms.Y < p.Y + 5)
{
if (ms.X >= p.X)
{
b = true;
CON.Cursor = Cursors.SizeNS;
}
}
break; case ContorlMove.All://设置鼠标
p = FORM.PointToScreen(new Point(CON.Location.X, CON.Location.Y));
if (ms.X > p.X - 5 && ms.X < p.X + 5)//left
{
if (ms.Y >= p.Y)
{
b = true;
CON.Cursor = Cursors.SizeWE;
break;
}
}
else if (ms.Y > p.Y - 5 && ms.Y < p.Y + 5)//top
{
if (ms.X >= p.X)
{
b = true;
CON.Cursor = Cursors.SizeNS;
break;
}
}
p = FORM.PointToScreen(new Point(CON.Location.X + CON.Width, CON.Location.Y));
if (ms.X > p.X - 5 && ms.X < p.X + 5)//right
{
if (ms.Y >= p.Y)
{
b = true;
CON.Cursor = Cursors.SizeWE;
break;
}
}
p = FORM.PointToScreen(new Point(CON.Location.X, CON.Location.Y + CON.Height)); if (ms.Y > p.Y - 5 && ms.Y < p.Y + 5)//down
{
if (ms.X >= p.X)
{
b = true;
CON.Cursor = Cursors.SizeNS; break;
}
}
break;
default:
break;
} if (!b && e.Button == MouseButtons.None)
{
CON.Cursor = Cursors.Default;
} if (e.Button == MouseButtons.Left && moveflag)
{
if (Now_MOVEENUM!=ContorlMove.All)
{
MOVEENUM = Now_MOVEENUM;
}
switch (MOVEENUM)
{
case ContorlMove.Left:
if (CON.Width + -e.X > MinSize.Width && CON.Width + -e.X < MaxSize.Width)
{
InvokeInt(WH.Width, -e.X);//修改宽度
}
break;
case ContorlMove.Right:
if (e.X > MinSize.Width && e.X < MaxSize.Width)
{
InvokeInt(WH.Width, e.X);//修改宽度
}
break;
case ContorlMove.Top:
if (CON.Height + -e.Y > MinSize.Height && CON.Width + -e.Y < MaxSize.Height)
{
InvokeInt(WH.Height, -e.Y);
}
break;
case ContorlMove.Down:
if (e.Y > MinSize.Height && e.Y < MaxSize.Height)
{
InvokeInt(WH.Height, e.Y);
}
break;
default:
break;
} }
}
private enum WH
{
Width,
Height
} private void InvokeInt(WH wh, int val)
{
if (CON.InvokeRequired)
{
Action<int> actionDelegate = (v) =>
{
switch (wh)
{
case WH.Width:
if (MOVEENUM == ContorlMove.Right)
{
CON.Width = v;
}
else
{
CON.Width += v;
CON.Location = new Point(CON.Location.X - v, CON.Location.Y); }
break;
case WH.Height:
if (MOVEENUM == ContorlMove.Down)
{
CON.Height = v;
}
else
{
CON.Height += v;
CON.Location = new Point(CON.Location.X, CON.Location.Y - v);
}
break;
default:
break;
}
};
CON.BeginInvoke(actionDelegate, val); //BeginInvoke方法是异步的, 它会另起一个子线程去完成工作线程
}
else
{
switch (wh)
{
case WH.Width:
if (MOVEENUM == ContorlMove.Right)
{
CON.Width = val;
}
else
{
CON.Width += val;
CON.Location = new Point(CON.Location.X - val, CON.Location.Y);
}
break;
case WH.Height:
if (MOVEENUM == ContorlMove.Down)
{
CON.Height = val;
}
else
{
CON.Height += val; CON.Location = new Point(CON.Location.X, CON.Location.Y - val); }
break;
default:
break;
}
}
}
private void MouseLeave(object sender, EventArgs e)
{
if (CON.Cursor == Cursors.SizeWE || CON.Cursor == Cursors.SizeNS)
{
CON.Cursor = Cursors.Default;
}
}
}
}

   作者:兮去┓( ´∀` )┏博客
出处:https://www.cnblogs.com/bklsj/p/16784749.html
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

C#winfrom调整任意控件宽和高的更多相关文章

  1. [转]C#鼠标拖动任意控件

    C#鼠标拖动任意控件(winform) 分类: c#2011-08-15 22:51 178人阅读 评论(0) 收藏 举报 winformc#userwindowsobjectapi using Sy ...

  2. 使用Aspose.Cell控件实现Excel高难度报表的生成(三)

    在之前几篇文章中,介绍了关于Apsose.cell这个强大的Excel操作控件的使用,相关文章如下: 使用Aspose.Cell控件实现Excel高难度报表的生成(一) 使用Aspose.Cell控件 ...

  3. 使用Aspose.Cell控件实现Excel高难度报表的生成(二)

    继续在上篇<使用Aspose.Cell控件实现Excel高难度报表的生成(一)>随笔基础上,研究探讨基于模板的Aspose.cell报表实现,其中提到了下面两种报表的界面,如下所示: 或者 ...

  4. 使用Aspose.Cell控件实现Excel高难度报表的生成

    1.使用Aspose.Cell控件实现Excel高难度报表的生成(一) http://www.cnblogs.com/wuhuacong/archive/2011/02/23/1962147.html ...

  5. android屏幕适配的全攻略3-动态获取手机屏幕宽高及动态设置控件宽高

    1.获取手机屏幕宽高: DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetr ...

  6. android获取屏幕宽高与获取控件宽高

    获取屏幕宽高 // 获取屏幕宽高(方法1) int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素 ...

  7. winfrom获取用户控件里的控件对象

    如何获取用户控件里的控件对象呢,其实思路也是很简单的, 比如有一个panel 用户控件 里面有许多的其他控件. 那么要找出一个Label控件怎么找呢,好的.现在我们就开始 首先,一个foreach循环 ...

  8. Winfrom动态创建控件

    FlowLayoutPanel flowLayoutPanel1 = new FlowLayoutPanel();for (int i = 0; i < 9; i++){    Button b ...

  9. IOS中调整UI控件位置和尺寸

    1.frame(修改位置和尺寸):以父控件左上角为坐标原点,在其父控件中的位置和尺寸. //frame属性中的坐标点不能直接修改 CGRect tempFrame = self.v.frame; // ...

  10. 调整ListBox控件的行间距及设置文本格式

    首先要将该控件的DrawMode属性为OwnerDrawVariable 添加DrawItem重绘事件:private void listBox1_DrawItem(object sender, Dr ...

随机推荐

  1. KingbaseES V8R6兼容Oracle的exp-imp导出导入工具使用

    说明: KingbaseES V8R6版本中的兼容Oracle的exp-imp导入导出工具,支持完全模式.用户模式和表模式的导出功能. 本次案例数据库版本: test=# select version ...

  2. mysql选择列建立索引选择

    1. 选择Where子句中筛选性好的列,即列中数据大量不重复 2. 索引名最好 idx_ 开头 3. 包含在 Order by ; Group By; Distinct 中的字段可以添加索引,可以提高 ...

  3. 新一代网络请求库:python-httpx库

    目录 httpx库 一. 概述 1. 简介 2. 命令行模式 3. 快速开始 3.1 get请求 3.2 post请求 3.2.1 表单 3.2.2 文件 3.2.3 JSON 3.2.4 二进制 3 ...

  4. Docker(一):初识

    1.什么是Docker   Docker 是一个基于Go 语言并遵从Apache2.0协议开源的.轻量级的容器引擎,主要运行于 Linux 和 Windows,用于创建.管理和编排容器.可以让开发者打 ...

  5. day40-网络编程02

    Java网络编程02 4.TCP网络通信编程 基本介绍 基于客户端--服务端的网络通信 底层使用的是TCP/IP协议 应用场景举例:客户端发送数据,服务端接收并显示控制台 基于Scoket的TCP编程 ...

  6. 使用J2EE 登录实例开发

    我们先了解下Servlet的生命周期 Servlet部署在容器里,其生命周期由容器管理. 概括为以下几个阶段: 1)容器加载Servlet类. 当第一次有Web客户请求Servlet服务或当Web服务 ...

  7. 创建Elasticsearch集群并为它们配置TLS安全通信

    文章转载自:https://elasticstack.blog.csdn.net/article/details/105636302 文章开头讲述的是两台es主机构建一个集群,其中有关的配置可以借鉴 ...

  8. ProxySQL(1):简介和安装

    文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9278818.html ProxySQL有两个版本:官方版和percona版,percona版是在官方版的基础 ...

  9. MinIO Client完全指南

    官方文档地址:http://docs.minio.org.cn/docs/master/minio-client-complete-guide 下载,添加云存储服务参考这篇文章:https://www ...

  10. Linux 上安装 PostgreSQL

    打开 PostgreSQL 官网 https://www.postgresql.org/,点击菜单栏上的 Download ,可以看到这里包含了很多平台的安装包,包括 Linux.Windows.Ma ...