再发一贴,求用IDesignerHost 对象制作窗体设计器控件的方法

jxfzcgh 2008-11-26 05:11:49
本人想做一个窗体设计器控件,实现类似于VS.Net的窗体设计功能,主要是能够添加Label TextBox Combobox Checkbox gridControl等控件,并调整大小、拖动控件位置、设计水平对齐、垂直对齐、水平间距、垂直间距等布局功能
主要是用IDesignerHost接口和DesignSurface对象实现,该接口支持在设计器中进行控件拖动、调整大小,但是没有找到响应事件的方法,比如当前选择控件改变事件、MouseDown事件,不能获取当前选择了哪些控件,以至于不能实现在窗体中拖动鼠标绘制控件、修改当前选中控件的对齐方式、水平间距、垂直间距等功能

DesignSurface surface = new DesignSurface();
surface.BeginLoad(typeof(frmDesignHost));

Control designView = surface.View as Control;

designView.Parent = this.pnlTable ;
designView.Dock = DockStyle.Fill;
designView.BackColor = Color.White;

IDesignerHost host = (IDesignerHost)surface.GetService(typeof(IDesignerHost));
Control root = (Control)host.RootComponent;

//似乎没有 效果,不会触发事件
designView.MouseDown += new MouseEventHandler(designView_MouseDown);
designView.MouseMove += new MouseEventHandler(designView_MouseMove);
designView.MouseUp += new MouseEventHandler(designView_MouseUp);
...全文
825 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
feng87558812 2009-07-07
private IDesignerHost GetDesignerHost(Window window)
{
// In most instances, the IDesignerHost can be retrieved
// directly off of the window object.
IDesignerHost designerHost = window.Object as IDesignerHost;
if (designerHost != null)
return designerHost;

// webform designer though, is a special case
HTMLWindow htmlWindow = window.Object as HTMLWindow;
if (htmlWindow != null)
{
// make sure current tab is the designer tab
htmlWindow.CurrentTab = vsHTMLTabs.vsHTMLTabsDesign ;
IOleServiceProvider oleSP = (IOleServiceProvider)htmlWindow.CurrentTabObject;
Microsoft.VisualWebDeveloper.Interop.WebDeveloperPage.DispDesignerDocument d = htmlWindow.CurrentTabObject as Microsoft.VisualWebDeveloper.Interop.WebDeveloperPage.DispDesignerDocument;
Guid guidVsMDDDesigner = new Guid("7494682A-37A0-11d2-A273-00C04F8EF4FF");
IntPtr ptr;
oleSP.QueryService(ref guidVsMDDDesigner, ref guidVsMDDDesigner, out ptr);
if (ptr != IntPtr.Zero)
{
IServiceProvider dotnetSP = (IServiceProvider)Marshal.GetObjectForIUnknown(ptr);
Marshal.Release(ptr);
designerHost = (IDesignerHost)dotnetSP.GetService(typeof(IDesignerHost));
}
}
return designerHost;
}

看看吧
  • 打赏
  • 举报
回复
WizCas 2008-11-27
mark
  • 打赏
  • 举报
回复
特别 2008-11-27
帮顶
  • 打赏
  • 举报
回复
gomoku 2008-11-27
可以下载 DesignModeDialog 例子来研究学习。原先的链接在Mike Harsh's Blog可以找到,现在可能要你自己搜索一下。

  • 打赏
  • 举报
回复
jxfzcgh 2008-11-27
自己顶
  • 打赏
  • 举报
回复
mabaoyes 2008-11-26
帮顶!
  • 打赏
  • 举报
回复
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2008-11-26 05:11
社区公告

让您成为最强悍的C#开发者