参考上篇文章的前半部,我们这次选择GxMutiCam项目,此项目可以同时开启多个相机
通过此项目,我们一边完成开发,一边学习
此项目下有两个窗体,其中一个是ImgShowForm.cs 用于打开单个相机的采集界面
另一个是GetMutiCam,称之为 主控程序,可以控制打开新相机
我们先通过主控程序学习如何通过一个Form打开多个Form
关键函数如下(即 点击打开设备 的函数)
/// <summary>
/// 点击"打开设备"按钮消息响应函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void m_btn_OpenDevice_Click(object sender, EventArgs e)
{
string strSN = ""; //打开设备用的序列号
try
{
// 判断当前连接设备个数
if (m_listIGXDeviceInfo.Count <= 0)
{
MessageBox.Show("未发现设备!");
return;
}
try
{
//停止流通道、注销采集回调和关闭流
if (null != m_listCCamerInfo[m_nOperateID].m_objIGXStream)
{
m_listCCamerInfo[m_nOperateID].m_objIGXStream.Close();
m_listCCamerInfo[m_nOperateID].m_objIGXStream = null;
}
}
catch (Exception)
{
}
// 如果设备已经打开则关闭,保证相机在初始化出错情况下能再次打开
if (null != m_listCCamerInfo[m_nOperateID].m_objIGXDevice)
{
m_listCCamerInfo[m_nOperateID].m_objIGXDevice.Close();
m_listCCamerInfo[m_nOperateID].m_objIGXDevice = null;
}
strSN = m_listIGXDeviceInfo[m_nOperateID].GetSN();
IGXDevice objIGXDevice= m_objIGXFactory.OpenDeviceBySN(strSN, GX_ACCESS_MODE.GX_ACCESS_EXCLUSIVE);
//打开列表选中的设备
m_listCCamerInfo[m_nOperateID].m_objIGXDevice = objIGXDevice;
m_listCCamerInfo[m_nOperateID].m_objIGXFeatureControl = m_listCCamerInfo[m_nOperateID].m_objIGXDevice.GetRemoteFeatureControl();
__InitParam();
// 获取相机参数,初始化界面控件
__InitUI();
ImageShowFrom objImageShowFrom = new ImageShowFrom(objIGXDevice, m_nOperateID);
objImageShowFrom.OpenDevice();
m_listCCamerInfo[m_nOperateID].m_objImageShowFrom = objImageShowFrom;
__SelectDeviceAndShow(m_nOperateID);
// 更新设备打开标识
m_listCCamerInfo[m_nOperateID].m_bIsOpen = true;
//刷新界面
__UpdateUI();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
打开界面的主要函数在:
可以看到,先连接到相机上,然后ImageShowFrom objImageShowFrom = new ImageShowFrom(objIGXDevice, m_nOperateID);
随后,对不同的相机绑定上不同的窗口
/// <summary>
/// 根据对应的设备对象绑定显示控件
/// </summary>
/// <param name="nCamID">相机ID</param>
private void __SelectDeviceAndShow(int nCamID)
{
switch (nCamID)
{
case 0:
{
m_listCCamerInfo[nCamID].m_objImageShowFrom.MdiParent = this;
m_listCCamerInfo[nCamID].m_objImageShowFrom.StartPosition = FormStartPosition.Manual;
m_listCCamerInfo[nCamID].m_objImageShowFrom.Location = new Point(0, 0);
m_listCCamerInfo[nCamID].m_objImageShowFrom.Show();
}
break;
case 1:
{
m_listCCamerInfo[nCamID].m_objImageShowFrom.MdiParent = this;
m_listCCamerInfo[nCamID].m_objImageShowFrom.StartPosition = FormStartPosition.Manual;
m_listCCamerInfo[nCamID].m_objImageShowFrom.Location = new Point(390, 0);
m_listCCamerInfo[nCamID].m_objImageShowFrom.Show();
}
break;
case 2:
{
m_listCCamerInfo[nCamID].m_objImageShowFrom.MdiParent = this;
m_listCCamerInfo[nCamID].m_objImageShowFrom.StartPosition = FormStartPosition.Manual;
m_listCCamerInfo[nCamID].m_objImageShowFrom.Location = new Point(0, 330);
m_listCCamerInfo[nCamID].m_objImageShowFrom.Show();
}
break;
case 3:
{
m_listCCamerInfo[nCamID].m_objImageShowFrom.MdiParent = this;
m_listCCamerInfo[nCamID].m_objImageShowFrom.StartPosition = FormStartPosition.Manual;
m_listCCamerInfo[nCamID].m_objImageShowFrom.Location = new Point(390,330);
m_listCCamerInfo[nCamID].m_objImageShowFrom.Show();
}
break;
default:
break;
}
}
剩下的操作和单相机操作就一样了。