1.主窗体下部添加一个Panel乘放ToolStrip控件以实现ToolStrip在窗体下部定位。
2.当ToolStrip控件中子控件超出屏幕时,拖动控件可以实现滑动效果。拖动到控件边缘距窗体边缘1/3宽度时(可设),自动回弹。拖动控件边缘在屏幕内时释放鼠标,控件自动回弹,边缘吸附窗体边缘。
3.当ToolStrip控件中子控件数目较少可以在屏幕上完全显示时,拖动效果不可见。
4.增加 添加、删除 按钮,点击时可增删一个ToolStripButton,方便拖动效果可见(ToolStrip控件中子控件超出屏幕)与不可见(ToolStrip控件中子控件可以在屏幕上完全显示时)的演示。
5.拖动鼠标离开ToolStrip控件再释放,不会触发MouseUp事件,引起控件边缘在屏幕中时释放鼠标自动吸附效果失效。待解决。

源码:http://files.cnblogs.com/files/tobeforever/DragDemo.rar

参考文章:WinForm 实现鼠标拖动控件跟随效果(图文) @SkySoot

http://www.cnblogs.com/SkySoot/archive/2011/12/20/2294733.html

 /*==================================================================================================
** 类 名 称:FrmDragTest
** 创 建 人:liu
** 当前版本:V1.0.0
** CLR 版本:4.0.30319.42000
** 创建时间:2017/5/6 19:53:44 ** 修改人 修改时间 修改后版本 修改内容 ** 功能描述:ToolStrip控件左右拖拽移动效果实现 * 主窗体下部添加一个Panel乘放ToolStrip控件以实现ToolStrip在窗体下部定位。
* 当ToolStrip控件中子控件超出屏幕时,拖动控件可以实现滑动效果。拖动到控件边缘距窗体边缘1/3宽度时(可设),
自动回弹。拖动控件边缘在屏幕内时释放鼠标,控件自动回弹,边缘吸附窗体边缘。
* 当ToolStrip控件中子控件数目较少可以在屏幕上完全显示时,拖动效果不可见。
* 增加 添加、删除 按钮,点击时可增删一个ToolStripButton,方便拖动效果可见(ToolStrip控件中子控件超出屏幕)
与不可见(ToolStrip控件中子控件可以在屏幕上完全显示时)的演示。
* 拖动鼠标离开ToolStrip控件再释放,不会触发MouseUp事件,引起控件边缘在屏幕中时释放鼠标自动吸附效果失效。待解决。 ==================================================================================================
Copyright @2017. liu. All rights reserved.
==================================================================================================*/
using System;
using System.Drawing;
using System.Windows.Forms; namespace DragDemo
{
public partial class FrmDragTest : Form
{
#region 字段 /// <summary>
/// 被拖动的ToolStrip控件
/// </summary>
private ToolStrip _toolStrip; /// <summary>
/// 当前ToolStripButton数目
/// </summary>
private int _itemCount; #endregion #region 构造 public FrmDragTest()
{
InitializeComponent();
} #endregion #region 初始化 private void FrmTest_Load(object sender, EventArgs e)
{
this.Size = new Size(, );
// 窗体大小调整时,检查边缘是否留白
this.Resize += (sender1, e1) => { CheckBlank(); };
// 添加一个Panel乘放ToolStrip控件以实现ToolStrip在窗体下部定位
var pnlmain = new Panel { Dock = DockStyle.Bottom, Height = }; _toolStrip = new ToolStrip
{
// 注意Dock属性必须为None
Dock = DockStyle.None,
AutoSize = true,
//BackgroundImageLayout = ImageLayout.None,
GripStyle = ToolStripGripStyle.Hidden,
// 子项除超出屏幕显示时不溢出显示
LayoutStyle = ToolStripLayoutStyle.Flow,
Height = ,
Location = new Point(, ),
ImageScalingSize = new Size(, )
}; //默认添加些Button以显示效果
for (int j = ; j < ; j++)
{
AddOneButton();
} pnlmain.Controls.Add(_toolStrip);
this.Controls.Add(pnlmain); // 添加键
var btnAdd = new Button { Size = new Size(, ), Text = @"Add", Location = new Point(, ) };
btnAdd.Click += btnAdd_Click;
this.Controls.Add(btnAdd);
// 移除键
var btnRemove = new Button { Size = new Size(, ), Text = @"Remove", Location = new Point(, ) };
btnRemove.Click += btnRemove_Click;
this.Controls.Add(btnRemove);
} #endregion #region 自动添加移除 private void btnAdd_Click(object sender, EventArgs e)
{
AddOneButton();
} private void btnRemove_Click(object sender, EventArgs e)
{
RemoveOneButton();
} /// <summary>
/// 向_toolStrip添加一个Button
/// </summary>
private void AddOneButton()
{
var tsbtn = new ToolStripButton
{
AutoSize = false,
DisplayStyle = ToolStripItemDisplayStyle.Text,
Text = (++_itemCount).ToString(),
Size = new Size(, ),
BackColor = Color.YellowGreen,
Margin = new Padding(, , , )
};
tsbtn.MouseDown += Controls_MouseDown;
tsbtn.MouseMove += Controls_MouseMove;
tsbtn.MouseUp += Controls_MouseUp;
_toolStrip.Items.Add(tsbtn);
} /// <summary>
/// 移除队尾的Button
/// </summary>
private void RemoveOneButton()
{
_toolStrip.Items.RemoveAt(--_itemCount);
} #endregion #region 拖动效果实现 /*
* 理解了下面的几个概念,就能完全明白相对坐标的变化.
* Cursor.Position 获取的是相对于用户屏幕的光标坐标
* PointToClient() 方法可将屏幕坐标 Cursor.Position 换算成工作区的坐标
*/ /// <summary>
/// 保存拖动前鼠标X坐标
/// </summary>
private int _curX;
/// <summary>
/// 保存拖动前_ToolStrip控件X坐标
/// </summary>
private int _oldToolStripX; /// <summary>
/// 按键按下,记录当前光标X坐标与拖动前_ToolStrip控件X坐标
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Controls_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
// 获取当前光标X坐标
_curX = Cursor.Position.X;
// 获取拖动前_ToolStrip控件X坐标
_oldToolStripX = _toolStrip.Location.X;
}
} /// <summary>
/// 鼠标移动,拖动_ToolStrip控件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Controls_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
// x最小值,对应右侧拖动到边界时x坐标值
int minX = this.Width - _toolStrip.Width;
// 图标当前可以全部显示,拖动效果不可见
if (minX > ) return; // _ToolStrip控件X轴新坐标
// 当前鼠标X坐标-拖动前鼠标X坐标=X轴鼠标偏移量,加上拖动前控件X坐标,即为新坐标
int newToolStripX = Cursor.Position.X - _curX + _oldToolStripX; // 右侧空白超过屏幕宽度1/3,自动回弹
if (newToolStripX < minX - this.Width / )
{
// 左拖动过度,修正
newToolStripX = minX;
}
// 左侧空白超过屏幕宽度1/3,自动回弹
else if (newToolStripX > this.Width / )
{
// 右拖动过多,修正
newToolStripX = ;
} _toolStrip.Location = new Point(newToolStripX, );
}
} /// <summary>
/// 鼠标松开,检查两侧是否留白
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Controls_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
CheckBlank();
}
} /// <summary>
/// 检查两侧是否留白
/// </summary>
private void CheckBlank()
{ // x最小值,对应右侧拖动到边界时x坐标值
int minX = this.Width - _toolStrip.Width;
// 图标全部显示,拖动效果不可见
if (minX > ) return; // 左边界限制,左侧不留空
if (_toolStrip.Location.X > )
{
_toolStrip.Location = new Point(, );
}
// 右边界限制,右侧不留空
else if (_toolStrip.Location.X < minX)
{
_toolStrip.Location = new Point(minX, );
} } #endregion
}
}

ToolStrip控件左右拖拽移动效果实现的更多相关文章

  1. PyQt5控件支持拖拽方法

    让控件支持拖拽动作A.setDragEnable(True) 设置A可以拖动B.setAcceptDrops(True) 设置B可以接受拖动B需要满足两个事件1.dragEnterEvent 将A拖到 ...

  2. 【Android】HorizontalScrollView内子控件横向拖拽

    前言 网上ListView上下拖动的例子有,效果也很好,但是项目要横着拖的,只要硬着头皮自己写(主要是没找到合适的),参考文章1修改而来,分享一下. 声明 欢迎转载,但请保留文章原始出处:)  博客园 ...

  3. 【C#/WPF】UI控件的拖拽/拉伸

    需求①:控件拖拽——按住鼠标,可自由拖拽控件. 方法:目前看到的办法有两种. 使用ZoomableCanvas:http://www.cnblogs.com/gnielee/archive/2011/ ...

  4. C#开发PACS医学影像处理系统(九):序列控件与拖拽

    1.先看结构: 创建WPF用户控件:YourTab 创建WPF用户控件:YourItem 创建选项卡时循环添加item,并设置序列缩略图到控件和异步下载的进度条, 1个病人1个或多个Study检查,1 ...

  5. 怎样在delphi中实现控件的拖拽

    下面这2种方法都能实现对控件和窗体的拖拽 方法1 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift ...

  6. WPF 实现控件间拖拽内容

    想实现这样一个常用功能:在ListBox的一个Item上点住左键,然后拖拽到另外一个控件(如ListView中),松开左键,数据已经拖拽过来. 步骤如下: 1. 设置ListBox 的AllowDro ...

  7. winform上控件的拖拽小结

    这里罗列出几个相关的事件和属性,具体的实现介绍已有非常优秀的文章了,文章末尾我将会给出,大家可以去参考. 属性: AllowDrop: 目标控件必须设定为true,才能接受拖拽来的东西. 事件: It ...

  8. HTML5 02. 多媒体控件、拖拽事件、历史记录、web存储、应用程序缓存、地理定位、网络状态

    多媒体 video:是行内块(text-align: center; 对行内块适用) <figure></figure>: 多媒体标签 : <figcaption> ...

  9. 【转】在delphi中实现控件的拖拽

    提示:可以添加一个布尔来控制可否拖动的状态,这里提供所有都能拖动的方法. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseB ...

随机推荐

  1. C语言-正序输出一个一个多位数

    //正序输出一个多位数,所有的数字中间用空格分隔 int main() { ;//是可变化的 ; int d; int t =x; //先计算x的位数 ){ t /= ; mask *=; } pri ...

  2. Idea项目注释规范设置

    Idea项目注释规范设置文档 1.类注释: /**    *@ClassName: ${NAME}    *@Description: TODO    *@Author: guohui    *@Da ...

  3. Java8新特性之Lambda

    为什么要Lambda Java8应该是目前最大的一次更新了,更新后我们迎来了很多新特性,其中便包括Lambda表达式,函数式编程的思想正式进入Java,让我们看一个经典案例. 例1 按照两个人的年龄排 ...

  4. 为程序员节日献礼--2019中国.NET开发者峰会主题内容发布

    2019年10月24日,组委会正式发布了China .NET Conf 2019中国 .NET 开发者峰会的主题内容. 2014年微软组织并成立.NET基金会,微软在成为主要的开源参与者的道路上又前进 ...

  5. vue3.0 + ueditor

    公司有个需求,需要做个发送邮件的模版(富文本对于模版的扩展性更好吧) 关于富文本,也找了一些好看且支持vue的,但是功能都没有百度全面 反正这个系统也是自己人用,颜值无所谓了 关于vue2.0+ued ...

  6. [NOIP2013提高组]华容道

    这道题第一眼看是暴力,然后发现直接暴力会TLE. 把问题转换一下:移动空格到处跑,如果空格跑到指定位置的棋子,交换位置. 这个可以设计一个状态:$[x1][y1][x2][y2]$,表示空格在$(x1 ...

  7. day1-01 温度转换

    一."温度转换"问题分析 1.1 温度转换 温度刻画的两种不同体系 摄氏度:中国等世界大多数国家使用 以1标准大气压下水的结冰点为0度,沸点为100度,将温度进行等分刻画 华氏度: ...

  8. 微信小程序中的canvas基础应用

    学了东西还是要记录一下,刚入职的小萌新啊,运气好分到一个项目不是很急的组原以为时间多了可以多学一些东西,但是发现好像不知道从哪里开始下手,我太南了.... 看旁边的实习生同事一直在搞canvas,自己 ...

  9. docker-compose下的java应用启动顺序两部曲之二:实战

    上篇回顾 本文是<docker-compose下的java应用启动顺序两部曲>的终篇,在上一篇<docker-compose下的java应用启动顺序两部曲之一:问题分析>中,我 ...

  10. 第二篇:版本控制git之分支

    有人把 Git 的分支模型称为它的`‘必杀技特性’',也正因为这一特性,使得 Git 从众多版本控制系统中脱颖而出. 为何 Git 的分支模型如此出众呢? Git 处理分支的方式可谓是难以置信的轻量, ...