ToolStrip控件左右拖拽移动效果实现

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

  1 /*==================================================================================================
  2 ** 类 名 称:FrmDragTest
  3 ** 创 建 人:liu
  4 ** 当前版本:V1.0.0
  5 ** CLR 版本:4.0.30319.42000
  6 ** 创建时间:2017/5/6 19:53:44
  7
  8 ** 修改人        修改时间        修改后版本        修改内容
  9
 10
 11 ** 功能描述:ToolStrip控件左右拖拽移动效果实现
 12
 13  * 主窗体下部添加一个Panel乘放ToolStrip控件以实现ToolStrip在窗体下部定位。
 14  * 当ToolStrip控件中子控件超出屏幕时,拖动控件可以实现滑动效果。拖动到控件边缘距窗体边缘1/3宽度时(可设),
 15    自动回弹。拖动控件边缘在屏幕内时释放鼠标,控件自动回弹,边缘吸附窗体边缘。
 16  * 当ToolStrip控件中子控件数目较少可以在屏幕上完全显示时,拖动效果不可见。
 17  * 增加 添加、删除 按钮,点击时可增删一个ToolStripButton,方便拖动效果可见(ToolStrip控件中子控件超出屏幕)
 18    与不可见(ToolStrip控件中子控件可以在屏幕上完全显示时)的演示。
 19  * 拖动鼠标离开ToolStrip控件再释放,不会触发MouseUp事件,引起控件边缘在屏幕中时释放鼠标自动吸附效果失效。待解决。
 20
 21 ==================================================================================================
 22  Copyright @2017. liu. All rights reserved.
 23 ==================================================================================================*/
 24 using System;
 25 using System.Drawing;
 26 using System.Windows.Forms;
 27
 28 namespace DragDemo
 29 {
 30     public partial class FrmDragTest : Form
 31     {
 32         #region 字段
 33
 34         /// <summary>
 35         /// 被拖动的ToolStrip控件
 36         /// </summary>
 37         private ToolStrip _toolStrip;
 38
 39         /// <summary>
 40         /// 当前ToolStripButton数目
 41         /// </summary>
 42         private int _itemCount;
 43
 44         #endregion
 45
 46         #region 构造
 47
 48         public FrmDragTest()
 49         {
 50             InitializeComponent();
 51         }
 52
 53         #endregion
 54
 55         #region 初始化
 56
 57         private void FrmTest_Load(object sender, EventArgs e)
 58         {
 59             this.Size = new Size(530, 350);
 60             // 窗体大小调整时,检查边缘是否留白
 61             this.Resize += (sender1, e1) => { CheckBlank(); };
 62             // 添加一个Panel乘放ToolStrip控件以实现ToolStrip在窗体下部定位
 63             var pnlmain = new Panel { Dock = DockStyle.Bottom, Height = 80 };
 64
 65             _toolStrip = new ToolStrip
 66             {
 67                 // 注意Dock属性必须为None
 68                 Dock = DockStyle.None,
 69                 AutoSize = true,
 70                 //BackgroundImageLayout = ImageLayout.None,
 71                 GripStyle = ToolStripGripStyle.Hidden,
 72                 // 子项除超出屏幕显示时不溢出显示
 73                 LayoutStyle = ToolStripLayoutStyle.Flow,
 74                 Height = 78,
 75                 Location = new Point(0, 1),
 76                 ImageScalingSize = new Size(102, 78)
 77             };
 78
 79             //默认添加些Button以显示效果
 80             for (int j = 0; j < 10; j++)
 81             {
 82                 AddOneButton();
 83             }
 84
 85             pnlmain.Controls.Add(_toolStrip);
 86             this.Controls.Add(pnlmain);
 87
 88             // 添加键
 89             var btnAdd = new Button { Size = new Size(80, 40), Text = @"Add", Location = new Point(150, 100) };
 90             btnAdd.Click += btnAdd_Click;
 91             this.Controls.Add(btnAdd);
 92             // 移除键
 93             var btnRemove = new Button { Size = new Size(80, 40), Text = @"Remove", Location = new Point(300, 100) };
 94             btnRemove.Click += btnRemove_Click;
 95             this.Controls.Add(btnRemove);
 96         }
 97
 98         #endregion
 99
100         #region 自动添加移除
101
102         private void btnAdd_Click(object sender, EventArgs e)
103         {
104             AddOneButton();
105         }
106
107         private void btnRemove_Click(object sender, EventArgs e)
108         {
109             RemoveOneButton();
110         }
111
112         /// <summary>
113         /// 向_toolStrip添加一个Button
114         /// </summary>
115         private void AddOneButton()
116         {
117             var tsbtn = new ToolStripButton
118             {
119                 AutoSize = false,
120                 DisplayStyle = ToolStripItemDisplayStyle.Text,
121                 Text = (++_itemCount).ToString(),
122                 Size = new Size(100, 78),
123                 BackColor = Color.YellowGreen,
124                 Margin = new Padding(0, 0, 2, 0)
125             };
126             tsbtn.MouseDown += Controls_MouseDown;
127             tsbtn.MouseMove += Controls_MouseMove;
128             tsbtn.MouseUp += Controls_MouseUp;
129             _toolStrip.Items.Add(tsbtn);
130         }
131
132         /// <summary>
133         /// 移除队尾的Button
134         /// </summary>
135         private void RemoveOneButton()
136         {
137             _toolStrip.Items.RemoveAt(--_itemCount);
138         }
139
140         #endregion
141
142         #region 拖动效果实现
143
144         /*
145         * 理解了下面的几个概念,就能完全明白相对坐标的变化.
146         * Cursor.Position 获取的是相对于用户屏幕的光标坐标
147         * PointToClient() 方法可将屏幕坐标 Cursor.Position 换算成工作区的坐标
148         */
149
150         /// <summary>
151         /// 保存拖动前鼠标X坐标
152         /// </summary>
153         private int _curX;
154         /// <summary>
155         /// 保存拖动前_ToolStrip控件X坐标
156         /// </summary>
157         private int _oldToolStripX;
158
159         /// <summary>
160         /// 按键按下,记录当前光标X坐标与拖动前_ToolStrip控件X坐标
161         /// </summary>
162         /// <param name="sender"></param>
163         /// <param name="e"></param>
164         private void Controls_MouseDown(object sender, MouseEventArgs e)
165         {
166             if (e.Button == MouseButtons.Left)
167             {
168                 // 获取当前光标X坐标
169                 _curX = Cursor.Position.X;
170                 // 获取拖动前_ToolStrip控件X坐标
171                 _oldToolStripX = _toolStrip.Location.X;
172             }
173         }
174
175         /// <summary>
176         /// 鼠标移动,拖动_ToolStrip控件
177         /// </summary>
178         /// <param name="sender"></param>
179         /// <param name="e"></param>
180         private void Controls_MouseMove(object sender, MouseEventArgs e)
181         {
182             if (e.Button == MouseButtons.Left)
183             {
184                 // x最小值,对应右侧拖动到边界时x坐标值
185                 int minX = this.Width - _toolStrip.Width;
186                 // 图标当前可以全部显示,拖动效果不可见
187                 if (minX > 0) return;
188
189                 // _ToolStrip控件X轴新坐标
190                 // 当前鼠标X坐标-拖动前鼠标X坐标=X轴鼠标偏移量,加上拖动前控件X坐标,即为新坐标
191                 int newToolStripX = Cursor.Position.X - _curX + _oldToolStripX;
192
193                 // 右侧空白超过屏幕宽度1/3,自动回弹
194                 if (newToolStripX < minX - this.Width / 3)
195                 {
196                     // 左拖动过度,修正
197                     newToolStripX = minX;
198                 }
199                 // 左侧空白超过屏幕宽度1/3,自动回弹
200                 else if (newToolStripX > this.Width / 3)
201                 {
202                     // 右拖动过多,修正
203                     newToolStripX = 0;
204                 }
205
206                 _toolStrip.Location = new Point(newToolStripX, 0);
207             }
208         }
209
210         /// <summary>
211         /// 鼠标松开,检查两侧是否留白
212         /// </summary>
213         /// <param name="sender"></param>
214         /// <param name="e"></param>
215         private void Controls_MouseUp(object sender, MouseEventArgs e)
216         {
217             if (e.Button == MouseButtons.Left)
218             {
219                 CheckBlank();
220             }
221         }
222
223         /// <summary>
224         /// 检查两侧是否留白
225         /// </summary>
226         private void CheckBlank()
227         {
228
229             // x最小值,对应右侧拖动到边界时x坐标值
230             int minX = this.Width - _toolStrip.Width;
231             // 图标全部显示,拖动效果不可见
232             if (minX > 0) return;
233
234             // 左边界限制,左侧不留空
235             if (_toolStrip.Location.X > 0)
236             {
237                 _toolStrip.Location = new Point(0, 0);
238             }
239             // 右边界限制,右侧不留空
240             else if (_toolStrip.Location.X < minX)
241             {
242                 _toolStrip.Location = new Point(minX, 0);
243             }
244
245         }
246
247
248
249         #endregion
250     }
251 }
时间: 2024-10-05 17:54:10

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

winform上控件的拖拽小结

这里罗列出几个相关的事件和属性,具体的实现介绍已有非常优秀的文章了,文章末尾我将会给出,大家可以去参考. 属性: AllowDrop: 目标控件必须设定为true,才能接受拖拽来的东西. 事件: ItemDrag: 源控件在拖动开始时发生.在这里需调用DoDragDrop方法开始拖拽行为. DragEnter:目标控件接受到拖拽行为时发生.在这里可以通过e.Effect设定目标控件能接受的拖拽行为. DragOver:目标控件接受到拖拽行为时不间断发生.在DragEnter后触发.这里不可做耗时

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

多媒体 video:是行内块(text-align: center; 对行内块适用) <figure></figure>: 多媒体标签 : <figcaption></figcaption>: 多媒体标题 方法: load() 加载.play()播放.pause()暂停 属性: currentTime 视频播放的当前进度. duration:视频的总时间. paused:视频播放的状态 事件:   oncanplay:事件在用户可以开始播放视频/音频(aud

在delphi中实现控件的拖拽

提示:可以添加一个布尔来控制可否拖动的状态,这里提供所有都能拖动的方法. 1 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; 2 Shift: TShiftState; X, Y: Integer); 3 begin 4 ReleaseCapture; 5 SendMessage(Handle,WM_NCLBUTTONDOWN,HTCAPTION,0); 6 end;

NGUI控件不能拖拽问题

NGUI3.6版本 第一种方案: 1.  NGUI Options  Handles -> turn off         拖动打开 第二种方案: 1.  勾选上Edit –> Project Setting –> Physics –>Layer Collision Matrix勾选上UI

利用jQuery UI为CMS网站实现拖拽布局效果,秒杀table布局

1 实现效果 对于使用过CMS系统制作网站的人应该都清楚,制作网站过程有一个重要的步骤就是制作页面布局.目前,实现页面布局有两种方式:table与div.这两种方式各有其优劣之处. Table: 优势:使用简单,使用表格进行布局顺理成章,概念和效果图理解起来很简单,制作也方便. 劣势:表格布局比较固定,布局效果控制的比较死,一些较为特殊的效果.层叠效果等比较难以实现. Div: 优势:布局效果灵活,div能轻易的控制布局位置,浮动效果等. 劣势:操作较为复杂,需要前端布局设计人员对div的特性.

jquery实现拖拽的效果

上篇讲的是原生js实现拖拽的效果,本篇是jquery实现拖拽的效果. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta charset="utf-8"/> <title> New Documen

Android中GridView拖拽的效果

最 近看到联想,摩托罗拉等,手机launcher中有个效果,进入mainmenu后,里面的应用程序的图标可以拖来拖去,所以我也参照网上给的代码,写了 一个例子.还是很有趣的,实现的流畅度没有人家的那么好,我只是模仿这种效果,我写的这个拖拽是两个图标之间进行交换,所以,当从一行的某个位置,换到下 一行的另一列的时候,发现有好几个图标都改变位置了,因为是相邻两个交换位置,所以每经过相邻的图标的时候都改变位置.先弄个雏形,以后再更新优化. 转载请标明出处:http://blog.csdn.net/wd

实现小窗口拖拽的效果

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; color: #2b7ec3 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; min-height: 36.0px } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; color: #d74200 } p.p4 {

2.2.4、用jwplayer实现youku可拖拽播放效果(nginx,yamdi)

Yamdi,为flv/mp4视频添加关键帧 1.解压下载的文件tar –zxvf yamdi-1.8.tar.gz 2.进入解压后的目录cd yamdi-1.8. 3.编译并安装 make && make install 4.使用该软件为视频添加关键帧信息实现拖动效果 具体使用方法如下yamdi -i input.mp4 -o out.mp4 Nginx需要加如下配置 location ~ \.flv$ { flv; } 如果要限制带宽和第一次下载量可加如下参数 limit_rate_af