紧急求助:关于图形界面和鼠标拖拽,希望大家能给我点思路 需要实现功能:某个页面的左边有代表某个生产过程的各个工序图形,右边是工序流程图,用户直接用鼠标点击左边工序的图形托拽到右边工序流程图上,就在该工序流程中增加了一个工序并弹出对话框,输入工序基本信息。 问:这样的功能可以用什么技术实现,最好是在.net框架中的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 就是要实现和.net开发环境中控件拖动类似的功能,自己先顶了 谢谢lixuezhi(中子星) ,我现在也实现了些基本功能,就是不知道该如何和数据库交互 一个小图形是一个控件,把对象加上事件.不就可以拉.至于拖动,我有个想法不知道可行不就是扑捉鼠标左键的点击事件,moving事件和松开事件.点击事件的时候,确定是否是在一个图形上点击.moving的时候,更改点击的那个控件的位置坐标.松开的时候判断是否可以,如果不可以,图形返回开始位置. 看你这么急,给你一个例子和源程序参看如下文章,很不错http://www.codeproject.com/csharp/csmapviewnet01.asphttp://www.codeproject.com/dotnet/Mapview.asphttp://www.codeproject.com/csharp/canvasgis.asp 建议用C++做个控件,vb.net也可以做自定义控件,我这有个例子,如需要,发消息,告诉我E——MAIL 汗..真是英雄所见略同啊.我现在也在做类似的程序.要求小图能放大缩小,移动,而且有背景图,小图能随背景图放大缩小和移动.其中还有一类小图要求能以任意角度转动.而且小图是动画,非静态的.目前我只实现了小图的放大缩小和移动,其他的尚未实现.我是参考http://www.codeproject.com/csharp/DrawTools.asp ,它应该很符合你的要求,我的实现就是根据这个来的.中文翻译http://wdxinren.cnblogs.com/archive/2004/10/19/54231.aspx不过各位大虾,你们在编写类似程序时,难道没有遇到过cpu占用过高的问题吗?我可是遇到了啊,目前没有任何良好的解决思路.我也发过帖子求助,不过回帖的都太泛泛了....郁闷中 #region 用于拖动的用户变量 private Collection<clsDragControlsKnockdown> mcControls = new Collection<clsDragControlsKnockdown>(); private const int muMinSize = 10; //对控缩放的最小值 private const int muBoxSize = 7; //调整大小触模柄方框大小 private Control muFocusedControl = null; private bool muIsCtrlKey = false; private Control muMControl = null; private bool muIsMouseDown = false; private Point muPointClicked; private Color muBoxColor = Color.White; private Label[] mulbl = new Label[8]; private int muStartl, muStartt, muStartw, muStarth; private bool muDragging; private Cursor[] muArrArrow = new Cursor[] {Cursors.SizeNWSE, Cursors.SizeNS, Cursors.SizeNESW, Cursors.SizeWE, Cursors.SizeNWSE, Cursors.SizeNS, Cursors.SizeNESW, Cursors.SizeWE}; #endregion #region 需拖动控件鼠标事件 /// <summary> /// 构造控件拖动对象 /// </summary> /// <param name="moveControl">需要拖动的控件</param> private void InitDragControl(Control moveControl) { muMControl = moveControl; muMControl.MouseDown += new MouseEventHandler(this.Control_MouseDown); muMControl.MouseUp += new MouseEventHandler(this.Control_MouseUp); muMControl.MouseMove += new MouseEventHandler(this.Control_MouseMove); muMControl.Click += new System.EventHandler(this.Control_Click); //构造8个调整大小触模柄 for (int i = 0; i < 8; i++) { mulbl[i] = new Label(); mulbl[i].Tag = "HandleLable"; mulbl[i].TabIndex = i; mulbl[i].FlatStyle = 0; mulbl[i].Parent = this; mulbl[i].BorderStyle = BorderStyle.FixedSingle; mulbl[i].BackColor = muBoxColor; mulbl[i].Cursor = muArrArrow[i]; mulbl[i].Text = ""; mulbl[i].BringToFront(); mulbl[i].MouseDown += new MouseEventHandler(this.handle_MouseDown); mulbl[i].MouseMove += new MouseEventHandler(this.handle_MouseMove); mulbl[i].MouseUp += new MouseEventHandler(this.handle_MouseUp); } Create(); } private void split_click(object sender, System.EventArgs e) { muMControl = (sender as Control); muMControl.Focus(); muFocusedControl = (sender as Control); //MessageBox.Show(P.Parent.Controls.Count.ToString()); } private void Control_Click(object sender, System.EventArgs e) { muMControl = (sender as Control); muMControl.Focus(); MoveHandles(); if (muIsCtrlKey == false) { for (int i = 0; i < this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls.Count; i++) { if (this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls[i].Text.Trim().Length == 0 && this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls[i] is Label) { this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls[i].Visible = false; } } } ShowHandles(); //选中某个控件后,需要触发事件,使属性窗口中有相应的属性 if (this.mcControls[int.Parse(muMControl.Tag.ToString())].msControlType != null && this.mcControls[int.Parse(muMControl.Tag.ToString())].msControlType.Length > 0) { if (this.ControlSelectedProperty != null) { this.ControlSelectedProperty(muMControl, new EventArgsControlSelectedProperty(this.mcControls[int.Parse(muMControl.Tag.ToString())].msControlType)); } } //在工具箱中有相应的动作 if (this.ControlDragDrop == null) { return; } if (this.muMControl.Tag == null) { return; } if (this.mcControls[int.Parse(muMControl.Tag.ToString())].miKnockdownGroupIndex < 0) { return; } this.ControlDragDrop(this, new EventArgsControlDragDrop(this.mcControls[int.Parse(muMControl.Tag.ToString())].miKnockdownGroupIndex)); } private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { muMControl = (sender as Control); if (this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent == null) { return; } muIsMouseDown = true; muFocusedControl = (sender as Control); muPointClicked = new Point(e.X, e.Y); for (int i = 0; i < 8; i++) { this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls.Add(mulbl[i]); mulbl[i].BringToFront(); } HideHandles(); } private void Control_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { Control tuControl = (sender as Control); this.UpdateControlInfomation(tuControl); muIsMouseDown = false; //MoveHandles(); //ShowHandles(); //muMControl.Visible = true; } private void Control_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { if (!muIsMouseDown) { return; } if (this.muFocusedControl == null) { return; } if (this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent == this) { return; } if (muIsMouseDown) { int l = muMControl.Left + e.X - muPointClicked.X; int t = muMControl.Top + e.Y - muPointClicked.Y; int w = muMControl.Width; int h = muMControl.Height; //l = (l < 0) ? 0 : ((l + w > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Width) ? // this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Width - w : l); //t = (t < 0) ? 0 : ((t + h > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Height) ? // this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Height - h : t); muMControl.Left = l; muMControl.Top = t; //ControlLocality(); } muMControl.Cursor = Cursors.SizeAll; } #endregion #region 调整大小触模柄鼠标事件 private void handle_MouseDown(object sender, MouseEventArgs e) { muDragging = true; muStartl = muMControl.Left; muStartt = muMControl.Top; muStartw = muMControl.Width; muStarth = muMControl.Height; HideHandles(); } //// 通过触模柄调整控件大小 //// 0 1 2 //// 7 3 //// 6 5 4 private void handle_MouseMove(object sender, MouseEventArgs e) { int l = muMControl.Left; int w = muMControl.Width; int t = muMControl.Top; int h = muMControl.Height; if (muMControl == this.mvPanel) { l = 0; t = 0; } if (muDragging) { switch (((Label)sender).TabIndex) { //l算法:控件左边X坐标 + 鼠标在触模柄X坐标 < 控件左边X坐标 + 父控件宽度 - 控件大小 ?控件左边X坐标 + 鼠标在触模柄X坐标 :控件左边X坐标 + 父控件宽度 - 控件大小 //t算法: //w算法: //h算法: case 0: // muDragging top-left sizing box l = muStartl + e.X < muStartl + muStartw - muMinSize ? muStartl + e.X : muStartl + muStartw - muMinSize; t = muStartt + e.Y < muStartt + muStarth - muMinSize ? muStartt + e.Y : muStartt + muStarth - muMinSize; w = muStartl + muStartw - muMControl.Left; h = muStartt + muStarth - muMControl.Top; break; case 1: // muDragging top-center sizing box t = muStartt + e.Y < muStartt + muStarth - muMinSize ? muStartt + e.Y : muStartt + muStarth - muMinSize; h = muStartt + muStarth - muMControl.Top; break; case 2: // muDragging top-right sizing box w = muStartw + e.X > muMinSize ? muStartw + e.X : muMinSize; t = muStartt + e.Y < muStartt + muStarth - muMinSize ? muStartt + e.Y : muStartt + muStarth - muMinSize; h = muStartt + muStarth - muMControl.Top; break; case 3: // muDragging right-middle sizing box w = muStartw + e.X > muMinSize ? muStartw + e.X : muMinSize; break; case 4: // muDragging right-bottom sizing box w = muStartw + e.X > muMinSize ? muStartw + e.X : muMinSize; h = muStarth + e.Y > muMinSize ? muStarth + e.Y : muMinSize; break; case 5: // muDragging center-bottom sizing box h = muStarth + e.Y > muMinSize ? muStarth + e.Y : muMinSize; break; case 6: // muDragging left-bottom sizing box l = muStartl + e.X < muStartl + muStartw - muMinSize ? muStartl + e.X : muStartl + muStartw - muMinSize; w = muStartl + muStartw - muMControl.Left; h = muStarth + e.Y > muMinSize ? muStarth + e.Y : muMinSize; break; case 7: // muDragging left-middle sizing box l = muStartl + e.X < muStartl + muStartw - muMinSize ? muStartl + e.X : muStartl + muStartw - muMinSize; w = muStartl + muStartw - muMControl.Left; break; } l = (l < 0) ? 0 : l; t = (t < 0) ? 0 : t; muMControl.SetBounds(l, t, w, h); } } private void handle_MouseUp(object sender, MouseEventArgs e) { muDragging = false; MoveHandles(); ShowHandles(); } #endregion #region Create方法 private void Create() { if (this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent == null) { return; } for (int i = 0; i < 8; i++) { this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls.Add(mulbl[i]); mulbl[i].BringToFront(); } HideHandles(); } private void ControlLocality() { if (muMControl.Location.X < 0) { muMControl.Visible = false; muMControl.Left = 0; } if (muMControl.Location.Y < 0) { muMControl.Visible = false; muMControl.Top = 0; } if (muMControl.Location.X + muMControl.Width > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Width) { muMControl.Visible = false; muMControl.Left = this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Width - muMControl.Width; } if (muMControl.Location.Y + muMControl.Height > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Height) { muMControl.Visible = false; muMControl.Top = this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Height - muMControl.Height; } } private void HideHandles() { for (int i = 0; i < 8; i++) { mulbl[i].Visible = false; } } private void MoveHandles() { int sX = muMControl.Left - muBoxSize; int sY = muMControl.Top - muBoxSize; int sW = muMControl.Width + muBoxSize; int sH = muMControl.Height + muBoxSize; int hB = muBoxSize / 2; int[] arrPosX = new int[] {sX+hB, sX + sW / 2, sX + sW-hB, sX + sW-hB, sX + sW-hB, sX + sW / 2, sX+hB, sX+hB}; int[] arrPosY = new int[] {sY+hB, sY+hB, sY+hB, sY + sH / 2, sY + sH-hB, sY + sH-hB, sY + sH-hB, sY + sH / 2}; for (int i = 0; i < 8; i++) { mulbl[i].SetBounds(arrPosX[i], arrPosY[i], muBoxSize, muBoxSize); } } private void ShowHandles() { if (this.muFocusedControl == null) { return; } if (muMControl != null) { //for (int i = 0; i < 8; i++) //{ // mulbl[i].Visible = true; //} mulbl[3].Visible = true; mulbl[4].Visible = true; mulbl[5].Visible = true; if (muMControl.Tag != null && muMControl.Tag.ToString().Length>0) { int tiControlIndex=-1; try { tiControlIndex = Convert.ToInt16(muMControl.Tag.ToString()); } catch (Exception ex) { return; } if (tiControlIndex < 0 || tiControlIndex > this.mcControls.Count) { return; } if (this.mcControls[tiControlIndex].mcParent == this) { mulbl[7].Visible = false; mulbl[1].Visible = false; mulbl[0].Visible = false; mulbl[2].Visible = false; mulbl[6].Visible = false; } else { mulbl[7].Visible = true; mulbl[1].Visible = true; mulbl[0].Visible = true; mulbl[2].Visible = true; mulbl[6].Visible = true; } } else { mulbl[7].Visible = true; mulbl[1].Visible = true; mulbl[0].Visible = true; mulbl[2].Visible = true; mulbl[6].Visible = true; } } } #endregion这是我的代码,不过有一些你需要改或者用不着,我就没帮你挑出来了,你可以看看思路哈InitDragControl()是入口 int l = muMControl.Left + e.X - muPointClicked.X; int t = muMControl.Top + e.Y - muPointClicked.Y; int w = muMControl.Width; int h = muMControl.Height; //l = (l < 0) ? 0 : ((l + w > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Width) ? // this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Width - w : l); //t = (t < 0) ? 0 : ((t + h > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Height) ? // this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Height - h : t); muMControl.Left = l; muMControl.Top = t; //ControlLocality(); 解析通讯发过来的一个包 请大家帮帮忙了?????急!!! 多线程文件读写问题 请教高手,C#可以实现SSH通讯数据的获取吗,比如使用SOCKET来获取TELNET那样的! 学校局域网中老是IP冲突,想写一个程序,解决此问题...请高手赐教... 关于ComboBox的问题,请进! 一个frame页面的问题。 求C#复制指定文件夹下所有文件和文件夹的类写法 如何在DataView中添加记录、删除满足条件的记录 在Web Form中傳值 为何try没有出现错误,却要执行catch 里的代码呢?? 求一个session问题,,急急,,谢谢,只有10分了,
至于拖动,我有个想法不知道可行不
就是扑捉鼠标左键的点击事件,moving事件和松开事件.
点击事件的时候,确定是否是在一个图形上点击.
moving的时候,更改点击的那个控件的位置坐标.
松开的时候判断是否可以,如果不可以,图形返回开始位置.
参看如下文章,很不错
http://www.codeproject.com/csharp/csmapviewnet01.asp
http://www.codeproject.com/dotnet/Mapview.asp
http://www.codeproject.com/csharp/canvasgis.asp
我这有个例子,如需要,发消息,告诉我E——MAIL
目前我只实现了小图的放大缩小和移动,其他的尚未实现.
我是参考http://www.codeproject.com/csharp/DrawTools.asp ,它应该很符合你的要求,我的实现就是根据这个来的.中文翻译http://wdxinren.cnblogs.com/archive/2004/10/19/54231.aspx不过各位大虾,你们在编写类似程序时,难道没有遇到过cpu占用过高的问题吗?我可是遇到了啊,目前没有任何良好的解决思路.我也发过帖子求助,不过回帖的都太泛泛了....郁闷中
private Collection<clsDragControlsKnockdown> mcControls = new Collection<clsDragControlsKnockdown>();
private const int muMinSize = 10; //对控缩放的最小值
private const int muBoxSize = 7; //调整大小触模柄方框大小
private Control muFocusedControl = null;
private bool muIsCtrlKey = false;
private Control muMControl = null;
private bool muIsMouseDown = false;
private Point muPointClicked;
private Color muBoxColor = Color.White;
private Label[] mulbl = new Label[8];
private int muStartl, muStartt, muStartw, muStarth;
private bool muDragging;
private Cursor[] muArrArrow = new Cursor[] {Cursors.SizeNWSE, Cursors.SizeNS,
Cursors.SizeNESW, Cursors.SizeWE, Cursors.SizeNWSE, Cursors.SizeNS,
Cursors.SizeNESW, Cursors.SizeWE};
#endregion
#region 需拖动控件鼠标事件
/// <summary>
/// 构造控件拖动对象
/// </summary>
/// <param name="moveControl">需要拖动的控件</param>
private void InitDragControl(Control moveControl)
{ muMControl = moveControl;
muMControl.MouseDown += new MouseEventHandler(this.Control_MouseDown);
muMControl.MouseUp += new MouseEventHandler(this.Control_MouseUp);
muMControl.MouseMove += new MouseEventHandler(this.Control_MouseMove);
muMControl.Click += new System.EventHandler(this.Control_Click); //构造8个调整大小触模柄
for (int i = 0; i < 8; i++)
{
mulbl[i] = new Label();
mulbl[i].Tag = "HandleLable";
mulbl[i].TabIndex = i;
mulbl[i].FlatStyle = 0;
mulbl[i].Parent = this;
mulbl[i].BorderStyle = BorderStyle.FixedSingle;
mulbl[i].BackColor = muBoxColor;
mulbl[i].Cursor = muArrArrow[i];
mulbl[i].Text = "";
mulbl[i].BringToFront();
mulbl[i].MouseDown += new MouseEventHandler(this.handle_MouseDown);
mulbl[i].MouseMove += new MouseEventHandler(this.handle_MouseMove);
mulbl[i].MouseUp += new MouseEventHandler(this.handle_MouseUp);
}
Create();
}
private void split_click(object sender, System.EventArgs e)
{
muMControl = (sender as Control);
muMControl.Focus();
muFocusedControl = (sender as Control);
//MessageBox.Show(P.Parent.Controls.Count.ToString());
}
private void Control_Click(object sender, System.EventArgs e)
{
muMControl = (sender as Control);
muMControl.Focus();
MoveHandles(); if (muIsCtrlKey == false)
{
for (int i = 0; i < this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls.Count; i++)
{
if (this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls[i].Text.Trim().Length == 0 && this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls[i] is Label)
{
this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls[i].Visible = false;
}
}
}
ShowHandles();
//选中某个控件后,需要触发事件,使属性窗口中有相应的属性
if (this.mcControls[int.Parse(muMControl.Tag.ToString())].msControlType != null && this.mcControls[int.Parse(muMControl.Tag.ToString())].msControlType.Length > 0)
{
if (this.ControlSelectedProperty != null)
{
this.ControlSelectedProperty(muMControl, new EventArgsControlSelectedProperty(this.mcControls[int.Parse(muMControl.Tag.ToString())].msControlType));
}
}
//在工具箱中有相应的动作
if (this.ControlDragDrop == null)
{
return;
}
if (this.muMControl.Tag == null)
{
return;
}
if (this.mcControls[int.Parse(muMControl.Tag.ToString())].miKnockdownGroupIndex < 0)
{
return;
}
this.ControlDragDrop(this, new EventArgsControlDragDrop(this.mcControls[int.Parse(muMControl.Tag.ToString())].miKnockdownGroupIndex)); } private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
muMControl = (sender as Control);
if (this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent == null)
{
return;
}
muIsMouseDown = true;
muFocusedControl = (sender as Control); muPointClicked = new Point(e.X, e.Y);
for (int i = 0; i < 8; i++)
{
this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls.Add(mulbl[i]);
mulbl[i].BringToFront();
}
HideHandles();
} private void Control_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
Control tuControl = (sender as Control);
this.UpdateControlInfomation(tuControl);
muIsMouseDown = false;
//MoveHandles();
//ShowHandles();
//muMControl.Visible = true;
} private void Control_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (!muIsMouseDown)
{
return;
}
if (this.muFocusedControl == null)
{
return;
} if (this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent == this)
{
return;
} if (muIsMouseDown)
{
int l = muMControl.Left + e.X - muPointClicked.X;
int t = muMControl.Top + e.Y - muPointClicked.Y;
int w = muMControl.Width;
int h = muMControl.Height;
//l = (l < 0) ? 0 : ((l + w > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Width) ?
// this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Width - w : l);
//t = (t < 0) ? 0 : ((t + h > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Height) ?
// this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Height - h : t);
muMControl.Left = l;
muMControl.Top = t;
//ControlLocality();
}
muMControl.Cursor = Cursors.SizeAll;
} #endregion #region 调整大小触模柄鼠标事件 private void handle_MouseDown(object sender, MouseEventArgs e)
{
muDragging = true;
muStartl = muMControl.Left;
muStartt = muMControl.Top;
muStartw = muMControl.Width;
muStarth = muMControl.Height;
HideHandles();
}
//// 0 1 2
//// 7 3
//// 6 5 4
private void handle_MouseMove(object sender, MouseEventArgs e)
{
int l = muMControl.Left;
int w = muMControl.Width;
int t = muMControl.Top;
int h = muMControl.Height;
if (muMControl == this.mvPanel)
{
l = 0;
t = 0;
}
if (muDragging)
{
switch (((Label)sender).TabIndex)
{
//l算法:控件左边X坐标 + 鼠标在触模柄X坐标 < 控件左边X坐标 + 父控件宽度 - 控件大小 ?控件左边X坐标 + 鼠标在触模柄X坐标 :控件左边X坐标 + 父控件宽度 - 控件大小
//t算法:
//w算法:
//h算法:
case 0: // muDragging top-left sizing box
l = muStartl + e.X < muStartl + muStartw - muMinSize ? muStartl + e.X : muStartl + muStartw - muMinSize;
t = muStartt + e.Y < muStartt + muStarth - muMinSize ? muStartt + e.Y : muStartt + muStarth - muMinSize;
w = muStartl + muStartw - muMControl.Left;
h = muStartt + muStarth - muMControl.Top;
break;
case 1: // muDragging top-center sizing box
t = muStartt + e.Y < muStartt + muStarth - muMinSize ? muStartt + e.Y : muStartt + muStarth - muMinSize;
h = muStartt + muStarth - muMControl.Top;
break;
case 2: // muDragging top-right sizing box
w = muStartw + e.X > muMinSize ? muStartw + e.X : muMinSize;
t = muStartt + e.Y < muStartt + muStarth - muMinSize ? muStartt + e.Y : muStartt + muStarth - muMinSize;
h = muStartt + muStarth - muMControl.Top;
break;
case 3: // muDragging right-middle sizing box
w = muStartw + e.X > muMinSize ? muStartw + e.X : muMinSize;
break;
case 4: // muDragging right-bottom sizing box
w = muStartw + e.X > muMinSize ? muStartw + e.X : muMinSize;
h = muStarth + e.Y > muMinSize ? muStarth + e.Y : muMinSize;
break;
case 5: // muDragging center-bottom sizing box
h = muStarth + e.Y > muMinSize ? muStarth + e.Y : muMinSize;
break;
case 6: // muDragging left-bottom sizing box
l = muStartl + e.X < muStartl + muStartw - muMinSize ? muStartl + e.X : muStartl + muStartw - muMinSize;
w = muStartl + muStartw - muMControl.Left;
h = muStarth + e.Y > muMinSize ? muStarth + e.Y : muMinSize;
break;
case 7: // muDragging left-middle sizing box
l = muStartl + e.X < muStartl + muStartw - muMinSize ? muStartl + e.X : muStartl + muStartw - muMinSize;
w = muStartl + muStartw - muMControl.Left;
break;
}
l = (l < 0) ? 0 : l;
t = (t < 0) ? 0 : t;
muMControl.SetBounds(l, t, w, h);
}
} private void handle_MouseUp(object sender, MouseEventArgs e)
{
muDragging = false;
MoveHandles();
ShowHandles();
} #endregion
{
if (this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent == null)
{
return;
}
for (int i = 0; i < 8; i++)
{
this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls.Add(mulbl[i]);
mulbl[i].BringToFront();
} HideHandles();
}
private void ControlLocality()
{
if (muMControl.Location.X < 0)
{
muMControl.Visible = false;
muMControl.Left = 0;
}
if (muMControl.Location.Y < 0)
{
muMControl.Visible = false;
muMControl.Top = 0;
}
if (muMControl.Location.X + muMControl.Width > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Width)
{
muMControl.Visible = false;
muMControl.Left = this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Width - muMControl.Width;
}
if (muMControl.Location.Y + muMControl.Height > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Height)
{
muMControl.Visible = false;
muMControl.Top = this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Height - muMControl.Height;
}
} private void HideHandles()
{
for (int i = 0; i < 8; i++)
{
mulbl[i].Visible = false;
}
} private void MoveHandles()
{
int sX = muMControl.Left - muBoxSize;
int sY = muMControl.Top - muBoxSize;
int sW = muMControl.Width + muBoxSize;
int sH = muMControl.Height + muBoxSize;
int hB = muBoxSize / 2;
int[] arrPosX = new int[] {sX+hB, sX + sW / 2, sX + sW-hB, sX + sW-hB,
sX + sW-hB, sX + sW / 2, sX+hB, sX+hB};
int[] arrPosY = new int[] {sY+hB, sY+hB, sY+hB, sY + sH / 2, sY + sH-hB,
sY + sH-hB, sY + sH-hB, sY + sH / 2};
for (int i = 0; i < 8; i++)
{
mulbl[i].SetBounds(arrPosX[i], arrPosY[i], muBoxSize, muBoxSize);
}
} private void ShowHandles()
{
if (this.muFocusedControl == null)
{
return;
}
if (muMControl != null)
{
//for (int i = 0; i < 8; i++)
//{
// mulbl[i].Visible = true;
//}
mulbl[3].Visible = true;
mulbl[4].Visible = true;
mulbl[5].Visible = true;
if (muMControl.Tag != null && muMControl.Tag.ToString().Length>0)
{
int tiControlIndex=-1;
try
{
tiControlIndex = Convert.ToInt16(muMControl.Tag.ToString());
}
catch (Exception ex)
{
return;
}
if (tiControlIndex < 0 || tiControlIndex > this.mcControls.Count)
{
return;
}
if (this.mcControls[tiControlIndex].mcParent == this)
{
mulbl[7].Visible = false;
mulbl[1].Visible = false;
mulbl[0].Visible = false;
mulbl[2].Visible = false;
mulbl[6].Visible = false;
}
else
{
mulbl[7].Visible = true;
mulbl[1].Visible = true;
mulbl[0].Visible = true;
mulbl[2].Visible = true;
mulbl[6].Visible = true;
}
}
else
{
mulbl[7].Visible = true;
mulbl[1].Visible = true;
mulbl[0].Visible = true;
mulbl[2].Visible = true;
mulbl[6].Visible = true;
}
}
} #endregion这是我的代码,不过有一些你需要改或者用不着,我就没帮你挑出来了,你可以看看思路哈
InitDragControl()是入口
int t = muMControl.Top + e.Y - muPointClicked.Y;
int w = muMControl.Width;
int h = muMControl.Height;
//l = (l < 0) ? 0 : ((l + w > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Width) ?
// this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Width - w : l);
//t = (t < 0) ? 0 : ((t + h > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Height) ?
// this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Height - h : t);
muMControl.Left = l;
muMControl.Top = t;
//ControlLocality();