积极答复者
DesignSurface设计器如何实现用鼠标点击左侧的自定义工具栏中的控件来创建指定的控件

问题
-
请大牛们耐心听我讲,我还会奉上源码,给大家分享我的解决方案,我给的源码项目,大家可以直接运行,跑起来玩一下后,大家再来帮我解决问题,会更有体会。。
源码奉上:https://pan.baidu.com/s/1dFNGafZ,密码:xh3d,此为百度网盘下载链接。
跑起来的效果如下:长话短说,首先为了便于问题的清晰描述,先给大家说一些细节,请大神耐心听我说,大家跑起来后,发现跟winform的Form窗体设计
器很相似,鼠标拖动过程中显示一个虚线框鼠标释放后创建控件:
或者点击左边的工具箱后再在Form窗体中点击会创建一个默认小大的控件:
但是唯一不足之处,就是少了个左边的工具箱,用于自定义创建控件,其实自定义工具箱都好做,可以用一个ListBox里面
放一系列的Label即可,点击不同的Label会创建不同类型的文本,然后据此来判断和创建不同类型的控件,但是这个不是重点,重要的
是,我点击了自定义工具箱后,再在DesignSurface设计视图中绘制时,没用,就是说这个DesignSurface设计视图和它的根容器都无法
挂接事件,当然也可能是我很菜,不知道,我查找了System.ComponentModel.Design和System.Windows.Forms.Design这两个命名空间中的内容,我基本都看过了,都没找到如何给DesignSurface设计器挂接事件,也可能是我遗漏了。现象就是你给他挂接了MouseMove,MouseDown及MouseUp等事件后,鼠标放到上面依旧没有反应。因此就实现不了我想要的操作。求各路路过的神仙大牛高手大虾大侠们给点提示,希望与大家一起在学习中共同进步。
答案
-
Hi,
感谢你的回复。
据我们分析,如果你想直接从左边的控件栏拖到你设计的tabControl1 里面设计的form上面,应该是没有办法做到。
设计时的form 是不会捕捉事件,所以move on的事件不会被捕捉到。
你可以在Tiny Form Designer form上面捕捉到事件。
捕捉设计时的form 事件,一般都是用service 来做,你可以看下面的文章,讲的比较详细。 我的理解可能不好,你当作参考。
http://www.divelements.co.uk/net/articles/designers/hosting.asp
我感觉作者的思想使用了C++的 回掉函数,首先得到你的service,然后从这service 中的到回掉函数。 这个回掉函数 我认为就我们要做的move on 事件。 也许我理解不对,只供参考。
Best Regards,
Hart
注意:此回复包含对第三方万维网站点的引用。 Microsoft提供此信息为您提供方便。 Microsoft不控制这些网站,并且没有测试在这些网站上发现的任何软件或信息; 因此,Microsoft不能对任何软件或信息的质量,安全性或适用性做任何声明。 使用互联网上发现的任何软件都存在固有的危险,Microsoft警告您,在从互联网检索任何软件之前,请确保您完全理解风险。
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.
- 已编辑 Hart WangModerator 2017年11月14日 6:36
- 已标记为答案 TheYangtzeTheYellowRiver 2017年11月14日 8:46
- 取消答案标记 TheYangtzeTheYellowRiver 2017年11月16日 8:55
- 已标记为答案 TheYangtzeTheYellowRiver 2017年11月18日 8:53
-
Hi,
关于这个问题,请参考这篇文档:
Hosting Windows Forms Designers - 14 June 2003。
这是项目的详细介绍,在这个文档的最底部有下载的源码,你可以直接下载,这个工程是使用的ToolboxService来实现控件拖拽的,而不是MouseMove事件。
备注:关于你在英文论坛发的这个帖子:Problem in DesignSurface designer! 这个论坛是英文论坛,按照政策,在英文论坛讨论英文贴,在中文论坛讨论中文贴,所以如果有问题请在中文论坛发帖,避免在英文论坛讨论中文,谢谢合作。
Regards,
Stanly
注意:此回复包含对第三方万维网站点的引用。 Microsoft提供此信息为您提供方便。 Microsoft不控制这些网站,并且没有测试在这些网站上发现的任何软件或信息; 因此,Microsoft不能对任何软件或信息的质量,安全性或适用性做任何声明。 使用互联网上发现的任何软件都存在固有的危险,Microsoft警告您,在从互联网检索任何软件之前,请确保您完全理解风险。
MSDN Community Support
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.- 已标记为答案 TheYangtzeTheYellowRiver 2017年11月17日 7:42
全部回复
-
Hi,
感谢在MSDN论坛发帖。
我这边发现一个也是用winform 来模拟VS设计器的功能,你可以下载下来,参考一下。
根据MSDN的规则,是不允许用第三方的产品,所以百度云,我是没有办法用的。
你可以把代码上传到one drive上面。
Best Regards,
Hart
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.
- 已编辑 Hart WangModerator 2017年11月14日 5:22
-
Hi,
我下载你的代码,在拖动button 控件的时候,button 会出现变扁,或者抖动,你是想在选中button的时候,出现虚框,但是在移动的过程中不出现变扁,或者抖动的情况吗?当鼠标移释放时,再出现这个button? 这我描述这个样子吗? 不知道我描述的对不对。
针对这个情况,我认为可能是是在拖动button的时候,form界面应该是一直在重绘,你可以在移动的过程中让button 不显示出来,然后释放鼠标以后,在显示出来。
Best Regards,
Hart
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.
-
Hi,
感谢你的回复。
据我们分析,如果你想直接从左边的控件栏拖到你设计的tabControl1 里面设计的form上面,应该是没有办法做到。
设计时的form 是不会捕捉事件,所以move on的事件不会被捕捉到。
你可以在Tiny Form Designer form上面捕捉到事件。
捕捉设计时的form 事件,一般都是用service 来做,你可以看下面的文章,讲的比较详细。 我的理解可能不好,你当作参考。
http://www.divelements.co.uk/net/articles/designers/hosting.asp
我感觉作者的思想使用了C++的 回掉函数,首先得到你的service,然后从这service 中的到回掉函数。 这个回掉函数 我认为就我们要做的move on 事件。 也许我理解不对,只供参考。
Best Regards,
Hart
注意:此回复包含对第三方万维网站点的引用。 Microsoft提供此信息为您提供方便。 Microsoft不控制这些网站,并且没有测试在这些网站上发现的任何软件或信息; 因此,Microsoft不能对任何软件或信息的质量,安全性或适用性做任何声明。 使用互联网上发现的任何软件都存在固有的危险,Microsoft警告您,在从互联网检索任何软件之前,请确保您完全理解风险。
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.
- 已编辑 Hart WangModerator 2017年11月14日 6:36
- 已标记为答案 TheYangtzeTheYellowRiver 2017年11月14日 8:46
- 取消答案标记 TheYangtzeTheYellowRiver 2017年11月16日 8:55
- 已标记为答案 TheYangtzeTheYellowRiver 2017年11月18日 8:53
-
恩,我发现是这样的,我直接给那个Form窗体挂接事件是可以的。
- 已标记为答案 TheYangtzeTheYellowRiver 2017年11月14日 8:46
- 取消答案标记 TheYangtzeTheYellowRiver 2017年11月16日 8:55
-
我给那个
Form rootComponent = (Form)surface.CreateRootComponent(typeof(Form), new Size(900, 700));
Control view = surface.GetView();
view.Parent = this.tabPage1;
仔细看上面这段代码,我之前是给view 和rootComponent 挂接MouseMove等事件都不行,但是直接给tabPage1挂接MouseMove等事件是可以的。
- 已标记为答案 TheYangtzeTheYellowRiver 2017年11月14日 8:46
- 取消答案标记 TheYangtzeTheYellowRiver 2017年11月16日 8:55
-
Hi,
关于这个问题,请参考这篇文档:
Hosting Windows Forms Designers - 14 June 2003。
这是项目的详细介绍,在这个文档的最底部有下载的源码,你可以直接下载,这个工程是使用的ToolboxService来实现控件拖拽的,而不是MouseMove事件。
备注:关于你在英文论坛发的这个帖子:Problem in DesignSurface designer! 这个论坛是英文论坛,按照政策,在英文论坛讨论英文贴,在中文论坛讨论中文贴,所以如果有问题请在中文论坛发帖,避免在英文论坛讨论中文,谢谢合作。
Regards,
Stanly
注意:此回复包含对第三方万维网站点的引用。 Microsoft提供此信息为您提供方便。 Microsoft不控制这些网站,并且没有测试在这些网站上发现的任何软件或信息; 因此,Microsoft不能对任何软件或信息的质量,安全性或适用性做任何声明。 使用互联网上发现的任何软件都存在固有的危险,Microsoft警告您,在从互联网检索任何软件之前,请确保您完全理解风险。
MSDN Community Support
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.- 已标记为答案 TheYangtzeTheYellowRiver 2017年11月17日 7:42
-
因为你的第一个回复里面包含一些个人信息,为了安全,我建议把这些敏感的东西删掉。
Best Regards,
Hart
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.