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. Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行

    本文将对如何在Java程序中操作Word表格作进一步介绍.操作要点包括 如何在Word中创建嵌套表格. 对已有表格添加行或者列 复制已有表格中的指定行或者列 对跨页的表格可设置是否禁止跨页断行 创建表 ...

  2. 「3D建模」ZBrush如何雕刻头部

    加载项目开始 1. 如果未显示灯箱,请按逗号(,)或灯箱按钮. 2. 单击项目选项卡,然后双击DefaultSphere项目.它将被加载到ZBrush中. 3. 在工具>几何子选项板中,将SDi ...

  3. HTTP中get和post

    HTTP中get和post的区别 GET - 从指定的资源请求数据. POST - 向指定的资源提交要被处理的数据 GET POST 后退/刷新 无害的 数据会被重新提交 书签 可收藏为书签 不可收藏 ...

  4. sublime text插件emmet自定义模板

    首先要找到 snippets.json这个文件,路径是preferences>browse packages,看看有没有emmet目录. 如果没有,可能是您没有安装emmet插件,或者您安装了但 ...

  5. Python3+RobotFramework+pycharm环境搭建

    我的环境为 python3.6.5+pycharm 2019.1.3+robotframework3.1.2 1.安装python3.x 略 之后在cmd下执行:pip  install  robot ...

  6. 【Leetcode 做题学算法周刊】第一期

    首发于微信公众号<前端成长记>,写于 2019.10.28 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 1. ...

  7. 使用 Django 项目中的 ORM 编写伪造测试数据脚本

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 为了防止博客首页展示的文章过多以及提升加载速度,可以对文章列表进行分页展示.不过这需 ...

  8. Unity修改脚本后调试

    修改脚本后调试有时候需要运行,为了提高效率可以设置编辑器中执行,同时也可以开启有效性检查(即更改面板变量即可刷新代码) [ExecuteInEditMode] public class XXXX: M ...

  9. vue表单属性

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. SpringCloud之Eureka服务注册与发现(一)

    一 Eureka的基本架构 Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper). Eureka 采用了 C-S 的设计架构 ...