目录
项目要求
枚举相机生成相机树,拖动节点打开对应的相机。
项目环境
C#、WinForm
项目实现
TreeView
cameratree
1. 窗口添加存放检索相机treeview,并设置相关参数。
2. 添加索引图标
//读取图像,创建ImageList
private void creat_imagelist()
{
string path = "..\\Images\\";
string[] files = Directory.GetFiles(path);
foreach (string file in files)
{
System.Drawing.Image image = System.Drawing.Image.FromFile(file);
ImageList.Images.Add(image);
}
}
//在treeview初始化位置添加ImageList,节点图标默认是第一张图片
private void treeviewinit()
{
creat_imagelist();
cameratree.ImageList = ImageList;
}
opentree
1.窗口添加打开相机treeview,并设置相关参数。
2.添加索引图标(这里两个treeview用同一个ImageList)
private void treeviewinit()
{
creat_imagelist();
cameratree.ImageList = ImageList;
opentree.ImageList = ImageList;
}
鼠标拖拽事件
右击devicetree节点,拖动到opentree。
#region 鼠标拖拽事件
private void cameratree_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
TreeNode selectedNode = cameratree.GetNodeAt(e.X, e.Y);
if (selectedNode != null && !opennodes.Contains(selectedNode))
{
cameratree.SelectedNode = selectedNode;
cameratree.DoDragDrop(selectedNode, DragDropEffects.Move);
}
}
}
private void opentree_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(TreeNode)))
{
e.Effect = DragDropEffects.Move;
}
}
private void opentree_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(TreeNode)))
{
TreeNode draggedNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
string cameratype = draggedNode.Parent.Name;
TreeNode[] targetNode = opentree.Nodes.Find(cameratype, false);
if (targetNode.Length < 1)
{
TreeNode cameraname = new TreeNode(draggedNode.Parent.Text, draggedNode.ImageIndex, draggedNode.SelectedImageIndex);
cameraname.Name = cameratype;
opentree.Nodes.Add(cameraname);
}
targetNode = opentree.Nodes.Find(cameratype, false);
TreeNode cameranode = (TreeNode)draggedNode.Clone();
targetNode[0].Nodes.Add(cameranode);
opentree.SelectedNode = cameranode;
//记录打开的相机节点
opennodes.Add(draggedNode);
}
}
#endregion
检索相机
枚举相机,函数返回相机数量,根据检索到的数量更新devicetree
public void camerascan()
{
uint h_count;
my_hik.CameraScan(out h_count);
if (h_count > 0)
{
add_cameranode("hikvision", h_count);
}
else
{
MessageBox.Show("nofind hikvision camera");
}
}
public void add_cameranode(string cameratype, uint count)
{
TreeNode[] targetnode = cameratree.Nodes.Find(cameratype, false);
if (targetnode.Length > 0)
{
for (int i = 0; i < count; i++)
{
TreeNode cameranode = new TreeNode((cameratype + " " + i.ToString()), i + 1, i + 1);
cameranode.Name = i.ToString();
targetnode[0].Nodes.Add(cameranode);
}
}
else
{
MessageBox.Show("nofind cameratree");
}
}
打开相机
根据给定索引打开对应相机,采图为回调函数
public void cameraopen()
{
TreeNode opennode = cameratree.SelectedNode;
bool openflag = true;
string cameratype = cameratree.SelectedNode.Parent.Name;
int selectdevice = int.Parse(cameratree.SelectedNode.Name);
camerapicture.Add(new PictureBox());
camerapicture[camerapicture.Count - 1].Name = cameratree.SelectedNode.Text;
switch (cameratype)
{
case "do3think":
{
openflag = my_do3.CameraOpen((uint)selectdevice, camerapicture[camerapicture.Count - 1].Handle);
}
break;
case "hikvision":
{
openflag = my_hik.CameraOpen(selectdevice, camerapicture[camerapicture.Count - 1].Handle);
}
break;
case "mindvision":
{
openflag = my_mind.CameraOpen(selectdevice, camerapicture[camerapicture.Count - 1].Handle);
}
break;
default: break;
}
if (openflag == false)
{
opennodes.Remove(opennode);
cameratree.SelectedNode.Text += " (disconnect)";
opentree.SelectedNode.Remove();
camerapicture.RemoveAt(camerapicture.Count - 1);
MessageBox.Show("fail open!");
}
imageshow();
}
相机功能
窗口添加ContextMenuStrip组件,当opentree打开时,菜单显示在点击位置。
private System.Windows.Forms.ContextMenuStrip camerafunc;
private System.Windows.Forms.ToolStripMenuItem 保存图像ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem 关闭相机ToolStripMenuItem;
private void opentree_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
TreeNode selectedNode = opentree.GetNodeAt(e.X, e.Y);
if (selectedNode != null)
{
opentree.SelectedNode = selectedNode;
camerafunc.Show(opentree, e.Location);
}
}
}
保存图像
根据选择的节点,将保存对应相机图像。保存路径为打开文件夹的路径。
private void 保存图像ToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "bmp file(*.bmp)|*.bmp|jpeg file(*.jpeg)|*.jpeg|png file(*.png)|*.png|tif file(*.tif)|*.tif|gif file(*.gif)|*.gif|raw Files(*.dat)|*.dat";
if (sfd.ShowDialog() == DialogResult.OK)
{
TreeNode selectnode = opentree.SelectedNode;
TreeNodeCollection childNodes = selectnode.Parent.Nodes;
int nodeindex = childNodes.IndexOf(selectnode);
string filepath = sfd.FileName;
switch (selectnode.Parent.Name)
{
case "do3think": my_do3.savefunc(filepath, nodeindex); break;
case "hikvision": my_hik.savefunc(filepath, nodeindex); break;
case "mindvision": my_mind.savefunc(filepath, nodeindex); break;
default: break;
}
}
}
关闭相机
根据选择的节点,关闭对应的相机
private void 关闭相机ToolStripMenuItem_Click(object sender, EventArgs e)
{
TreeNode selectnode = opentree.SelectedNode;
TreeNodeCollection childNodes = selectnode.Parent.Nodes;
int nodeindex = childNodes.IndexOf(selectnode);
switch (selectnode.Parent.Name)
{
case "do3think": my_do3.CameraClose(nodeindex); break;
case "hikvision": my_hik.CameraClose(nodeindex); break;
case "mindvision": my_mind.CameraClose(nodeindex); break;
default: break;
}
foreach (PictureBox picture in camerapicture)
{
if (picture.Name == selectnode.Text)
{
camerapicture.Remove(picture);
picture.Dispose();
break;
}
}
opennodes.RemoveAll(node => node.Text == selectnode.Text);
selectnode.Remove();
imageshow();
}
显示图像
窗口添加pannel组件,调整到合适的大小位置。注:该模块引用他人代码,侵权删。
#region 显示模块
public void onecamera()
{
//布局对象
TableLayoutPanel tableLayoutPanel = new TableLayoutPanel();
//设置布局的列数与行数(1列1行)
tableLayoutPanel.ColumnCount = 1;
tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); //设置百分比
tableLayoutPanel.RowCount = 1;
tableLayoutPanel.RowStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); //设置百分比
//添加控件
tableLayoutPanel.Controls.Add(camerapicture[0]);
tableLayoutPanel.Dock = DockStyle.Fill;
tableLayoutPanel.AutoSize = true;
//this.Invoke(new AddControlDelegate(AddControl), new object[] { this.panel3, tableLayoutPanel });
panel3.Controls.Add(tableLayoutPanel);
}
public void twocamera()
{
//布局对象
TableLayoutPanel tableLayoutPanel = new TableLayoutPanel();
//设置布局的行数
tableLayoutPanel.RowCount = 3; //分成上下两部分
tableLayoutPanel.RowStyles.Add(new ColumnStyle(SizeType.Percent, 20F)); //设置百分比
tableLayoutPanel.RowStyles.Add(new ColumnStyle(SizeType.Percent, 60F));
tableLayoutPanel.RowStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
//创建布局器对象
TableLayoutPanel tableLayUP = new TableLayoutPanel() { Dock = DockStyle.Fill };
//左右等分(1行2列)
tableLayUP.ColumnCount = 2;
tableLayUP.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F)); //设置百分比
tableLayUP.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
//添加相机
tableLayUP.Controls.Add(camerapicture[0], 0, 0); //行列坐标
tableLayUP.Controls.Add(camerapicture[1], 1, 0);
//将上半部分添加到布局器中
tableLayUP.AutoSize = true;
tableLayoutPanel.Controls.Add(tableLayUP, 0, 1);
//添加控件
tableLayoutPanel.AutoSize = true;
tableLayoutPanel.Dock = DockStyle.Fill;
panel3.Controls.Add(tableLayoutPanel);
}
public void threecamera()
{
//布局对象
TableLayoutPanel tableLayoutPanel = new TableLayoutPanel();
//设置布局的行数
tableLayoutPanel.RowCount = 2; //分成上下两部分
tableLayoutPanel.RowStyles.Add(new ColumnStyle(SizeType.Percent, 50F)); //设置百分比
tableLayoutPanel.RowStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
//创建布局器对象
TableLayoutPanel tableLayUP = new TableLayoutPanel() { Dock = DockStyle.Fill };
//左右等分(1行2列)
tableLayUP.ColumnCount = 2;
tableLayUP.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F)); //设置百分比
tableLayUP.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
//添加相机
tableLayUP.Controls.Add(camerapicture[0], 0, 0); //行列坐标
tableLayUP.Controls.Add(camerapicture[1], 1, 0);
//将上半部分添加到布局器中
tableLayoutPanel.Controls.Add(tableLayUP, 0, 0);
//创建布局器对象
TableLayoutPanel tableLayDown = new TableLayoutPanel() { Dock = DockStyle.Fill };
//左中右等分(1行3列)只用中间一列
tableLayDown.ColumnCount = 3;
tableLayDown.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F)); //设置百分比
tableLayDown.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 60F));
tableLayDown.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
//添加相机
tableLayDown.Controls.Add(camerapicture[2], 1, 0); //行列坐标
//将下半部分添加到布局器中
tableLayoutPanel.Controls.Add(tableLayDown, 0, 1);
//添加控件
tableLayoutPanel.Dock = DockStyle.Fill;
panel3.Controls.Add(tableLayoutPanel);
}
public void fourcamera()
{
//布局对象
TableLayoutPanel tableLayoutPanel = new TableLayoutPanel();
//设置布局的行数与列数
tableLayoutPanel.ColumnCount = 2;
tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F)); //设置百分比
tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
tableLayoutPanel.RowCount = 2;
tableLayoutPanel.RowStyles.Add(new ColumnStyle(SizeType.Percent, 50F)); //设置百分比
tableLayoutPanel.RowStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
//添加lab标签
tableLayoutPanel.Controls.Add(camerapicture[0], 0, 0); //行列坐标
tableLayoutPanel.Controls.Add(camerapicture[1], 1, 0);
tableLayoutPanel.Controls.Add(camerapicture[2], 0, 1);
tableLayoutPanel.Controls.Add(camerapicture[3], 1, 1);
//添加控件
tableLayoutPanel.Dock = DockStyle.Fill;
panel3.Controls.Add(tableLayoutPanel);
}
public void imageshow()
{
panel3.Controls.Clear();
foreach (PictureBox i in camerapicture)
{
i.Dock = DockStyle.Fill;
i.SizeMode = PictureBoxSizeMode.StretchImage;
}
switch (camerapicture.Count)
{
case 1: onecamera(); break;
case 2: twocamera(); break;
case 3: threecamera(); break;
case 4: fourcamera(); break;
default: break;
}
}
#endregion