日期:2014-05-18  浏览次数:20794 次

请问,我想做个像编程设计器那样的东东,可以创建控件,创建后还可以移动该控件,该怎么做呢?
我想做的是,比如在窗体一侧有Button、label、textbox等控件,可以拖动其到窗体指定范围生成新控件,并且通过鼠标、键盘移动新生成控件的位置。
现在创建控件我知道怎么做,移动指定控件也知道怎么做,但不知道我创建后的控件该怎么移动?
主要是移动控件要知道是要移动哪个控件,比如Button1,可以通过设置其Top,Left属性移动。但是,程序运行后生成的控件,我怎么设定其属性?
我该怎么捕捉移动的是哪个控件,并设置其属性呢?
怎么实现类似设计器中的用鼠标多选控件并移动其位置的功能(用鼠标和键盘控制)?
哦,还有,移动button可以用e.Data.GetData(typeof(Button))来知道移动的是哪个button,用e.Data.GetData(typeof(Label))知道移动的是哪个label
但当button、label、textbox等都存在窗体中时,我怎么知道移动的是哪个控件?
我邮箱chaojitanke2003@yahoo.com.cn,哪位大侠有源码麻烦给发下哈

------解决方案--------------------
使用skinfeature界面换肤组件啊。 完全支持c#的。界面精致,而且效果很棒!! 而且基本不需要编写代码就能实现播放器界面。
www.skinfeature.com
------解决方案--------------------
http://www.skinfeature.com
------解决方案--------------------
http://blog.csdn.net/csharp_start/archive/2008/08/21/2806959.aspx
------解决方案--------------------
直接用FORM的话,不是很容易作到,通常,我们都采用创建一个容器(当然这个容器也可以是FORM),在容器中定义一个
选中的控件集合,你在拖动鼠标范围的时候,会有一个矩形范围,这个范围与控件所在位置的重叠区域可以判断是哪些控件在刚才鼠标拖动的范围内,这个时候,你就要在数组中加入这些控件,并绘制他们被选中时的8个选择点.
移动的时候,遍历这个数组,来达到所有选择控件的移动,缩放同理.如果是用键盘控制,判断键盘消息,操作比较类似.
对齐的操作与移动比较相似,无非是找一个对齐基点,这个基点可以是第一个被选中的控件,也可以是最后一个.
------解决方案--------------------
sharpdevelop.net/OpenSource/SD/
------解决方案--------------------
#region ' >> using 

using System;
using System.Collections;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;

#endregion
namespace MovableControllerTest
{
/// <summary>
/// 用于相关控件的大小变更和移动</summary>
///
public class MovableController
{

//// constructor 
//#region ' + constructor () 
///// <summary>
///// MovableController 初始化新实例</summary>
/////
//public MovableController()
//{
//}
//#endregion


// field 
#region ' >> field 

private Control _control;

private bool _isDraggingForResizing = false;
private bool _isDraggingForMove = false;

private int _resizingBorderWidth = 5;
private Size _minimumSize = new Size( 39, 20 );//控件最小尺寸

private Size _controlBeforeSize;//移动之前控件大小
private Point _controlBeforeLocation;//移动之前控件的坐标
private Point _cursorBeforeLocation;

private LocationKind _draggingKind;//鼠标的种类

private ArrayList _attachedControls = new ArrayList();//控件动态数组

#endregion


// property 
#region ' + ResizingBorderWidth : int { get,set } 
/// <summary>
/// 为变更控件大小 取得或设置边界宽度
/// 默认值为10</summary>
/// 
/// <exception cref="System.ArgumentOutOfRangeException">
/// value小于0</exception>
///
public int ResizingBorderWidth
{
get { return _resizingBorderWidth; }
set
{
if ( value <= 0 ) throw new ArgumentOutOfRangeException( "小于0" );

_resizingBorderWidth = value;
}
}
#endregion

#region ' + MinimumSize : Size { get,set } 
/// <summary>
/// 取得或设置变更控件大小时的最小值</summary>
/// <remarks>
/// 由于用于大小变更的位置种类有9种
/// 要设定的大小的高度和宽度都必须是ResizingBorderWidth的3倍以上</remarks>
///
/// <exception cref="System.ArgumentOutOfRangeException">
/// value 的 Height 属性未到 ResizingBorderWidth 的 3 倍
/// value 的 Width 属性未到 ResizingBorderWidth 的 3 倍</exception>