在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. Sync包

    sync同步包 Mutex互斥锁: 能够保证在同一时间段内仅有一个goroutine持有锁,有且仅有一个goroutine访问共享资源,其他申请锁的goroutine将会被阻塞直到锁被释放.然后重新争 ...

  2. ConcurrentDictionary<T,V> 的这两个操作不是原子性的

    好久不见,马甲哥封闭居家半个月,记录之前遇到的一件小事. ConcurrentDictionary<TKey,TValue>绝大部分api都是线程安全且原子性的, 唯二的例外是接收工厂委托 ...

  3. stm32fxx_hal_i2c.c解读之HAL_I2C_Mem_Write

    HAL_I2C_Mem_Write()函数位于stm32fxx_hal_i2c.c文件的2432行,源代码对该函数的解释如下图 HAL_StatusTypeDef HAL_I2C_Mem_Write( ...

  4. es分片数相关知识

    分片数量 总分片数=主分片数 *(副分片数+1) 如下创建索引配置表示,总分片数=1 *(1+4),表示总共5个分片. "settings": { "number_of_ ...

  5. 在K8S中安装jenkins

    以 NFS 为存储卷的示例,将在 NFS 存储卷上创建 Jenkins 目录,然后创建 NFS 类型的 PV.PVC. 1.NFS 存储卷创建 Jenkins 目录 进入 NFS Server 服务器 ...

  6. 某宝抢购taobaosnap开发与实现

    某宝抢购脚本 Taobaosnap Taobaosnap is a completely open tool, which is used to buy goods in seconds on Tao ...

  7. .NET 反向代理 YARP 跨域请求 CORS

    使用过 nginx 的小伙伴应该都知道,这个中间件是可以设置跨域的,作为今天的主角,同样的 反向代理中间件的 YARP 毫无意外也支持了跨域请求设置. 有些小伙伴可能会问了,怎样才算是跨域呢? 在 H ...

  8. n维偏序 方法记录

    题解 首先我们要对一个地点能否到达建立认知:一个地点能到达不仅仅是能从它的上一个点或上上个点跳到,而是能从第一个点开始跳一路跳到.就好比说,咱吃了6个包子吃饱了,但咱不能只付第6个包子的钱. 方法一: ...

  9. 关于history.back()、history.go()回退但无法刷新页面的问题

    window.history.back(); 这样确实可以做到后退的功能,但是项目中,常常并不只是后退就能完成需求,往往需要在后退的同时,刷新后退的页面信息,比如后退到首页同时刷新首页的最新数据,这样 ...

  10. Kafka之概述

    Kafka之概述 一.消息队列内部实现原理 (1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除) 点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消 ...