开发自己的窗体设计器(总纲)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/// <param name="parentContain">可移动控件的容器</param>
public ControlMoveResize(Control c, ScrollableControl parentContain)
{
ctrl = c;
this.Containe = parentContain;
{
ctrl.Left = pCtrlLastCoordinate.X + pCursorOffset.X;
}
else
{
ctrl.Left = 0;
}
if ((pCtrlLastCoordinate.Y + pCursorOffset.Y + ctrl.Height) > 0)
{
ctrl.Top = pCtrlLastCoordinate.Y + pCursorOffset.Y;
{
if (Containe == null)
{
return;
}
if (e.Button == MouseButtons.Left)
{
IsMoving = true;
pCtrlLastCoordinate.X = ctrl.Left;
pCtrlLastCoordinate.Y = ctrl.Top;
pCursorLastCoordinate.X = Cursor.Position.X;
Point pCursorOffset = new Point(0, 0);
Point pCursorLastCoordinate = new Point(0, 0);
private Control ctrl = null;
private ScrollableControl Containe = null;
///设计器支持所需的方法不要
///使用代码编辑器修改此方法的内容。
///</summary>
PrivatevoidInitializeComponent()
{
this.label1=newSystem.Windows.Forms.Label();
this.SuspendLayout();
//
/label1//
ctrl.MouseDown += new MouseEventHandler(MouseDown);
ctrl.MouseMove += new MouseEventHandler(MouseMove);
ctrl.MouseUp += new MouseEventHandler(MouseUp);
}
mousePos.Offset(mouse_offset.X, mouse_offset.Y);是一个方法,
Point.Offset(Int32,Int32)
将此Point平移指定的量。
}
((Control)sender).Location=((Control)sender).Parent.PointToClient(mousePos);
Control.PointToClient方法,将指定屏幕点的位置计算成工作区坐标。参数是:要转换的屏幕坐标Point。
事实工作已经完成了,很简单吧,觉得汗吧......
下次介绍运行时怎样动态添加控件.
下面把代码附上:
form1.desgener////////代码
namespace窗体拖动1
{
partialclassForm1
首先,新建一个Form1,拖进去一个label1,text为:鼠标拖动控件练习.接下来就是为它注册事件了,这里我们注册的是label1_MouseUp,label1_MouseDown两个事件.在实现注册事件的代码前要先定义一个Point对象(全局),
private Point mouse_offset;
pCursorLastCoordinate.Y = Cursor.Position.Y;
}
}
private void MouseMove(object sender, MouseEventArgs e)
{
if (Containe == null)
{
return;
}
if (e.Button == MouseButtons.Left)
这个里面的sender大家应该很清楚吧,就是触发事件的label1喽,((Control)sender).Location这句话就是指定label1的位置,((Control)sender).Parent当然就代表当前的Form1了,如果Form1嵌套在另外一个Form1里面,那么后面可以在有一个.Parent,即:((Control)sender).Parent.Parent,.......依次类推喽.......
((Control)sender).Location=((Control)sender).Parent.PointToClient(mousePos);
}
}
这个比较复杂,有必要介绍下,
Point mousePos = Control.MousePosition;定义一个Point,它包含鼠标光标相对于屏幕左上角的坐标。此时记录的是当前鼠标的位置,也就是最后放控件的位置.
ProtectedoverridevoidDispose(booldisposing)
{
If(disposing&&(components!=null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#regionWindows窗体设计器生成的代码
///<summary>
3、实现控件的拖动;
4、控件的排列算法(左对齐,中间对齐等等);
5、PropertyGrid显示中文属性名;
6、Undo和Redo的实现;
7、Winwk.baidu.comorm中自定义快捷键的实现技巧;
8、一种实现多语言的笨方法(适合中国人);
9、ToolBox的实现;
10、工具箱,设计器,属性等的交互。
经常进行图形界面设计的编程者肯定知道,控件在设计的时候才能随意拖动,运行的时候就不能拖动了.你肯定会问:运行时能随意拖动控件吗?答案是肯定的,我们的项目涉及到了这一点,我已经实现了,实际上很简单的哟.我就拿出来给你们show一下,哈哈,各位高手不要笑我哟.我们先从简单的入手,一步一步的来吧:
/// <summary>
///使窗口的中的指定控件支持运行时移动
/// TODO:运行时缩放
/// </summary>
public class ControlMoveResize
{
#region私有成员
bool IsMoving = false;
Point pCtrlLastCoordinate = new Point(0,0);
用来记录鼠标位置,以便平移鼠标位置.
下面是label1_MouseDown的代码:
private void label1_MouseDown(objectsender, MouseEventArgse)
{
mouse_offset = new Point(-e.X,-e.Y);
}
是不是非常easy哟.
#endregion
#region私有方法
/// <summary>
///在鼠标左键按下的状态记录鼠标当前的位置,以及被移动组件的当前位置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MouseDown(object sender, MouseEventArgs e)
{
///<summary>
///必需的设计器变量。
///</summary>
PrivateSystem.ComponentModel.IContainercomponents=null;
///<summary>
///清理所有正在使用的资源。
///</summary>
///<param name="disposing">如果应释放托管资源,为true;否则为false。</param>
ctrl.Left = pCtrlLastCoordinate.X + pCursorOffset.X;
ctrl.Top = pCtrlLastCoordinate.Y + pCursorOffset.Y;
}
}
}
private void MouseUp(object sender, MouseEventArgs e)
可能有哥们会骂,为什么不直接使用vs2005中的System.Component.Design下的东西就可以直接实现控件的拖拽。当然了,这是可以的,就连大名鼎鼎的SharpDevelop都是使用这玩意。不过自己设计这些东西还是很有意思的!
本系列目录:
1、在容器上拖动鼠标增加控件;
2、实现控件的选择;
#endregion
C#基础系列:开发自己的窗体设计器(总纲)
我所处的行业,所使用的业务系统都不大,但是个性需求极其多,每个地区,每家公司都可能存在很大的差别。所以我就想能够弄一个类似于vs2005的WinForm窗体设计器的开发平台,让用户拖拖拽拽就可以添加自己需要的控件,或者删除不需要的控件,从而完成大部分的工作,实现功能的扩展,而我需要做的,只不过是写写插件代码。
在运行时通过鼠标拖动移动控件位置(c#)
前些日子因为工作需要想了解有关于在C#下实现运行时鼠标移动控件的方法,Google了一下还真找到了一个帖子,粗略看去代码还真不少,感觉有点复杂的样子,因为当时手头上还有点别的事情,没来得及细看,就把帖子转到了自己的blog里面收藏。周末晚上没事,抽时间看了一下程序,发现只能以Form为容器进行操作(因为使用了Form的一些属性来确定控件位置),不完全符合自己的需要,而且作者的实现代码似乎多了一点,就自己琢磨着怎么给精简一下,后来竟然把几乎把大部分代码给删掉了,实现方式也有不同,也可以在Form之外的其它容器内进行组件运行时拖动。为了程序可读性,暂未把改变控件大小的代码加进来,但基本原理和移动控件位置也相差不远,稍晚一点再添加进来。
}
else
{
ctrl.Top = 0;
}
pCursorOffset.X = 0;
pCursorOffset.Y = 0;
}
}
#endregion
#region构造函数
/// <summary>
///获取被移动控件对象和容器对象
/// </summary>
/// <param name="c">被设置为可运行时移动的控件</param>
{
if (this.IsMoving)
{
Point pCursor = new Point(Cursor.Position.X, Cursor.Position.Y);
pCursorOffset.X = pCursor.X - pCursorLastCoordinate.X;
pCursorOffset.Y = pCursor.Y - pCursorLastCoordinate.Y;
这种类型的系统目前已经有很多,但是那些都是属于别人的,即使我能够免费下载到一个,也不能完全按照我自己的想法去修修改改。所以我就想自己写一个。目前已经实现了很多的东西,但是在整体的架构上,我总觉得不行,所以希望以这系列的文章,来和各位进行交流。
我本系列的文章中,所涉及的都是实现这么个系统所使用到的关键技术。并提供可调试的代码。希望能够得到各位的大力拍砖。
this.label1.AutoSize=true;
this.label1.Location=newSystem.Drawing.Point(92,86);
下面是label1_MouseUp的代码:
Privatevoidlabel1_MouseUp(objectsender,MouseEventArgse)
{
if(e.Button==MouseButtons.Left)
{
PointmousePos=Control.MousePosition;
mousePos.Offset(mouse_offset.X,mouse_offset.Y);
{
if (Containe == null)
{
return;
}
if (this.IsMoving)
{
if (pCursorOffset.X == 0 && pCursorOffset.Y == 0)
{
return;
}
if ((pCtrlLastCoordinate.X + pCursorOffset.X + ctrl.Width) > 0)
相关文档
最新文档