C# 模拟VisualStudio窗体设计器拖放控件
C# 模拟VisualStudio窗体设计器拖放控件
从设计角度来看光画个控件是很简单的事,捕捉Mouse down/move/up 事件记录好坐标在Mouse Up事件触发时画出控件或者图形,其实最重要的时如何设计这个小框架。 我定义几个类仅供参考。 /// <summary> /// 控件样式基类定义 /// </summary> public class DrawStyle { protected bool _Drawing = false; protected Control _Container = null; protected Control _ActivedControl = null; protected Point _S; //Start Point. public virtual void BeginDraw(Control container, Point P) { } public virtual void EndDraw(Control container, Point P) { } public virtual void OnMove(Control container, Point P) { } } // 来源:www.CSFramework.com, C/S结构框架学习网 /// <summary> /// 拖放TextBox控件 /// </summary> public class DrawTextBox : DrawStyle { private TextBox _CurrentText; public DrawTextBox() { } public override void BeginDraw(Control container, Point P) { _S = P; _Drawing = true; _Container = container; _CurrentText = new TextBox(); _CurrentText.Multiline = true; _ActivedControl = _CurrentText; if (container.Controls.IndexOf(_ActivedControl) < 0) container.Controls.Add(_ActivedControl); _ActivedControl.Left = P.X; _ActivedControl.Top = P.Y; } public override void EndDraw(Control container, Point P) { //向右下方拖動X,Y為正數,當為負數時為反向拖動,需要更改Top,Left屬性 _ActivedControl.Width = P.X - _S.X; _ActivedControl.Height = P.Y - _S.Y; _ActivedControl.Visible = true; _Drawing = false; } public override void OnMove(Control container, Point P) { if (_Drawing == false) return; if (_Container != container) return; //向右下方拖動X,Y為正數,當為負數時為反向拖動,需要更改Top,Left屬性 _ActivedControl.Width = P.X - _S.X; _ActivedControl.Height = P.Y - _S.Y; _ActivedControl.Invalidate(); } } // 来源:www.CSFramework.com, C/S结构框架学习网 /// <summary> /// 自定义IDE设计器,控件容器 /// </summary> public class MyCanvasDesigner { private Control _Designer; public MyCanvasDesigner(Control control) { _Designer = control; } public void Clear() { _Designer.Controls.Clear(); } } // 来源:www.CSFramework.com, C/S结构框架学习网 /// <summary> /// 应用场景/控制器 /// </summary> public class DrawController { private static MyCanvasDesigner _Canvas = null; private static DrawStyle _CurrentDraw = null; /// <summary> /// 当前拖放的控件 /// </summary> public static DrawStyle CurrentDraw { get { if (_CurrentDraw == null) _CurrentDraw = new DrawTextBox(); return _CurrentDraw; } set { _CurrentDraw = value; } } /// <summary> ///当前Designer, 支持多个IDE设计器,控件容器 /// </summary> public static MyCanvasDesigner CurrentDesigner { get { return _Canvas; } set { _Canvas = value; } } } // 来源:www.CSFramework.com, C/S结构框架学习网 扫一扫加作者微信
参考文档:
C#-C/S框架如何新建一个模块和业务窗体? C# 如何设计一个标准的等待窗体 MDI程序子窗体的拖放功能(Drag,Drop) 通过反射技术创建窗体实例然后给控件赋值(C#) C#实现QQ/MSN等客户端聊天软件从右下角弹出窗体(Popup Window) C#版智能五子棋游戏(4)-主窗体 C#设计模式-窗体基类模板方法定义 C#.Net组件开发 - 设计时使用自定义属性编辑器持久化对象 C#.Net组件开发(高级篇) - 设计时在窗体设计器文件内生成组件的代码 C# 窗体上显示透明图片,PNG图片,已审核/未审核图标 C#.NET WEBAPI 接口设计与调用 C# Winform 拖放图片文件到界面 C# Winform中如何获取父窗体中控件的信息 C#权限管理框架介绍|商业开源C/S系统快速开发框架权限系统设计 C# Dev 财务科目(财务结算收支类目) 树状结构数据编辑窗体设计
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |