控件移动的关键点就是需要设计一个独立于任何控件的类(UIMoveKnob)来控制控件的移动。我这里实现的方法只针对一个控件,如果需要同时选择多个控件,然后同时移动的话,你需要修改这个类,这里是有点难于控制,我使用的方法严重耦合,所以只在这里给出移动一个控件的办法,具体移动过个控件的方法请各位讨论。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
要移动某个选定的控件,我们需要实现控件的:
MouseDown
MouseMove
MouseUp
这3个事件。
在MouseDown的时候,记录鼠标点击的开始位置,并设置开始移动标志为True;
在MouseMove的时候,把控件移动相应的距离(当前鼠标位置 – 鼠标点击的开始位置);
在MouseUp的时候,释放移动标志为false。
有了控件移动控制类(UIMoveKnob)以后,我们怎么实现UIMoveKnob和具体控件的关联呢?同样,我们需要在Form中增加一个变量private Hashtable _HashUIMoveKnob用于缓存每个控件对应的UIMoveKnob对象。
同时在Form.ControlAdded事件中,通过this._HashUIMoveKnob.Add(e.Control, new UIMoveKnob(e.Control));设置其关联性。
UIMoveKnob的代码如下:
-
publicclassUIMoveKnob
- {
-
privateSystem.Windows.Forms.Control_Owner;
-
privateint_MouseClickAtX;
-
privateint_MouseClickAtY;
-
privatebool_BeginDrag;
-
publicUIMoveKnob(System.Windows.Forms.ControlOwner)
- {
-
this._Owner=Owner;
-
this._Owner.MouseDown+=newSystem.Windows.Forms.MouseEventHandler(this.Owner_MouseDown);
-
this._Owner.MouseMove+=newSystem.Windows.Forms.MouseEventHandler(this.Owner_MouseMove);
-
this._Owner.MouseUp+=newSystem.Windows.Forms.MouseEventHandler(this.Owner_MouseUp);
- }
-
voidOwner_MouseDown(objectsender,System.Windows.Forms.MouseEventArgse)
- {
-
this._Owner.Cursor=System.Windows.Forms.Cursors.Default;
-
this._MouseClickAtX=e.X;
-
this._MouseClickAtY=e.Y;
-
this._BeginDrag=true;
- }
-
voidOwner_MouseMove(objectsender,System.Windows.Forms.MouseEventArgse)
- {
-
try
- {
-
if(this._BeginDrag)
- {
- Rectanglerect;
-
-
-
if(this._OwnerisSystem.Windows.Forms.TabPage)
- {
-
- }
-
else
- {
-
this._Owner.Location=newPoint(this._Owner.Left+e.X-this._MouseClickAtX,this._Owner.Top+e.Y-this._MouseClickAtY);
- }
- }
- }
-
catch{}
- }
-
voidOwner_MouseUp(objectsender,System.Windows.Forms.MouseEventArgse)
- {
-
this._BeginDrag=false;
-
this._Owner.Parent.Refresh();
- }
- }
修改后的Form代码前半部分如下:
-
privateMouseHook_MouseHook;
-
-
privateHashtable_HashUISizeKnob;
-
-
privateHashtable_HashUIMoveKnob;
-
publicForm1()
- {
- InitializeComponent();
-
this._MouseHook=newMouseHook(this);
-
this._HashUISizeKnob=newHashtable();
-
this._HashUIMoveKnob=newHashtable();
-
-
this.ControlAdded+=newControlEventHandler(Form1_ControlAdded);
- }
-
voidForm1_ControlAdded(objectsender,ControlEventArgse)
- {
-
if(!(e.ControlisUISizeDot))
- {
-
this._HashUISizeKnob.Add(e.Control,newUISizeKnob(e.Control));
-
this._HashUIMoveKnob.Add(e.Control,newUIMoveKnob(e.Control));
-
-
e.Control.Click+=newEventHandler(Control_Click);
- }
- }
-
voidControl_Click(objectsender,EventArgse)
- {
-
-
foreach(UISizeKnobknobinthis._HashUISizeKnob.Values)
- {
-
knob.ShowUISizeDots(false);
- }
-
try
- {
-
((UISizeKnob)this._HashUISizeKnob[sender]).ShowUISizeDots(true);
- }
-
catch{}
- }
相对来说实现单个控件的拖动比较简单,而实现多个控件的拖动,我们需要首先使用一个全局的变量来缓存我们所选择的控件,然后在此类中。拖动的时候,通过遍历此全局变量,一个个改变所选择控件的位置。
相关文章:
C#基础系列:开发自己的窗体设计器(总纲)
C#基础系列:开发自己的窗体设计器(在容器上拖动鼠标增加控件)
C#基础系列:开发自己的窗体设计器(实现控件的选择)
分享到:
相关推荐
基于halcon的视觉软件窗体控件设计,包括自由窗体控件设计,在视觉软件系统窗体自由拖动,组合设计开发C#开发
所以我就想能够弄一个类似于vs2005的WinForm窗体设计器的开发平台,让用户拖拖拽拽就可以添加自己需要的控件,或者删除不需要的控件,从而完成大部分的工作,实现功能的扩展,而我需要做的,只不过是写写插件代码。...
C#实现控件随窗体拖动而自动缩放其大小.txt
c#中通过控件拖动窗体 即在窗体不存在标题栏的情况下,实现在窗体中的控件的拖动来实现对窗体的拖动
c#窗体之间的控件拖动,控件的拖动。很使用啊。做起很好。
button控件是我自己重写过的,因为为了mousedown+mouseup事件不触发click事件, 窗体内的控件可以在窗体运行时实时移动他们的位置
C# winform 运行时用户拖动窗体上控件大小位置,可用于自定义窗体上控件排版
C# 实现动态创建控件 调整大小 拖动 自适应窗体 可以进行微调,需要创建之后进行绑定操作。
C# 程序启动后 鼠标拖动窗体控件源码 可用来实现动态布局窗体等。
winform窗体继承泛型类时,设计器无法使用解决办法: 当我们使用winform程序时,winform窗体程序和控件程序都是可以通过设计器进行控件拖拽的,但如果我们继承了一个带有泛型的form基类.那么设计器是无法使用的.
C#支持等比例缩放拖动的halcon WPF开源窗体控件
实现类似拖拽效果: 1、按键按下新建窗体 2、新建窗体随鼠标移动 3、松开鼠标取消移动
主要介绍了C# WinForm实现窗体上控件自由拖动功能,涉及WinForm控件属性及事件响应相关操作技巧,需要的朋友可以参考下
C#实现运行时调整控件大小和位置,可以单击拖动控件到窗体任何位置,鼠标移动到控件边沿可以改变光标形状,按下鼠标左键后拖动可以改变控件大小,改变主窗体大小控件大小跟随
将各种控件拖动功能封装到附加属性中,提高复用性和易用性。包括了各种情况的控件拖动,在Grid中以及在Canvas或者其他任意布局的控件拖动,以及窗口拖动,同时解决了拖动和点击的冲突问题。原文链接:...
用c#编写的示例程序,可以单击或双击后拖动控件到窗体任何位置,鼠标移动到控件边沿可以改变光标形状,按下鼠标左键后拖动可以改变控件大小,改变主窗体大小控件大小跟随改变
主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和集合的使用、面向对象编程技术、数据结构与算法、Windows窗体基础、特色窗体界面、窗体控制技术、MDI窗体和继承窗体、Windows常用控件的使用、...
** 功能描述:ToolStrip控件左右拖拽移动效果实现 * 主窗体下部添加一个Panel乘放ToolStrip控件以实现ToolStrip在窗体下部定位。 * 当ToolStrip控件中子控件超出屏幕时,拖动控件可以实现滑动效果。拖动到控件...
c#编程 运行时窗体或控件移动 可以设计可视化的界面,即运行时拖动控件来设计显示界面,在工业控制方面将有很好的使用