自由-自定义控件的魅力(纯新手向,高手口下留情)

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


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 = "调整大小";
}
}
}


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

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 = path;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}

}


好了,现在就可以生成设备图了,接着就是保存的问题,画图的话只要保存图片就可以了,可是现在全是控件,怎么办呢,那就保存控件的信息就好了Size Location BackgroundImage Name,为了方便,就用xml好了,加个保存按钮。

XmlNode node = doc.SelectSingleNode("/Equipment/Image");
XmlElement element = doc.CreateElement(ctr.Name);

XmlElement el = doc.CreateElement("id");
string[] str = ctr.Name.Split('-');
el.InnerText = str[1];
element.AppendChild(el);

XmlElement el1 = doc.CreateElement("name");
el1.InnerText = str[0];
element.AppendChild(el1);

XmlElement el2 = doc.CreateElement("location");
el2.InnerText = ctr.Location.ToString();
element.AppendChild(el2);

XmlElement el3 = doc.CreateElement("size");
el3.InnerText = ctr.Size.ToString();
element.AppendChild(el3);

XmlElement el4 = doc.CreateElement("ratio");
el4.InnerText = ratio;
element.AppendChild(el4);

node.AppendChild(element);
doc.Save(path + "Equipment.xml");

搞定了,现在建立工程,将控件包含进去,弄个Treeview将设备图片弄上去,添加一个事件写上

private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
{
DoDragDrop(e.Item,DragDropEffects.Copy);
}

自己试下,看看效果,先做一个头进来



然后是身体


改改大小和位置,当当当,合体成功


现在完成设备图没问题了,没有测试太多,反正向下图这样的绝对不会卡的



就这样不用考虑什么布局啊,重绘啊,满意就拖一个,不满意就去掉,很是简单,反正图片什么的美工会去弄来的
...全文
162 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sarah_jing 2012-06-04
  • 打赏
  • 举报
回复
标记下,好想法
Conmajia 2012-06-03
  • 打赏
  • 举报
回复
不看清楚帖子就回帖的真是。。
  • 打赏
  • 举报
回复
或者说,你完全没有理解“前天有人问了一个问题”的问题是什么,而自己杜撰出了另外一个简单的东西。

人家的东西其实是一个实用的可编辑的、超级简单的地理系统系统。

人家的东西好比是宝马汽车,而你的东西就是旱冰鞋。其实不是一类东西。
  • 打赏
  • 举报
回复
工厂平面图呢?而且看原先的需求、一定是一个具有灵活的空间坐标的可编辑系统。例如用户可以画各种业务路线图、点状图、用户可以编辑各种复杂的属性。

而看你最后的结果,似乎完全是给把需求忘记了。这种花费精力、时间结果必须作废的产品,不好。
Conmajia 2012-06-03
  • 打赏
  • 举报
回复
挺好,从简单入手。能用就行。
nada123456789 2012-06-03
  • 打赏
  • 举报
回复
学习下,还没试过自己写控件呢
evelyn_green 2012-06-03
  • 打赏
  • 举报
回复
中兴华为的那些光数通讯网络硬件的自带管理系统都有这功能很成熟的,具体可以参考下了.

110,501

社区成员

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

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

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