saybody 发表于 2013-1-26 12:39:51

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

本文我们实现一个简单的通过拖动鼠标来增加控件的方法。
在我们使用vs2005来开发WinForm应用程序的时候,我们通过选择左边“工具箱”中的某个控件,然后在我们自己的窗体上通过拖动鼠标,一个我们需要的控件就出现了,觉得很爽!其实vs2005中已经有这方面的组件,我们通过简单的代码就可以直接使用,这个你可以用“窗体设计器”Google一下,已经有人做了这方面的介绍。
所以我要说的是,难道除了使用vs2005中提供的这个标准组件,就不能自己弄出一个来?即使不够强大,但是最终都是自己折腾出来的,所以也会很爽。下面我就这个功能点做一个介绍,实现效果图如下:
http://p.blog.csdn.net/images/p_blog_csdn_net/RonoTian/EntryImages/20081027/%E6%8B%96%E5%8A%A8%E9%BC%A0%E6%A0%87%E5%A2%9E%E5%8A%A0%E6%8E%A7%E4%BB%B6.jpg

<span style="">实现关键点:
1、动态加载控件:
在vs2005中,在某个容器控件上增加新的子控件相当的简单,语法如下,如,增加一个TextBox:
Control.Controls.Add(new TextBox());
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

2、选择要添加的控件:
通过一个全局的单件类来实现。


3、捕获窗体(或者容器控件,比如Panel,GroupBox等)上鼠标的移动区域,并绘制选择框,如上图中黑色的框。


对于1,是很容易实现的,所以不是我们讨论的重点,我主要讨论2和3点。


第2点:选择需要添加的控件,为了尽量的使Winform中的代码简洁,以及和其它的部分解耦,我们尽量不要考虑在WinForm中使用全局变量或者与其它模块通信的接口。所以我们使用一个单件类SettingService来作为Winform和其它部分通信的中介。
<span style=""><div class="highlighter">
[*]publicclassSettingService
[*]{
[*]privatestaticSettingService_Instance;
[*]privateSystem.Windows.Forms.Control_SelectedToolBoxControl;
[*]
[*]///<summary>
[*]///在Form中,选择了某个要添加的控件后,这里保存这个控件的一个新实例
[*]///</summary>
[*]publicSystem.Windows.Forms.ControlSelectedToolBoxControl
[*]{
[*]get{returnthis._SelectedToolBoxControl;}
[*]set{this._SelectedToolBoxControl=value;}
[*]}
[*]
[*]privateSettingService()
[*]{}
[*]
[*]///<summary>
[*]///这里使用单件
[*]///</summary>
[*]publicstaticSettingServiceInstance
[*]{
[*]get
[*]{
[*]if(_Instance==null)
[*]{
[*]_Instance=newSettingService();
[*]}
[*]
[*]return_Instance;
[*]}
[*]}
[*]}
页: [1]
查看完整版本: C#基础系列:开发自己的窗体设计器(在容器上拖动鼠标增加控件)