需要实现功能:某个页面的左边有代表某个生产过程的各个工序图形,右边是工序流程图,用户直接用鼠标点击左边工序的图形托拽到右边工序流程图上,就在该工序流程中增加了一个工序并弹出对话框,输入工序基本信息。
   问:这样的功能可以用什么技术实现,最好是在.net框架中的。

解决方案 »

  1.   

    就是要实现和.net开发环境中控件拖动类似的功能,自己先顶了
      

  2.   

    谢谢lixuezhi(中子星) ,我现在也实现了些基本功能,就是不知道该如何和数据库交互
      

  3.   

    一个小图形是一个控件,把对象加上事件.不就可以拉.
    至于拖动,我有个想法不知道可行不
    就是扑捉鼠标左键的点击事件,moving事件和松开事件.
    点击事件的时候,确定是否是在一个图形上点击.
    moving的时候,更改点击的那个控件的位置坐标.
    松开的时候判断是否可以,如果不可以,图形返回开始位置.
      

  4.   

    看你这么急,给你一个例子和源程序
    参看如下文章,很不错
    http://www.codeproject.com/csharp/csmapviewnet01.asp
    http://www.codeproject.com/dotnet/Mapview.asp
    http://www.codeproject.com/csharp/canvasgis.asp
      

  5.   

    建议用C++做个控件,vb.net也可以做自定义控件,
    我这有个例子,如需要,发消息,告诉我E——MAIL
      

  6.   

    汗..真是英雄所见略同啊.我现在也在做类似的程序.要求小图能放大缩小,移动,而且有背景图,小图能随背景图放大缩小和移动.其中还有一类小图要求能以任意角度转动.而且小图是动画,非静态的.
    目前我只实现了小图的放大缩小和移动,其他的尚未实现.
    我是参考http://www.codeproject.com/csharp/DrawTools.asp ,它应该很符合你的要求,我的实现就是根据这个来的.中文翻译http://wdxinren.cnblogs.com/archive/2004/10/19/54231.aspx不过各位大虾,你们在编写类似程序时,难道没有遇到过cpu占用过高的问题吗?我可是遇到了啊,目前没有任何良好的解决思路.我也发过帖子求助,不过回帖的都太泛泛了....郁闷中
      

  7.   

    #region 用于拖动的用户变量
            private Collection<clsDragControlsKnockdown> mcControls = new Collection<clsDragControlsKnockdown>();
            private const int muMinSize = 10; //对控缩放的最小值
            private const int muBoxSize = 7;  //调整大小触模柄方框大小
            private Control muFocusedControl = null;
            private bool muIsCtrlKey = false;
            private Control muMControl = null;
            private bool muIsMouseDown = false;
            private Point muPointClicked;
            private Color muBoxColor = Color.White;
            private Label[] mulbl = new Label[8];
            private int muStartl, muStartt, muStartw, muStarth;
            private bool muDragging;
            private Cursor[] muArrArrow = 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>
            private void InitDragControl(Control moveControl)
            {            muMControl = moveControl;
                muMControl.MouseDown += new MouseEventHandler(this.Control_MouseDown);
                muMControl.MouseUp += new MouseEventHandler(this.Control_MouseUp);
                muMControl.MouseMove += new MouseEventHandler(this.Control_MouseMove);
                muMControl.Click += new System.EventHandler(this.Control_Click);            //构造8个调整大小触模柄
                for (int i = 0; i < 8; i++)
                {
                    
                    mulbl[i] = new Label();
                    mulbl[i].Tag = "HandleLable";
                    mulbl[i].TabIndex = i;
                    mulbl[i].FlatStyle = 0;
                    mulbl[i].Parent = this;
                    mulbl[i].BorderStyle = BorderStyle.FixedSingle;
                    mulbl[i].BackColor = muBoxColor;
                    mulbl[i].Cursor = muArrArrow[i];
                    mulbl[i].Text = "";
                    mulbl[i].BringToFront();
                    mulbl[i].MouseDown += new MouseEventHandler(this.handle_MouseDown);
                    mulbl[i].MouseMove += new MouseEventHandler(this.handle_MouseMove);
                    mulbl[i].MouseUp += new MouseEventHandler(this.handle_MouseUp);
                }
                Create();
            }
            private void split_click(object sender, System.EventArgs e)
            {
                muMControl = (sender as Control);
                muMControl.Focus();
                muFocusedControl = (sender as Control);
                
                //MessageBox.Show(P.Parent.Controls.Count.ToString());
            }
            private void Control_Click(object sender, System.EventArgs e)
            {
                muMControl = (sender as Control);
                muMControl.Focus();
                MoveHandles();            if (muIsCtrlKey == false)
                {
                    for (int i = 0; i < this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls.Count; i++)
                    {
                        if (this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls[i].Text.Trim().Length == 0 && this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls[i] is Label)
                        {
                            this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls[i].Visible = false;
                        }
                    }
                }
                ShowHandles();
                //选中某个控件后,需要触发事件,使属性窗口中有相应的属性
                if (this.mcControls[int.Parse(muMControl.Tag.ToString())].msControlType != null && this.mcControls[int.Parse(muMControl.Tag.ToString())].msControlType.Length > 0)
                {
                    if (this.ControlSelectedProperty != null)
                    {
                        this.ControlSelectedProperty(muMControl, new EventArgsControlSelectedProperty(this.mcControls[int.Parse(muMControl.Tag.ToString())].msControlType));
                    }
                }
                //在工具箱中有相应的动作
                if (this.ControlDragDrop == null)
                {
                    return;
                }
                if (this.muMControl.Tag == null)
                {
                    return;
                }
                if (this.mcControls[int.Parse(muMControl.Tag.ToString())].miKnockdownGroupIndex < 0)
                {
                    return;
                }
                this.ControlDragDrop(this, new EventArgsControlDragDrop(this.mcControls[int.Parse(muMControl.Tag.ToString())].miKnockdownGroupIndex));        }        private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
            {
                muMControl = (sender as Control);
                if (this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent == null)
                {
                    return;
                }
                muIsMouseDown = true;
                muFocusedControl = (sender as Control);            muPointClicked = new Point(e.X, e.Y);
                for (int i = 0; i < 8; i++)
                {
                    this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls.Add(mulbl[i]);
                    mulbl[i].BringToFront();
                }
                HideHandles();
            }        private void Control_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
            {
                Control tuControl = (sender as Control);
                this.UpdateControlInfomation(tuControl);
                muIsMouseDown = false;
                //MoveHandles();
                //ShowHandles();
                //muMControl.Visible = true;
            }        private void Control_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
            {
                if (!muIsMouseDown)
                {
                    return;
                }
                if (this.muFocusedControl == null)
                {
                    return;
                }            if (this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent == this)
                {
                    return;
                }            if (muIsMouseDown)
                {
                    int l = muMControl.Left + e.X - muPointClicked.X;
                    int t = muMControl.Top + e.Y - muPointClicked.Y;
                    int w = muMControl.Width;
                    int h = muMControl.Height;
                    //l = (l < 0) ? 0 : ((l + w > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Width) ?
                    //    this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Width - w : l);
                    //t = (t < 0) ? 0 : ((t + h > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Height) ?
                    //    this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Height - h : t);
                    muMControl.Left = l;
                    muMControl.Top = t;
                    //ControlLocality();
                }
                muMControl.Cursor = Cursors.SizeAll;
            }        #endregion        #region 调整大小触模柄鼠标事件        private void handle_MouseDown(object sender, MouseEventArgs e)
            {
                muDragging = true;
                muStartl = muMControl.Left;
                muStartt = muMControl.Top;
                muStartw = muMControl.Width;
                muStarth = muMControl.Height;
                HideHandles();
            }
      

  8.   

    //// 通过触模柄调整控件大小
            ////    0   1   2
            ////  7       3
            ////  6   5   4
            private void handle_MouseMove(object sender, MouseEventArgs e)
            {
                int l = muMControl.Left;
                int w = muMControl.Width;
                int t = muMControl.Top;
                int h = muMControl.Height;
                if (muMControl == this.mvPanel)
                {
                    l = 0;
                    t = 0;
                }
                if (muDragging)
                {
                    switch (((Label)sender).TabIndex)
                    {
                        //l算法:控件左边X坐标 + 鼠标在触模柄X坐标 < 控件左边X坐标 + 父控件宽度 - 控件大小 ?控件左边X坐标 + 鼠标在触模柄X坐标 :控件左边X坐标 + 父控件宽度 - 控件大小  
                        //t算法:
                        //w算法:
                        //h算法:
                        case 0: // muDragging top-left sizing box
                            l = muStartl + e.X < muStartl + muStartw - muMinSize ? muStartl + e.X : muStartl + muStartw - muMinSize;
                            t = muStartt + e.Y < muStartt + muStarth - muMinSize ? muStartt + e.Y : muStartt + muStarth - muMinSize;
                            w = muStartl + muStartw - muMControl.Left;
                            h = muStartt + muStarth - muMControl.Top;
                            break;
                        case 1: // muDragging top-center sizing box
                            t = muStartt + e.Y < muStartt + muStarth - muMinSize ? muStartt + e.Y : muStartt + muStarth - muMinSize;
                            h = muStartt + muStarth - muMControl.Top;
                            break;
                        case 2: // muDragging top-right sizing box
                            w = muStartw + e.X > muMinSize ? muStartw + e.X : muMinSize;
                            t = muStartt + e.Y < muStartt + muStarth - muMinSize ? muStartt + e.Y : muStartt + muStarth - muMinSize;
                            h = muStartt + muStarth - muMControl.Top;
                            break;
                        case 3: // muDragging right-middle sizing box
                            w = muStartw + e.X > muMinSize ? muStartw + e.X : muMinSize;
                            break;
                        case 4: // muDragging right-bottom sizing box
                            w = muStartw + e.X > muMinSize ? muStartw + e.X : muMinSize;
                            h = muStarth + e.Y > muMinSize ? muStarth + e.Y : muMinSize;
                            break;
                        case 5: // muDragging center-bottom sizing box
                            h = muStarth + e.Y > muMinSize ? muStarth + e.Y : muMinSize;
                            break;
                        case 6: // muDragging left-bottom sizing box
                            l = muStartl + e.X < muStartl + muStartw - muMinSize ? muStartl + e.X : muStartl + muStartw - muMinSize;
                            w = muStartl + muStartw - muMControl.Left;
                            h = muStarth + e.Y > muMinSize ? muStarth + e.Y : muMinSize;
                            break;
                        case 7: // muDragging left-middle sizing box
                            l = muStartl + e.X < muStartl + muStartw - muMinSize ? muStartl + e.X : muStartl + muStartw - muMinSize;
                            w = muStartl + muStartw - muMControl.Left;
                            break;
                    }
                    l = (l < 0) ? 0 : l;
                    t = (t < 0) ? 0 : t;
                    muMControl.SetBounds(l, t, w, h);
                }
            }        private void handle_MouseUp(object sender, MouseEventArgs e)
            {
                muDragging = false;
                MoveHandles();
                ShowHandles();
            }        #endregion
      

  9.   

    #region Create方法        private void Create()
            {
                if (this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent == null)
                {
                    return;
                }
                for (int i = 0; i < 8; i++)
                {
                    this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Controls.Add(mulbl[i]);
                    mulbl[i].BringToFront();
                }            HideHandles();
            }
            
            private void ControlLocality()
            {
                if (muMControl.Location.X < 0)
                {
                    muMControl.Visible = false;
                    muMControl.Left = 0;
                }
                if (muMControl.Location.Y < 0)
                {
                    muMControl.Visible = false;
                    muMControl.Top = 0;
                }
                if (muMControl.Location.X + muMControl.Width > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Width)
                {
                    muMControl.Visible = false;
                    muMControl.Left = this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Width - muMControl.Width;
                }
                if (muMControl.Location.Y + muMControl.Height > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Height)
                {
                    muMControl.Visible = false;
                    muMControl.Top = this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.Height - muMControl.Height;
                }
            }        private void HideHandles()
            {
                for (int i = 0; i < 8; i++)
                {
                    mulbl[i].Visible = false;
                }
            }        private void MoveHandles()
            {
                int sX = muMControl.Left - muBoxSize;
                int sY = muMControl.Top - muBoxSize;
                int sW = muMControl.Width + muBoxSize;
                int sH = muMControl.Height + muBoxSize;
                int hB = muBoxSize / 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++)
                {
                    mulbl[i].SetBounds(arrPosX[i], arrPosY[i], muBoxSize, muBoxSize);
                }
            }        private void ShowHandles()
            {
                if (this.muFocusedControl == null)
                {
                    return;
                }
                if (muMControl != null)
                {
                    //for (int i = 0; i < 8; i++)
                    //{
                    //    mulbl[i].Visible = true;
                    //}
                    mulbl[3].Visible = true;
                    mulbl[4].Visible = true;
                    mulbl[5].Visible = true;
                    if (muMControl.Tag != null && muMControl.Tag.ToString().Length>0)
                    {
                       
                        int tiControlIndex=-1;
                        try
                        {
                            tiControlIndex = Convert.ToInt16(muMControl.Tag.ToString());
                        }
                        catch (Exception ex)
                        {
                            return;
                        }
                       
                        if (tiControlIndex < 0 || tiControlIndex > this.mcControls.Count)
                        {
                            return;
                        }
                        if (this.mcControls[tiControlIndex].mcParent == this)
                        {
                            mulbl[7].Visible = false;
                            mulbl[1].Visible = false;
                            mulbl[0].Visible = false;
                            mulbl[2].Visible = false;
                            mulbl[6].Visible = false;
                        }
                        else
                        {
                            mulbl[7].Visible = true;
                            mulbl[1].Visible = true;
                            mulbl[0].Visible = true;
                            mulbl[2].Visible = true;
                            mulbl[6].Visible = true;
                        }
                    }
                    else
                    {
                        mulbl[7].Visible = true;
                        mulbl[1].Visible = true;
                        mulbl[0].Visible = true;
                        mulbl[2].Visible = true;
                        mulbl[6].Visible = true;
                    }
                }
            }        #endregion这是我的代码,不过有一些你需要改或者用不着,我就没帮你挑出来了,你可以看看思路哈
    InitDragControl()是入口
      

  10.   

    int l = muMControl.Left + e.X - muPointClicked.X;
                    int t = muMControl.Top + e.Y - muPointClicked.Y;
                    int w = muMControl.Width;
                    int h = muMControl.Height;
                    //l = (l < 0) ? 0 : ((l + w > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Width) ?
                    //    this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Width - w : l);
                    //t = (t < 0) ? 0 : ((t + h > this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Height) ?
                    //    this.mcControls[int.Parse(muMControl.Tag.ToString())].mcParent.ClientRectangle.Height - h : t);
                    muMControl.Left = l;
                    muMControl.Top = t;
                    //ControlLocality();