再发一贴,求用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);
...全文
1032 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
帮顶!

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧