C#窗体设计器开发实例详解

开发 后端
C#窗体设计器的开发实例这里主要向你介绍实现控件移动的功能,希望对通过介绍使你对了解和学习C#窗体设计器的开发有所帮助。

C#窗体设计器开发实例主要向你介绍控件移动,关键点就是需要设计一个独立于任何控件的类(UIMoveKnob)来控制控件的移动。我这里实现的方法只针对一个控件,如果需要同时选择多个控件,然后同时移动的话,你需要修改这个类,这里是有点难于控制,我使用的方法严重耦合,所以只在这里给出移动一个控件的办法,具体移动过个控件的方法请各位讨论。

C#窗体设计器开发目的:

要移动某个选定的控件,实现控件的: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));设置其关联性。

C#窗体设计器开发之UIMoveKnob的代码如下:

  1. public class UIMoveKnob   
  2. {   
  3. private System.Windows.Forms.Control _Owner;   
  4. private int _MouseClickAtX;   
  5. private int _MouseClickAtY;   
  6. private bool _BeginDrag;  
  7.  
  8. public UIMoveKnob(System.Windows.Forms.Control Owner)   
  9. {   
  10. this._Owner = Owner;  
  11.  
  12. this._Owner.MouseDown +=   
  13. new System.Windows.Forms.  
  14. MouseEventHandler(this.Owner_MouseDown);   
  15. this._Owner.MouseMove +=   
  16. new System.Windows.Forms.  
  17. MouseEventHandler(this.Owner_MouseMove);   
  18. this._Owner.MouseUp +=   
  19. new System.Windows.Forms.  
  20. MouseEventHandler(this.Owner_MouseUp);   
  21. }  
  22.  
  23. void Owner_MouseDown(  
  24. object sender,   
  25. System.Windows.Forms.MouseEventArgs e)   
  26. {   
  27. this._Owner.Cursor =   
  28. System.Windows.Forms.Cursors.Default;  
  29.  
  30. this._MouseClickAtX = e.X;   
  31. this._MouseClickAtY = e.Y;   
  32. this._BeginDrag = true;   
  33. }  
  34.  
  35. void Owner_MouseMove(  
  36. object sender,   
  37. System.Windows.Forms.MouseEventArgs e)   
  38. {   
  39. try   
  40. {   
  41. if (this._BeginDrag)   
  42. {   
  43. Rectangle rect;  
  44.  
  45. /*   
  46.  * 对于下列控件,是不能拖动的,所以这里也不绘制拖动边框   
  47.  * TabPage,   
  48.  */   
  49. if (this._Owner is System.Windows.Forms.TabPage)   
  50. {   
  51. //   
  52. }   
  53. else   
  54. {   
  55. this._Owner.Location =   
  56. new Point(this._Owner.Left +   
  57. e.X - this._MouseClickAtX,   
  58. this._Owner.Top + e.Y - this._MouseClickAtY);   
  59. }   
  60. }   
  61. }   
  62. catch { }   
  63. }  
  64.  
  65. void Owner_MouseUp(object sender,   
  66. System.Windows.Forms.MouseEventArgs e)   
  67. {   
  68. this._BeginDrag = false;   
  69. this._Owner.Parent.Refresh();   
  70. }   
  71. }  

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

  1. private MouseHook _MouseHook;   
  2. //我们将所有的已经与具体控件关联了的UISizeKnob缓存在这个HashTable中   
  3. private Hashtable _HashUISizeKnob;   
  4. //负责控件移动的类   
  5. private Hashtable _HashUIMoveKnob;  
  6.  
  7. public Form1()   
  8. {   
  9. InitializeComponent();  
  10.  
  11. this._MouseHook = new MouseHook(this);  
  12.  
  13. this._HashUISizeKnob = new Hashtable();   
  14. this._HashUIMoveKnob = new Hashtable();  
  15.  
  16. //为了简洁明了,我们在ControlAdded中来设置具体控件和UISizeKnob的关联   
  17. this.ControlAdded += new ControlEventHandler(Form1_ControlAdded);   
  18. }  
  19.  
  20. void Form1_ControlAdded(object sender, ControlEventArgs e)   
  21. {   
  22. if (!(e.Control is UISizeDot))   
  23. {   
  24. this._HashUISizeKnob.Add(e.Control, new UISizeKnob(e.Control));   
  25. this._HashUIMoveKnob.Add(e.Control, new UIMoveKnob(e.Control));   
  26.    
  27. //点击控件的时候,显示控件的选择   
  28. e.Control.Click += new EventHandler(Control_Click);   
  29. }   
  30. }  
  31.  
  32. void Control_Click(object sender, EventArgs e)   
  33. {   
  34. //寿险清除已经选择的控件   
  35. foreach (UISizeKnob knob in this._HashUISizeKnob.Values)   
  36. {   
  37. knob.ShowUISizeDots(false);   
  38. }  
  39.  
  40. try    
  41. {   
  42. ((UISizeKnob)this._HashUISizeKnob[sender]).ShowUISizeDots(true);   
  43. }   
  44. catch { }   
  45. }  

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

C#窗体设计器开发的一个实例的介绍就到这里,希望对你了解和学习C#窗体设计器开发有所帮助。

【编辑推荐】

  1. 详解C#中不同类的类型
  2. 浅谈C#中标准Dispose模式的实现
  3. C#选择正确的集合进行编码
  4. C# 4.0新特性:协变与逆变中的编程思想
  5. C#应用Attribute特性 代码统计分析
责任编辑:仲衡 来源: CSDN博客
相关推荐

2009-08-26 11:07:36

C#打印窗体

2009-09-07 06:31:32

C#窗体移动

2009-09-07 06:48:13

C#透明窗体

2009-09-07 06:07:46

C#窗体设计

2009-08-31 09:41:05

C#反射静态方法开发

2009-09-07 05:10:52

C#模式窗体

2009-09-03 18:55:08

C#判断浏览器

2009-09-03 19:00:15

C#判断浏览器

2009-09-07 03:44:50

C#窗体间传值

2009-09-02 17:12:06

C#关机代码

2009-08-18 10:14:19

C#插件构架

2009-09-11 12:31:52

C#实例详解TypeConvert

2009-08-20 11:01:51

C#操作内存

2009-09-22 17:53:32

C# COM组件开发

2009-09-07 05:40:16

C#窗体位置C#窗体大小

2009-08-18 17:05:08

C#操作xml文件

2009-08-28 12:47:30

C#静态方法应用

2009-09-02 17:28:26

C#程序设计Windows窗体

2009-08-28 13:12:56

C#反射实例C#反射

2009-09-02 19:12:37

C#递归
点赞
收藏

51CTO技术栈公众号