怎么实现用户自己在运行时自己配置界面啊 比如他可以直接加一个输入框控件啊 标签控件啊 等等 并且可以对其进行拖拉啊 改变大小啊 多个控件之间的对齐啊 等等 就好像是VS IDE的功能 这样做的目的是这个项目用户可以自己添加修改删除字段 所以界面上也需要客户自己能来添加输入框这些信息谢谢!

解决方案 »

  1.   

    你可以在界面上先放置幾個可能需要的控件,設為隱藏,然後再放置一個或多個按鈕供用戶之用,比如:button1,作用添加textbox,那你就隱藏放置一個textbox,只能這樣了,呵呵,我只是給你提供一點點思路,也不一定要這么做,先開會了,呆會再給你想。
      

  2.   

    比较有新意,如果直接自己用文本来控制还好点,比如添加字段后,可以选择使用文本框,设置好长,高,程序自动添加或改变,纯脆用IDE式的来实现不是很好做,不知道可不可以用每三方控件,如flowchart,能不能用。
      

  3.   

    你可以仿照IDE啊,也就是做出来IDE的选择界面,让用户去选择,如果用户选择的button,你就给他画出来一个button
      

  4.   

    有些报表提供了这个功能,记得:FastReport有这个功能的
      

  5.   

    我见过delphi开发的程序实现过
    .net的还没有见过,应该可以实现,不过难一些
      

  6.   

    我也考虑过。 不过实现起来难度比较大。 1 首先,你的界面控件必须是动态生成。不能是拖拽的,那样就写死了。无法改。
     2 你的GDI+ 得相当的熟。 就相当于你写个工具箱,然后写对应的拖拽操作的代码。然后,要把对应的控件按照设计时外观(类似VS IDE你拖拽时的样子)  画到窗体上。
       同时,如果是客户自己还能增加字段之类的话,那估计复杂度还要增加。因为在绘制的同时,还涉及你的程序代码部分。  其实,逻辑挺简单的。不过实现起来复杂度比较高。 
      

  7.   

    没必要GDI+...1 动态生成控件
    2 移动控件...改变控件大小
    3 保存所有控件的设置.
      

  8.   

    你可以自己写一个VISUAL IDE了……
      

  9.   

    网上有现成的,我这里也有现成的列子,要的话留Mail
      

  10.   


    using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using System.Windows.Forms; 
    using System.Drawing; 
    namespace MoveControl 

        class BarcodeControl 
        { 
            #region private         private const int MIN_SIZE = 10; //对控件缩放的最小值 
            private const int BOX_SIZE = 7;  //调整大小触模柄方框大小         public bool _IsCtrlKey = false; 
            private TextBox _textbox; 
            private Control _MControl = null; 
            private bool _IsMouseDown = false; 
            private Point _oPointClicked; 
            private Color BOX_COLOR = Color.White; 
            private Label[] _lbl = new Label[8]; 
            private int _startl, _startt, _startw, _starth; 
            private bool _dragging; 
            private Cursor[] _arrArrow = new Cursor[] {Cursors.SizeNWSE, Cursors.SizeNS, 
                                                        Cursors.SizeNESW, Cursors.SizeWE, Cursors.SizeNWSE, Cursors.SizeNS, 
                                                        Cursors.SizeNESW, Cursors.SizeWE};         #endregion         #region 构造函数         /// <summary> 
            /// 构造控件拖动对象 
            /// </summary> 
            /// <param name="moveControl">需要拖动的控件 </param> 
            public BarcodeControl(Control moveControl) 
            { 
                // 
                // TODO: 在此处添加构造函数逻辑 
                // 
                _MControl = moveControl; 
                _MControl.MouseDown += new MouseEventHandler(this.Control_MouseDown); 
                _MControl.MouseUp += new MouseEventHandler(this.Control_MouseUp); 
                _MControl.MouseMove += new MouseEventHandler(this.Control_MouseMove); 
                _MControl.Click += new System.EventHandler(this.Control_Click);             //构造8个调整大小触模柄 
                for (int i = 0; i <8; i++) 
                { 
                    _lbl[i] = new Label(); 
                    _lbl[i].TabIndex = i; 
                    _lbl[i].FlatStyle = 0 ; 
                    _lbl[i].BorderStyle = BorderStyle.FixedSingle; 
                    _lbl[i].BackColor = BOX_COLOR; 
                    _lbl[i].Cursor = _arrArrow[i]; 
                    _lbl[i].Text = ""; 
                    _lbl[i].BringToFront(); 
                    _lbl[i].MouseDown += new MouseEventHandler(this.handle_MouseDown); 
                    _lbl[i].MouseMove += new MouseEventHandler(this.handle_MouseMove); 
                    _lbl[i].MouseUp += new MouseEventHandler(this.handle_MouseUp); 
                }             CreateTextBox(); 
                Create();             //Control_Click((object)sender, (System.EventArgs)e); 
            }         #endregion         #region 需拖动控件键盘事件         private void textBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
            { 
                if (e.KeyValue == 37 || e.KeyValue == 38 || e.KeyValue == 39 || e.KeyValue == 40) 
                { 
                    if (e.KeyValue == 37) 
                        _MControl.Left -= 1; 
                    if (e.KeyValue == 38) 
                        _MControl.Top -=1; 
                    if (e.KeyValue == 39) 
                        _MControl.Left += 1; 
                    if (e.KeyValue == 40) 
                        _MControl.Top +=1; 
                    MoveHandles(); 
                    ControlLocality(); 
                    _MControl.Visible = true; 
                }             if (e.KeyValue == 46) 
                { 
                    for (int i = 0; i <8; i++) 
                    { 
                        _MControl.Parent.Controls.Remove(_lbl[i]); 
                    } 
                    _MControl.Parent.Controls.Remove(_MControl); 
                    _textbox.Parent.Controls.Remove(_textbox); 
                }             if (e.KeyValue == 17) 
                { 
                    _IsCtrlKey = true; 
                    //MessageBox.Show("a"); 
                } 
            }         #endregion 
      

  11.   


            #region 需拖动控件鼠标事件         private void Control_Click(object sender, System.EventArgs e) 
            { 
                _textbox.Focus(); 
                _MControl = (sender as Control); 
                MoveHandles();             if (_IsCtrlKey == false) 
                { 
                    for (int i = 0; i < _MControl.Parent.Controls.Count; i++) 
                    { 
                        if (_MControl.Parent.Controls[i].Text.Trim().Length == 0 && _MControl.Parent.Controls[i] is Label) 
                        { 
                            _MControl.Parent.Controls[i].Visible = false; 
                        } 
                    } 
                } 
            } 
            private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 
            { 
                _IsMouseDown = true; 
                _oPointClicked = new Point(e.X, e.Y); 
                for (int i = 0; i < 8; i++) 
                { 
                    _MControl.Parent.Controls.Add(_lbl[i]); 
                    _lbl[i].BringToFront(); 
                } 
                HideHandles(); 
            }         private void Control_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) 
            { 
                _IsMouseDown = false; 
                MoveHandles(); 
                ShowHandles(); 
                _MControl.Visible = true; 
            }         private void Control_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) 
            { 
                if (_IsMouseDown) 
                { 
                    int l = _MControl.Left + (e.X - _oPointClicked.X); 
                    int t = _MControl.Top + (e.Y - _oPointClicked.Y); 
                    int w = _MControl.Width; 
                    int h = _MControl.Height; 
                    l = (l < 0) ? 0 : ((l + w > _MControl.Parent.ClientRectangle.Width) ? 
                        _MControl.Parent.ClientRectangle.Width - w : l); 
                    t = (t < 0) ? 0 : ((t + h > _MControl.Parent.ClientRectangle.Height) ? 
                        _MControl.Parent.ClientRectangle.Height - h : t); 
                    _MControl.Left = l; 
                    _MControl.Top = t; 
                    ControlLocality(); 
                } 
                //_MControl.Cursor=Cursors.SizeAll; 
            }         #endregion
     #region 调整大小触模柄鼠标事件         private void handle_MouseDown(object sender, MouseEventArgs e) 
            { 
                _dragging = true; 
                _startl = _MControl.Left; 
                _startt = _MControl.Top; 
                _startw = _MControl.Width; 
                _starth = _MControl.Height; 
                HideHandles(); 
            } 
          // 通过触模柄调整控件大小 
            //    0  1  2 
            //  7      3 
            //  6  5  4 
            private void handle_MouseMove(object sender, MouseEventArgs e) 
            { 
                int l = _MControl.Left; 
                int w = _MControl.Width; 
                int t = _MControl.Top; 
                int h = _MControl.Height; 
                if (_dragging) 
                { 
                    switch (((Label)sender).TabIndex) 
                    { 
                            //l算法:控件左边X坐标 + 鼠标在触模柄X坐标 < 控件左边X坐标 + 父控件宽度 - 控件大小 ?控件左边X坐标 + 鼠标在触模柄X坐标 :控件左边X坐标 + 父控件宽度 - 控件大小  
                            //t算法: 
                            //w算法: 
                            //h算法: 
                        case 0: // _dragging top-left sizing box 
                            l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE; 
                            t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE; 
                            w = _startl + _startw - _MControl.Left; 
                            h = _startt + _starth - _MControl.Top; 
                            break; 
                        case 1: // _dragging top-center sizing box 
                            t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE; 
                            h = _startt + _starth - _MControl.Top; 
                            break; 
                        case 2: // _dragging top-right sizing box 
                            w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE; 
                            t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE; 
                            h = _startt + _starth - _MControl.Top; 
                            break; 
                        case 3: // _dragging right-middle sizing box 
                            w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE; 
                            break; 
                        case 4: // _dragging right-bottom sizing box 
                            w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE; 
                            h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE; 
                            break; 
                        case 5: // _dragging center-bottom sizing box 
                            h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE; 
                            break; 
                        case 6: // _dragging left-bottom sizing box 
                            l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE; 
                            w = _startl + _startw - _MControl.Left; 
                            h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE; 
                            break; 
                        case 7: // _dragging left-middle sizing box 
                            l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE; 
                            w = _startl + _startw - _MControl.Left; 
                            break; 
                    } 
                    l =(l <0)?0:l; 
                    t =(t <0)?0:t; 
                    _MControl.SetBounds(l,t,w,h); 
                } 
            }         private void handle_MouseUp(object sender, MouseEventArgs e) 
            { 
                _dragging = false; 
                MoveHandles(); 
                ShowHandles(); 
            }         #endregion 
      

  12.   


         #region private方法         private void Create() 
            { 
                //_IsMouseDown = true; 
                //_oPointClicked = new Point(e.X,e.Y); 
                for (int i = 0; i < 8; i++) 
                { 
                    _MControl.Parent.Controls.Add(_lbl[i]); 
                    _lbl[i].BringToFront(); 
                } 
                HideHandles(); 
            }         private void CreateTextBox() 
            { 
                _textbox = new TextBox(); 
                _textbox.CreateControl(); 
                _textbox.Parent = _MControl.Parent; 
                _textbox.Width = 0; 
                _textbox.Height = 0; 
                _textbox.TabStop = true; 
                _textbox.KeyDown += new System.Windows.Forms.KeyEventHandler(textBox_KeyDown); 
            }         private void ControlLocality() 
            { 
                if (_MControl.Location.X < 0) 
                { 
                    _MControl.Visible = false; 
                    _MControl.Left = 0; 
                } 
                if (_MControl.Location.Y < 0) 
                { 
                    _MControl.Visible = false; 
                    _MControl.Top = 0; 
                } 
                if (_MControl.Location.X + _MControl.Width > _MControl.Parent.Width) 
                { 
                    _MControl.Visible = false; 
                    _MControl.Left = _MControl.Parent.Width - _MControl.Width; 
                } 
                if (_MControl.Location.Y + _MControl.Height > _MControl.Parent.Height) 
                { 
                    _MControl.Visible = false; 
                    _MControl.Top = _MControl.Parent.Height - _MControl.Height; 
                } 
            }         private void HideHandles() 
            { 
                for (int i = 0; i < 8; i++) 
                { 
                    _lbl[i].Visible = false; 
                } 
            }         private void MoveHandles() 
            { 
                int sX = _MControl.Left - BOX_SIZE; 
                int sY = _MControl.Top - BOX_SIZE; 
                int sW = _MControl.Width + BOX_SIZE; 
                int sH = _MControl.Height + BOX_SIZE; 
                int hB = BOX_SIZE / 2; 
                int[] arrPosX = new int[] {sX+hB, sX + sW / 2, sX + sW-hB, sX + sW-hB, 
                                              sX + sW-hB, sX + sW / 2, sX+hB, sX+hB}; 
                int[] arrPosY = new int[] {sY+hB, sY+hB, sY+hB, sY + sH / 2, sY + sH-hB, 
                                              sY + sH-hB, sY + sH-hB, sY + sH / 2}; 
                for (int i = 0; i < 8; i++) 
                { 
                    _lbl[i].SetBounds(arrPosX[i], arrPosY[i], BOX_SIZE, BOX_SIZE); 
                } 
            }         private void ShowHandles() 
            { 
                if (_MControl != null) 
                { 
                    for (int i = 0; i < 8; i++) 
                    { 
                        _lbl[i].Visible = true; 
                    } 
                } 
            }         #endregion     } 
    } //直接调用
    MoveControl.BarcodeControl barcode = new BarcodeControl(控件);