日期:2014-05-18  浏览次数:20991 次

自由-自定义控件的魅力(纯新手向,高手口下留情)
前天有人问了一个问题,说的是“ 我现在的需求就是给一张工厂平面图,我传到服务器上做底层,然后在图层上标注特殊内容,比如仓库,办公室等!,这些特殊内容都是已经存在的标记,比如三脚架代表危险源 然后放在图中相应位置~”,正好我也在做类似的东西,所以说一下我的思路。
  我的任务是做一个设备状态图,做之前不知道有哪些设备,也不知道具体是怎么连的,要求呢用户能自定义的添加,修改设备,如改变大小啊,改变位置什么的。
  作为一个只会拖控件的新人,我表示压力很大,最后在领导的帮助下找到了办法,那就是不用画图,而是用自定义控件。
画不出来,我就把设备一个一个的拖上去,那样只要一个设备树TreeView就可以了.
  首先做一个生成设备样子的控件,就叫ImageBox好了,然后添加事件使其可以自由改变大小和位置;
  加上一个contextMenuStrip来控制,在鼠标事件里面代码很简单几句就可以搞定

C# code

    private bool _mouseflag = false;
    private Point _locationp;
    private void ctrImageBox_MouseDown(object sender, MouseEventArgs e)
        {
            _mouseflag = true;
            _locationp.X = MousePosition.X;
            _locationp.Y = MousePosition.Y;
        }

        private void ctrImageBox_MouseMove(object sender, MouseEventArgs e)
        {
            if (_mouseflag)
            {
                if (ChangeSizeToolStripMenuItem.Text == "调整位置")
                {
                    this.Width += MousePosition.X - _locationp.X;
                    this.Height += MousePosition.Y - _locationp.Y;
                }
                if (ChangeSizeToolStripMenuItem.Text == "调整大小")
                {
                    this.Left += MousePosition.X - _locationp.X;
                    this.Top += MousePosition.Y - _locationp.Y;
                }
                _locationp.X = MousePosition.X;
                _locationp.Y = MousePosition.Y;
            }
        }

        private void ctrImageBox_MouseUp(object sender, MouseEventArgs e)
        {
            _mouseflag = false;
            _locationp = new Point(0, 0);
        }

        private void ctrImageBox_MouseLeave(object sender, EventArgs e)
        {
            _mouseflag = false;
        }

        private void RemoveToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Visible = false;
        }

        private void ChangeSizeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (ChangeSizeToolStripMenuItem.Text == "调整位置")
            {
                ChangeSizeToolStripMenuItem.Text = "调整大小";
            }
            else
            {
                if (ChangeSizeToolStripMenuItem.Text == "调整大小")
                {
                    ChangeSizeToolStripMenuItem.Text = "调整位置";
                }
                else
                {
                    ChangeSizeToolStripMenuItem.Text = "调整大小";
                }
            }
        }



第二步就是做生成图控件了,因为我只会拖控件,那怎么办呢,那就在这里加上拖动生成的代码,
C# code

      private void EquipmentImage_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Copy;
            m_dragnode = (TreeNode)(e.Data.GetData(typeof(TreeNode)));
            m_imageindex = m_dragnode.ImageIndex;
            filename = path + m_dragnode.Text + ".jpeg";
        }

        private void EquipmentImage_DragDrop(object sender, DragEventArgs e)
        {
            try
            {
                OperationAndMaintenance.Control.ctrImageBox imagebox = new OperationAndMaintenance.Control.ctrImageBox();
                this.Controls.Add(imagebox);
                ImageIDMax++;
                imagebox.Name = m_dragnode.Text + "-" + ImageIDMax.ToString();
                Image myimage = Image.FromFile(filename);
                imagebox.Size = new Size(myimage.Width, myimage.Height);
                imagebox.BackgroundImage = myimage;
                imagebox.Location = PointToClient(MousePosition);
                imagebox.Show();
                EquipmentList.Add(imagebox);
                filename = pa