开发自己的窗体设计器

开发自己的窗体设计器,第1张

开发自己的窗体设计器,第2张

控件移动的关键点是设计一个独立于任何控件的类(UIMoveKnob)来控制控件的移动。我在这里实现的方法只针对一个控件。如果需要同时选择多个控件,然后同时移动它们,就需要修改这个类。这里有点难控制。我用的方法耦合严重,这里只给出移动一个控件的方法。请讨论一下移动一个控件的具体方法。
要移动选中的控件,我们需要实现控件的三个事件:
mousedown
mousemove
mouseup

当鼠标按下时,记录鼠标点击的起始位置,并将开始移动标志设置为True;
鼠标移动时,将控件移动相应的距离(鼠标当前位置——鼠标点击的起始位置);
在MouseUp中,释放移动标志为假。
用控件移动控件类(UIMoveKnob),如何实现UIMoveKnob与具体控件的关联?同样,我们需要在表单中添加一个变量privatehashtable _ hashuimoveknob来缓存每个控件对应的uimoveknob对象。
同时,在形式上。通过此控件添加事件。_ hashuimoveknob.add (e.control,new uimoveknob(e . control));设置它的相关性。
UIMOVEKNOB的代码如下:
公共类UIMOVEKNOB
{
private system . windows . forms . control _ owner;
private int _ mouse click atx;
private int _ mouse click aty;
private bool _ begin drag;
public UIMoveKnob(System。Windows.Forms.Control所有者)
{
this。_Owner =所有者;
这个。_所有者。新系统。windows . forms . mouse eventhandler(this。owner _ MouseDown);
这个。_所有者。新系统。windows . forms . mouse eventhandler(this。owner _ MouseMove);
这个。_所有者。新系统。windows . forms . mouse eventhandler(this。owner _ MouseUp);
}
void Owner _ MouseDown(对象发送方,系统。e)
{
this。_所有者。光标=系统。windows . forms . cursors . default;
这个。_ mouse click atx = e . X;
这个。_ mouse click atty = e . Y;
这个。_ BeginDrag = true
}
void Owner _ MouseMove(对象发送方,系统。windows . forms . mouseeventargs e)
{
try
{
if(this。_ begin drag)
{
Rectangle rect;
/*
*对于下面的控件,不能拖动,所以这里不画拖动边框
* TabPage,
*/
if(这个。_所有者是系统。windows . forms . tab page)
{
//
}
else
{
this。_所有者。位置=新点(this。_所有者。左+东-西-这。_MouseClickAtX,这个。_所有者。Top + e.Y -这个。_ mouse click aty);
}
}
}
catch { }
}
void Owner _ MouseUp(对象发送方,系统。e)
{
this。_ BeginDrag = false
这个。_所有者。parent . Refresh();
}
}
修改后的表单代码前半部分如下:
Private mousehook _ mousehook;
//我们缓存这个HashTable
Private HashTable _ hashuisizeKnob中所有已经与特定控件关联的UISizeKnob
//负责控件移动的类
private hashtable _ hashimoveknob;
public form 1()
{
initialize component();
这个。_ mouse hook = new mouse hook(this);
这个。_ HashUISizeKnob = new Hashtable();
这个。_ hashimoveknob = new Hashtable();
//为了简洁明了,我们在ControlAdded
中设置了具体控件与UISizeKnob的关联。control added+= newControlEventHandler(form 1 _ control added);
}
void form 1 _ control added(object sender,control eventargs e)
{
if(!(e.Control为UISizeDot))
{
this。_HashUISizeKnob。添加(e.Control,新的UISizeKnob旋钮(e . Control));
这个。_HashUIMoveKnob。Add(e.Control,新的UIMoveKnob(e . Control));
//单击控件时,显示控件的选择
e . control . click+= new eventhandler(control _ click);
}
}
void Control _ Click(object sender,Evengese)
{
/Life insurance清除所选控件
foreach (UISizeKnob在此。_ hashuisizeknob . values)
{
knob . showuisizedots(false);
}
试试
{
((UISizeKnob)这个。_HashUISizeKnob[sender])。ShowUISizeDots(true);
}
Catch { }
}
拖动单个控件相对简单,但是要拖动多个控件,我们需要先用一个全局变量缓存我们选中的控件,然后在这个类中。拖动时,通过遍历这个全局变量逐个改变所选控件的位置。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 开发自己的窗体设计器

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情