`
saybody
  • 浏览: 904380 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

C#基础系列:开发自己的窗体设计器(实现控件的拖动)

阅读更多

控件移动的关键点就是需要设计一个独立于任何控件的类(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的代码如下:

  1. publicclassUIMoveKnob
  2. {
  3. privateSystem.Windows.Forms.Control_Owner;
  4. privateint_MouseClickAtX;
  5. privateint_MouseClickAtY;
  6. privatebool_BeginDrag;
  7. publicUIMoveKnob(System.Windows.Forms.ControlOwner)
  8. {
  9. this._Owner=Owner;
  10. this._Owner.MouseDown+=newSystem.Windows.Forms.MouseEventHandler(this.Owner_MouseDown);
  11. this._Owner.MouseMove+=newSystem.Windows.Forms.MouseEventHandler(this.Owner_MouseMove);
  12. this._Owner.MouseUp+=newSystem.Windows.Forms.MouseEventHandler(this.Owner_MouseUp);
  13. }
  14. voidOwner_MouseDown(objectsender,System.Windows.Forms.MouseEventArgse)
  15. {
  16. this._Owner.Cursor=System.Windows.Forms.Cursors.Default;
  17. this._MouseClickAtX=e.X;
  18. this._MouseClickAtY=e.Y;
  19. this._BeginDrag=true;
  20. }
  21. voidOwner_MouseMove(objectsender,System.Windows.Forms.MouseEventArgse)
  22. {
  23. try
  24. {
  25. if(this._BeginDrag)
  26. {
  27. Rectanglerect;
  28. /*
  29. *对于下列控件,是不能拖动的,所以这里也不绘制拖动边框
  30. *TabPage,
  31. */
  32. if(this._OwnerisSystem.Windows.Forms.TabPage)
  33. {
  34. //
  35. }
  36. else
  37. {
  38. this._Owner.Location=newPoint(this._Owner.Left+e.X-this._MouseClickAtX,this._Owner.Top+e.Y-this._MouseClickAtY);
  39. }
  40. }
  41. }
  42. catch{}
  43. }
  44. voidOwner_MouseUp(objectsender,System.Windows.Forms.MouseEventArgse)
  45. {
  46. this._BeginDrag=false;
  47. this._Owner.Parent.Refresh();
  48. }
  49. }

修改后的Form代码前半部分如下:

  1. privateMouseHook_MouseHook;
  2. //我们将所有的已经与具体控件关联了的UISizeKnob缓存在这个HashTable中
  3. privateHashtable_HashUISizeKnob;
  4. //负责控件移动的类
  5. privateHashtable_HashUIMoveKnob;
  6. publicForm1()
  7. {
  8. InitializeComponent();
  9. this._MouseHook=newMouseHook(this);
  10. this._HashUISizeKnob=newHashtable();
  11. this._HashUIMoveKnob=newHashtable();
  12. //为了简洁明了,我们在ControlAdded中来设置具体控件和UISizeKnob的关联
  13. this.ControlAdded+=newControlEventHandler(Form1_ControlAdded);
  14. }
  15. voidForm1_ControlAdded(objectsender,ControlEventArgse)
  16. {
  17. if(!(e.ControlisUISizeDot))
  18. {
  19. this._HashUISizeKnob.Add(e.Control,newUISizeKnob(e.Control));
  20. this._HashUIMoveKnob.Add(e.Control,newUIMoveKnob(e.Control));
  21. //点击控件的时候,显示控件的选择
  22. e.Control.Click+=newEventHandler(Control_Click);
  23. }
  24. }
  25. voidControl_Click(objectsender,EventArgse)
  26. {
  27. //寿险清除已经选择的控件
  28. foreach(UISizeKnobknobinthis._HashUISizeKnob.Values)
  29. {
  30. knob.ShowUISizeDots(false);
  31. }
  32. try
  33. {
  34. ((UISizeKnob)this._HashUISizeKnob[sender]).ShowUISizeDots(true);
  35. }
  36. catch{}
  37. }

相对来说实现单个控件的拖动比较简单,而实现多个控件的拖动,我们需要首先使用一个全局的变量来缓存我们所选择的控件,然后在此类中。拖动的时候,通过遍历此全局变量,一个个改变所选择控件的位置。

相关文章:

C#基础系列:开发自己的窗体设计器(总纲)

C#基础系列:开发自己的窗体设计器(在容器上拖动鼠标增加控件)

C#基础系列:开发自己的窗体设计器(实现控件的选择)

分享到:
评论

相关推荐

    C#与halcon视觉软件窗体控件设计

    5. 自由窗体控件设计:在C#中,可以实现窗体控件的自由拖动和组合。这需要自定义控件的属性和方法,比如设置控件的拖放行为,以及处理控件之间的布局关系。 6. 实现通信:在窗体控件与Halcon之间建立通信,将处理...

    C# WinForm实现窗体上控件自由拖动功能示例

    C# WinForm实现窗体上控件自由拖动功能示例 本文主要介绍了C# WinForm实现窗体上控件自由拖动功能,涉及WinForm控件属性及事件响应相关操作技巧。下面是对该示例的详细解释: 一、WinForm控件属性 在WinForm中,...

    C# winform 运行时用户拖动窗体上控件大小位置

    在C# WinForm开发中,实现用户在运行时能够自由拖动窗体上的控件以及改变它们的大小和位置是一项常见的需求,这有助于提供高度可定制的用户界面。以下是一些关于这个主题的重要知识点和详细步骤: 1. **事件处理**...

    c#窗体设计器实现.rar

    所以我就想能够弄一个类似于vs2005的WinForm窗体设计器的开发平台,让用户拖拖拽拽就可以添加自己需要的控件,或者删除不需要的控件,从而完成大部分的工作,实现功能的扩展,而我需要做的,只不过是写写插件代码。...

    C#实现控件随窗体拖动而自动缩放其大小

    在C#编程中,实现控件随窗体拖动而自动缩放其大小是一个常见的需求,尤其是在设计响应式用户界面时。本文将深入探讨如何利用C#中的事件处理和属性调整来实现这一功能,帮助开发者创建更加用户友好的界面。 ### 核心...

    C#窗体最大化同时让控件自动缩放

    在C#编程中,创建一个窗体应用时,我们经常需要实现窗体的最大化功能,同时确保窗体内的控件能够随着窗体尺寸的变化而自动缩放,以保持界面的美观和用户友好性。本项目就是针对这一需求,提供了一个解决方案。通过...

    c#窗体之间的控件拖动

    在C#开发中,有时我们需要实现窗体间的控件拖动功能,比如将一个窗体上的控件拖拽到另一个窗体上。这种交互式的设计能够提高应用程序的用户体验。下面将详细介绍如何通过C#实现窗体之间的控件拖动。 #### 封装基础...

    C#程序实现控件位置大小随窗体变化而变化

    - 在Visual Studio的设计器中,可以通过直观地拖动控件并观察预览效果来设置锚定和自动调整大小属性,这使得布局调整变得更加简单和快速。 6. **性能考虑**: - 虽然动态调整控件大小和位置能提供更好的用户体验...

    C# 程序启动后 鼠标拖动窗体控件源码

    总之,"C#程序启动后鼠标拖动窗体控件源码"涉及到的是Windows Forms开发中的用户交互部分,尤其是如何利用鼠标事件实现控件的动态布局。理解并掌握这一技术,可以帮助开发者创建更灵活、更符合用户需求的桌面应用...

    c#控件连线拖动

    在C#编程中,"控件连线拖动"是一个常见的交互设计技术,它涉及到Windows Forms或WPF应用程序中的用户界面动态构建。在这个场景下,我们可以理解为开发人员创建了一个允许用户通过拖放操作来添加、移动和连接控件的...

    C#Winform控件随窗体缩放

    标题"**C# Winform控件随窗体缩放**"正是关于这个主题,描述中提到的是一种实现方式,通过整理博客上的资料来帮助初学者理解如何实现这一功能。 控件自动缩放是Windows应用程序设计中的一个重要概念,它涉及到...

    C# 新手实例:在窗体上显示图片和文字

    本实例将详细介绍如何在C#的WinForms应用中实现这一功能,这对于初学者来说是一个非常基础且实用的技能。 首先,你需要创建一个新的C# WinForms项目。在Visual Studio中,选择“文件”&gt;“新建”&gt;“项目”,然后在...

    C#不规则窗体(可拖动)

    在C#编程中,开发人员有时需要创建独特的用户界面,比如不规则形状的窗体,以提供更加个性化或与应用程序主题相匹配的视觉效果。"C#不规则窗体(可拖动)"这个主题就涉及到了这样的技术。下面将详细阐述如何在C#中实现...

    C#WinForm仿qq窗体拖到windows窗体边上时,自动隐藏C#WinForm

    2. **添加 Timer 组件**:在工具箱中找到 Timer 控件,并将其拖放到 Form 设计器中。然后设置 Timer 的 `Interval` 属性为 50 毫秒,表示每隔 50 毫秒触发一次事件。 3. **编写事件处理逻辑**: - 在 Form 加载事件...

    C#窗体设计:员工信息管理系统开发流程

    5. **编写代码**:为窗体控件添加事件处理程序,实现用户交互逻辑。例如,添加按钮的点击事件用于向数据库插入新员工信息,删除按钮用于根据选定的记录删除信息。 6. **数据操作**:使用SQL语句进行数据的CRUD...

    c#中通过控件拖动窗体

    在C#编程中,有时我们可能需要创建...通过理解并实践这个过程,你可以更深入地掌握C#窗体和事件处理机制,以及如何通过自定义逻辑实现特定的行为。记住,对于复杂的用户界面需求,理解和灵活运用基础编程概念至关重要。

    C# 实现动态创建控件 调整大小 拖动 自适应窗体

    总之,动态创建控件、调整大小、拖动以及自适应窗体是C#窗体应用开发中的重要技能,它们能帮助开发者构建更加灵活、用户友好的界面。通过理解和实践这些技术,你可以创建出满足各种需求的高效应用程序。

    无边框窗体Winform四周阴影效果C#实现

    在Windows应用程序开发中,我们有时会遇到需要创建具有专业外观和感觉的无边框窗体,比如带有阴影效果的窗体。本主题将详细讲解如何使用C#在Winform应用中实现无边框窗体的四周阴影效果。我们将主要探讨以下几个方面...

    C#中的控件拖拽程序源代码

    本资源提供的“C#中的控件拖拽程序源代码”正是针对这一需求,它实现了在C# WinForms应用中允许用户自定义拖动控件的功能。下面我们将详细探讨实现这一功能的关键知识点。 首先,拖放操作在C#中主要通过.NET ...

    C#控件拖动与改变大小

    "C#控件拖动与改变大小" 在本文中,我们将讨论如何在 C# 中实现控件的拖动和改变大小。这种功能在 Visual Studio .Net 中非常有用,特别是在开发桌面应用程序时。我们可以在设计时从控件工具栏拖拽若干个控件放置到...

Global site tag (gtag.js) - Google Analytics