private void panel1_Paint(object sender, PaintEventArgs e)
{
SetActiveWnd(m_nCurIndex);
}
public void DrawActivePage(bool bActive)
{
Rectangle rt = new Rectangle(m_videoform[m_nCurIndex].Left, m_videoform[m_nCurIndex].Top, m_videoform[m_nCurIndex].Width, m_videoform[m_nCurIndex].Height);
if (!bActive)
{
Rectangle rtInvalidate = new Rectangle(rt.X - 1, rt.Y - 1, rt.Width + 2, rt.Height + 2);
Invalidate(rtInvalidate, true);
}
else
{
Graphics graphic = Graphics.FromHwnd(this.Handle);
Pen pen = new Pen(Color.Red, 2);
graphic.DrawRectangle(pen, rt);
}
}
private void SetColor(int nIndex)
{
/*int nBright = 0;
int nHue = 0;
int nSaturation = 0;
int nContrast = 0;*/
IntPtr lPlayHandle = m_videoform[m_nCurIndex].Handle;
if (lPlayHandle.ToInt32() <= 0)
{
return;
}
// m_videoform[nIndex].GetColor(out nBright, out nContrast, out nSaturation, out nHue);
}
public void SetActiveWnd(int nIndex)
{
if (-1 != m_nCurIndex && m_nCurIndex != nIndex)
{
DrawActivePage(false);
}
if (m_nCurIndex != nIndex)
{
m_nCurIndex = nIndex;
}
DrawActivePage(true);
SetColor(m_nCurIndex);
}
public void ArrayWindow(int iNumber)
{
m_nTotalWnd = iNumber;
int iWidth, iHeight;
int nStartLeft = this.panel1.Left;//视频显示的靠左位置
int nStartTop = this.panel1.Top;//视频显示的靠上位置
int nFullWidth = this.panel1.Width;//视频总宽
int nFullHeight = this.panel1.Height;//视频总高
iWidth = nFullWidth-6;
iHeight = nFullHeight-6;
int i = 0;
for (i = 0; i < 32; i++) //MAXWNDNUM ==32
{
m_videoform[i].Hide();
}
int nNull = 3;
switch (iNumber)
{
case 1:
m_videoform[0].SetBounds(nStartLeft, nStartTop, iWidth, iHeight);
m_videoform[0].Show();
break;
case 4:
for (i = 0; i < 2; i++)
{
m_videoform[i].SetBounds(nStartLeft + i * (iWidth / 2) + i * nNull, nStartTop, (iWidth / 2), iHeight / 2);
m_videoform[i].Show();
}
for (i = 2; i < 4; i++)
{
m_videoform[i].SetBounds(nStartLeft + (i - 2) * (iWidth / 2) + (i - 2) * nNull, nStartTop + iHeight / 2 + nNull, (iWidth / 2), iHeight / 2);
m_videoform[i].Show();
}
break;
case 9:
for (i = 0; i < 3; i++)
{
m_videoform[i].SetBounds(nStartLeft + i * (iWidth / 3) + i * nNull,nStartTop, (iWidth / 3), iHeight / 3);
m_videoform[i].Show();
}
for (i = 3; i < 6; i++)
{
m_videoform[i].SetBounds(nStartLeft + (i - 3) * (iWidth / 3) + (i - 3) * nNull, nStartTop + iHeight / 3 + nNull, (iWidth / 3), iHeight / 3);
m_videoform[i].Show();
}
for (i = 6; i < 9; i++)
{
m_videoform[i].SetBounds(nStartLeft + (i - 6) * (iWidth / 3) + (i - 6) * nNull, nStartTop + 2 * iHeight / 3 + 2 * nNull, (iWidth / 3), iHeight / 3);
m_videoform[i].Show();
}
break;
case 16:
for (i = 0; i < 4; i++)
{
m_videoform[i].SetBounds(nStartLeft + i * (iWidth / 4) + (i) * nNull, nStartTop, (iWidth / 4), iHeight / 4);
m_videoform[i].Show();
}
for (i = 4; i < 8; i++)
{
m_videoform[i].SetBounds(nStartLeft + (i - 4) * (iWidth / 4) + (i - 4) * nNull, nStartTop + iHeight / 4 + nNull, (iWidth / 4), iHeight / 4);
m_videoform[i].Show();
}
for (i = 8; i < 12; i++)
{
m_videoform[i].SetBounds(nStartLeft + (i - 8) * (iWidth / 4) + (i - 8) * nNull, nStartTop + iHeight / 2 + 2 * nNull, (iWidth / 4), iHeight / 4);
m_videoform[i].Show();
}
for (i = 12; i < 16; i++)
{
m_videoform[i].SetBounds(nStartLeft + (i - 12) * (iWidth / 4) + (i - 12) * nNull, nStartTop + 3 * iHeight / 4 + 3 * nNull, (iWidth / 4), iHeight / 4);
m_videoform[i].Show();
}
break;
default:
break;
}
}
private void g_displaySplitcomboBox_SelectedIndexChanged(object sender, EventArgs e)
{
int nWndNum = 1;
if (g_displaySplitcomboBox.SelectedIndex == 0)
{
nWndNum = 1;
}
else if (g_displaySplitcomboBox.SelectedIndex == 1)
{
nWndNum = 4;
}
else if (g_displaySplitcomboBox.SelectedIndex == 2)
{
nWndNum = 9;
}
else if (g_displaySplitcomboBox.SelectedIndex == 3)
{
nWndNum = 16;
}
ArrayWindow(nWndNum);
}
视频监控分屏其实比较简单,比方我要做最大16个画面,那么做一个视频类继承自UserControl,为了方便管理16个画面,做了一个panel用于放置画面。至于视频怎么播放,获取m_videoform[0].Handle的句柄
IntPtr render_wnd = m_videoform[0].Handle;
public VideoForm[] m_videoform = new VideoForm[16];
在主函数先初始化。
for (int i = 0; i < 16; i++)
{
m_videoform[i] = new VideoForm();
this.Controls.Add(this.m_videoform[i]);
m_videoform[i].SetWndIndex(i);
}
public partial class VideoForm : UserControl
{
int m_nIndex; //index
public int m_iPlayhandle; //play handle
public void SetWndIndex(int nIndex)
{
m_nIndex = nIndex;
}
public VideoForm()
{
InitializeComponent();
}
private void VideoForm_Click(object sender, EventArgs e)
{
GMApplicationMain clientdemo = (GMApplicationMain)this.Parent;
clientdemo.SetActiveWnd(m_nIndex);
clientdemo.g_displaySplitcomboBox.Focus();
}
}