目前一个办公系统(WinForm)需要自定义表单设计功能,能够由后台维护人员设计好表单(具体就是像在VS2005中的窗体设计器中拖拉控件进行窗体排版,主要涉及Label TextBox ComboBox CheckBox GridView等),然后将控件排版信息保存到数据库,办公系统读取配置将设计好的表单显示出来,由用户输入信息或其他操作。本人准备开发这个表单设计模块,遇到如下几个问题:1、本人采用动态加载控件来产生表单设计中的控件,但是像TextBox ComboBox等控件拖放到窗体以后会自动获取焦点,而且其中的文本能够被编辑,且其中的光标为输入状态IBeam,如何使用户不能在控件中输入数据,且改变光标为SizeALL
2、控件拖放到窗体以后,如何模拟在VS2005设计器中的式样,使控件周围产生若干个小方格,和一个拖拉手柄,设计人员可以拖动控件或者改变控件大小,是否需要重写 Control_Paint 事件?

解决方案 »

  1.   

    发现重写Paint事件可以解决控件手柄绘制的问题,但是如何解决TextBox Combobox等控件自己本身的右键菜单,屏蔽输入、并修改鼠标状态等问题呢,在线等
      

  2.   

    你可以研究一下VS.IDE,VS的WinForm设计类应该是公开的.我记得以前看到一个程序完全类似于VS WinForm 设计器, 找到后继承它应该就可以了.
      

  3.   

    我的建议是直接用sharepoint吧,有现成滴干吗不用呢?自己写的话,需要研究IDesignerHost接口,DesignSurface对象恩,微软好像有个demo自定义窗体设计器的demo你可以找一下
      

  4.   

    看了一下DesignSurface,似乎可以产生一个跟设计器差不多的窗体
    但是如果我希望表单设计的容易不是Form,而是Panel控件,似乎会有一点问题DesignSurface surface = new DesignSurface();
    surface.BeginLoad(typeof(Panel));
    此处如果是Form,可以正常显示控件,如果是Panel,则只会显示加载控件的图标
    这个问题如何解决,难道不能用Panel作为宿主?Control designView = surface.View as Control;
    designView.Parent = this.panelControl1  ;
    designView.Dock = DockStyle.Fill;
    designView.BackColor = Color.White;
      

  5.   


    你可以在 Form parentForm = new Form();时,设置parentForm .FormBorderStyle= FormBorderStyle.None;DesignSurface surface = new DesignSurface();
    surface.BeginLoad(typeof(Form));
    Control ctrl = surface.View is Control;
    Form parentForm = new Form();
    parentForm .FormBorderStyle= FormBorderStyle.None;
    ctrl .Parent = parentForm;
    ctrl.Dock = DockStyle.Fill;
    parentForm.Show();
      

  6.   

    由于页面布局需要,我设计这个宿主窗体要放在一个Panel内,并随着panel一起缩放,因此我添加了一个窗体
    frmDesignHost,这个窗体是没有标题栏的:
    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;
    这样以后宿主窗体确实能显示在pnlTable控件内,但是不能随着Table窗体一起缩放
      

  7.   

    如何获取布局上的鼠标事件,我用如下代码:
    DesignSurface surface = new DesignSurface();
    surface.BeginLoad(typeof(frmDesignHost));
    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);
    希望能够响应用户鼠标事件,但是毫无反应?
    我希望能够由用户选择需要添加的控件(自己设计的工具栏按钮),然后在设计器上拖动鼠标,鼠标弹起的时候添加这个控件,要怎么写这些事件?