在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. Oracle 与 PostgreSQL 函数行为的差异引发性能差异

    对于Oracle,对于数据修改的操作通过存储过程处理,而对于函数一般不进行数据修改操作.同时,函数可以通过 Select 进行调用,而存储过程则不行. 一.对于volatile 函数的行为 1.Ora ...

  2. 【读书笔记】C#高级编程 第十章 集合

    (一)概述 数组的大小是固定的.如果元素个数是动态的,就应使用集合类. List<T>是与数组相当的集合类.还有其它类型的集合:队列.栈.链表.字典和集. (二)列表 1.创建列表 调用默 ...

  3. 如何搭建安全的 CI/CD 管道?

    Eolink 前端负责人黎芷君进行了<工程化- CI / CD>的主题演讲,围绕 CI/CD 管道安全的实践,分享自己在搭建 CI/CD 管道过程中所总结的重要经验,与开发者深入讨论 &q ...

  4. Elasticsearch:用户安全设置

    Elastic Stack的组件是不安全的,因为它没有内置的固有安全性. 这意味着任何人都可以访问它. 在生产环境中运行Elastic Stack时,这会带来安全风险. 为了防止生产中未经授权的访问, ...

  5. Redis的web管理界面redis-manager

    下载 下载地址:https://github.com/ngbdf/redis-manager/releases 配置 tar -zxv -f redis-manager-2.3.2.2-RELEASE ...

  6. SpringCloud组件编写Dockerfile文件模板

    在组件根目录下的Dockerfile文件 # Dockerfile文件内容 FROM idocker.io/jre:1.8.0_212 #自定义的基础镜像 VOLUME /tmp # 挂载目录 ADD ...

  7. Jetbrains家的软件都可用的激活码-pycharm

    网址:http://vrg123.com/ 步骤: 1,关注下方的公众号 2,点击菜单中的"激活密钥" 3,点击进入,获得网站密钥 4,在网站上输入网站密钥,点击获取,即可获取激活 ...

  8. 【Wine使用经验分享】Wine字体显示问题处理

    字体不显示/字体为□ 首先尝试下载simsun字体到/usr/share/fonts (simsun.ttf simsun.ttc) 在新版本wine上,差不多就能解决问题. 如果还不行,就从网上下载 ...

  9. Atcoder CODE FESTIVAL 2016 Grand Final E - Water Distribution

    Atcoder CODE FESTIVAL 2016 Grand Final E - Water Distribution 题目链接:https://atcoder.jp/contests/cf16- ...

  10. 小白转行入门STM32----手机蓝牙控制STM32单片机点亮LED

    @ 目录 引言导读 一.通信基础知识 1.1 通信到底传输的是什么? 1.2 比特率和波特率 习题 1.1 双工和单工 习题 1.2 串行和并行 1.3 异同通信和同步通信 习题 二.连接STM32单 ...