📄 netsdkdemodlg.cpp
字号:
//初始化画面分割模式选择项
m_normalBtnPannel.InitSplit(CUR_SPLIT);
m_normalBtnPannel.ShowWindow(SW_SHOW);
m_curScreen = 0;
m_screenPannel.SetShowPlayWin(CUR_SPLIT, m_curScreen);
//设置连接等待时间
CLIENT_SetConnectTime(m_connectwaittime, 3);
LastError();
CLIENT_RigisterDrawFun(ChannelAutoDraw, (DWORD)this);
LastError();
// for (int j = 0; j < CUR_MAXCHAN; j++)
// {
// m_playWnd[j].Create(IDD_CHILD_PLAYWND, &m_screenPannel);//can't input this point,may be input
// m_playWnd[j].SetWinID(j);
// }
// m_originParent = 0;
// m_bFullSCRN = FALSE;
//初始化关闭声音
m_curSoundSplit = -1;
//创建状态页面和系统配置页面
m_ClientStateDlg.Create(IDD_CLIENT_STATE);
m_ClientStateDlg.CenterWindow();
m_ClientStateDlg.m_isNoMoreShow = TRUE;
m_ClientStateDlg.UpdateData(false);
//初始化云台控制状态
m_bPTZCtrl = FALSE;
//刷新界面信息
UpdateScreen(CUR_SPLIT+1);
UpdateCurScreenInfo();
/*Begin: Add by yehao(10857) For Task.NO.11071 2006-12-23*/
m_broadcastDevList.clear();
m_bRecord = FALSE;
memset((void *)&m_talkhandle, 0, sizeof(TalkHandleInfo));
m_uRecordCount = 0;
/*End: yehao(10857) Task.NO.11071 */
//目前还没实现的功能
// GetDlgItem(IDC_UPDATECPROCESS)->EnableWindow(false);
// GetDlgItem(IDC_SETIFRAME)->EnableWindow(false);
// GetDlgItem(IDC_DEVICE_WORKSTATE)->EnableWindow(false);
//设置系统秒定时器,用于刷新码流统计和进度条并更新客户端信息
// m_bShowStatus = FALSE;
// SetTimer(TIMER_KBPS, 1111,NULL);
// m_hSp = DHSP_Init(0 ,0);
// m_spFile = 0;
return TRUE;
}
void CNetSDKDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CNetSDKDemoDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CNetSDKDemoDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
////////////////////////////////内部使用小接口函数///////////////////////////////////////////////////
//根据登录ID获取设备信息指针
void *CNetSDKDemoDlg::FindDeviceInfo(LONG lLoginID, char *sDVRIP,LONG nDVRPort)
{
/*
POSITION nPos;
DeviceNode *pInfo;
nPos = g_ptrdevicelist->GetHeadPosition();
for(int i = 0; i < g_ptrdevicelist->GetCount(); i ++ )
{
pInfo = (DeviceNode *)g_ptrdevicelist->GetNext(nPos);
if(pInfo->LoginID == lLoginID)
{
return pInfo;
}
}
*/
return NULL;
}
//获取当前设备列表中选择的设备信息指针
void *CNetSDKDemoDlg::GetCurDeviceInfo()
{
HTREEITEM node;
DWORD nData;
node = m_devicelist.GetSelectedItem();
if(!node)
{
MessageBox(MSG_DEMODLG_CHECKSEL);
return NULL;
}
nData = m_devicelist.GetItemData(node);
if(nData < 16) //通道选项,取得父项
{
node = m_devicelist.GetParentItem(node);
}
return (void *)m_devicelist.GetItemData(node); //父项记录的数据为设备的信息指针值
}
//根据句柄获取播放窗口序号,其中句柄可以是监视通道Id,播放Id,预览id等
int CNetSDKDemoDlg::GetHandleSplit(LONG lPlayHandle)
{
SplitInfoNode siNode;
memset(&siNode, 0, sizeof(siNode));
for(int i = 0; i < MAX_CHANNUM; i++)
{
if (!GetSplitInfo_Main(i, &siNode))
{
return -1;
}
if(siNode.Type != SPLIT_TYPE_NULL)
{
if(siNode.iHandle == (DWORD)lPlayHandle)
{
return i;
}
}
}
return -1;
}
//获取当前画面分割模式的指定画面的起始画面序号
int CNetSDKDemoDlg::GetCurSplitStart(int nScreen, int nSplit)
{
return -1;
/*
//设置到对应画面的单画面
int nScreenStart = 0;
if(nScreen >= nSplit * nSplit)
{
nScreenStart = m_curScreen/(nSplit * nSplit)*(nSplit * nSplit);
}
//当当前画面选择通道序号大于16时更改选择通道
//例如当前画面序号时10时,显示9画面,则显示7~16通道;
if((nScreenStart + nSplit * nSplit) >= CUR_MAXCHAN)
{
nScreenStart = CUR_MAXCHAN - nSplit * nSplit;
}
return nScreenStart;
*/
}
//检测当前画面状态并关闭当前状态
BOOL CNetSDKDemoDlg::CheckCurSplitAndClose()
{
ProcessCloseScreen(m_curScreen);
UpdateCurScreenInfo();
return TRUE;
}
//检测当前选择通道是否在某个轮循列表中
BOOL CNetSDKDemoDlg::IsCycling(DWORD deviceID, int channelNo)
{
SplitInfoNode siNode;
memset(&siNode, 0, sizeof(siNode));
for (int i = 0; i < MAX_CHANNUM; i++)
{
BOOL ret = GetSplitInfo_Main(i, &siNode);
if (!ret)
{
MessageBox("error while getting split information");
return TRUE;
}
if (siNode.Type == SPLIT_TYPE_CYCLEMONITOR)
{
POSITION pos = ((SplitCycleParam *)siNode.Param)->pChannelList->GetHeadPosition();
for (int j = 0; j < ((SplitCycleParam *)siNode.Param)->pChannelList->GetCount(); j++)
{
CycleChannelInfo *tempnode;
tempnode = (CycleChannelInfo *)((SplitCycleParam *)siNode.Param)->pChannelList->GetNext(pos);
if ((tempnode->dwDeviceID == deviceID) && (tempnode->iChannel == channelNo))
{
return TRUE;
}
}
}
}
return FALSE;
}
void CNetSDKDemoDlg::DeleteCycleParam(int nScreen)
{
SplitInfoNode siNode;
memset(&siNode, 0, sizeof(siNode));
BOOL ret = GetSplitInfo_Main(nScreen, &siNode);
if (!ret)
{
MessageBox("error while getting split info");
return;
}
int count;
count = ((SplitCycleParam *)siNode.Param)->pChannelList->GetCount();
for (int i = 0; i < count; i++)
{
delete (CycleChannelInfo *)((SplitCycleParam *)siNode.Param)->pChannelList->GetTail();
((SplitCycleParam *)siNode.Param)->pChannelList->RemoveTail();
}
delete ((SplitCycleParam *)siNode.Param)->pChannelList;
delete (SplitCycleParam *)siNode.Param;
siNode.Type = SPLIT_TYPE_NULL;
siNode.Param = NULL;
ret = SetSplitInfo_Main(nScreen, &siNode);
if (!ret)
{
MessageBox("error while setting split info");
}
CPlayWnd *plWnd = (CPlayWnd *)m_screenPannel.GetPage(nScreen);
if (plWnd)
{
plWnd->PostMessage(VIDEO_REPAINT);
}
}
//关闭画面的显示状态
BOOL CNetSDKDemoDlg::ProcessCloseScreen(int scrNo, BOOL bDis)
{
BOOL ret = TRUE;
// EnterCriticalSection(&g_cs);
// CCSLock lck(g_cs);
SplitInfoNode siNode;
memset(&siNode, 0, sizeof(siNode));
ret = GetSplitInfo_Main(scrNo, &siNode);
if (!ret)
{
MessageBox("error while getting split info");
return FALSE;
}
switch(siNode.Type)
{
case SPLIT_TYPE_MONITOR:
{
// ret = CLIENT_StopRealPlay(siNode.iHandle);
ret = CLIENT_StopRealPlayEx(siNode.iHandle);
if (!ret)
{
LastError();
if (!bDis)
{
MessageBox(MSG_CYCLE_STOPMONITORERROR);
}
}
delete (SplitMonitorParam *)siNode.Param;
siNode.Param = NULL;
siNode.Type = SPLIT_TYPE_NULL;
ret = SetSplitInfo_Main(scrNo, &siNode);
if (!ret)
{
MessageBox("error while getting split info");
}
CPlayWnd *plWnd = (CPlayWnd *)m_screenPannel.GetPage(scrNo);
if (plWnd)
{
plWnd->PostMessage(VIDEO_REPAINT);
}
break;
}
case SPLIT_TYPE_MULTIPLAY:
{
// ret = CLIENT_StopMultiPlay(siNode.iHandle);
ret = CLIENT_StopRealPlayEx(siNode.iHandle);
if (!ret)
{
LastError();
if (!bDis)
{
MessageBox(MSG_CYCLE_STOPMULTIPLAYERROR);
}
}
siNode.Param = NULL;
siNode.Type = SPLIT_TYPE_NULL;
ret = SetSplitInfo_Main(scrNo, &siNode);
if (!ret)
{
MessageBox("error while getting split info");
}
m_advanceBtnPannel.EnableTalk(TRUE);
CPlayWnd *plWnd = (CPlayWnd *)m_screenPannel.GetPage(scrNo);
if (plWnd)
{
plWnd->PostMessage(VIDEO_REPAINT);
}
break;
}
case SPLIT_TYPE_NETPLAY:
case SPLIT_TYPE_PBBYTIME:
{
int nRet = PlayStop(scrNo, bDis);
if (nRet < 0)
{
ret = FALSE;
}
else
{
ret = TRUE;
}
break;
}
case SPLIT_TYPE_CYCLEMONITOR:
{
//仅用于“关闭”指令,删除与断开设备有另外的代码。
KillTimer(scrNo);
// EnterCriticalSection(&g_csCycle);
ret = CLIENT_StopRealPlay(siNode.iHandle);
if (!ret)
{
LastError();
MessageBox(MSG_CYCLE_STOPCYCLEERROR);
}
if (siNode.Param)
{
DeleteCycleParam(scrNo);
}
// LeaveCriticalSection(&g_csCycle);
break;
}
default:
break;
}
// LeaveCriticalSection(&g_cs);
return ret;
}
int UpdateDeviceListCallback(const DeviceNode& node, DWORD dwUser)
{
CNetSDKDemoDlg* pThis = (CNetSDKDemoDlg*)dwUser;
if (!pThis)
{
return 1;
}
return pThis->UpdateDeviceListCallback_Imp(node);
}
int CNetSDKDemoDlg::UpdateDeviceListCallback_Imp(const DeviceNode& node)
{
CString strDev, strCh;
HTREEITEM hnode, hnode1;
//CDevMgr::DeviceNode* nDev = &node;
strDev.Format(" %s (%s)<%s>",node.Name, node.IP, node.UserNanme);
hnode = m_devicelist.InsertItem(strDev,0,0,TVI_ROOT);
//设备项直接将设备信息指针作为列表Id
m_devicelist.SetItemData(hnode,(DWORD)&node);
for(int j = 0; j < node.Info.byChanNum; j++)
{
strCh.Format("channel %02d",j+1);
hnode1 = m_devicelist.InsertItem(strCh,0,0,hnode);
//通道项将通道序号作为列表ID
m_devicelist.SetItemData(hnode1,j);
}
return 0;
}
////////////////////////////////刷新显示相关的接口函数//////////////////////////////////////////
//刷新设备列表显示,直接根据g_ptrdevicelist重新刷新显示
void CNetSDKDemoDlg::UpdateDeviceList()
{
/*
DeviceNode *nDev;
HTREEITEM node, node1;
CString strDev, strCh;
POSITION nPos;
*/
m_devicelist.DeleteAllItems();
CDevMgr::GetDevMgr().For_EachDev(UpdateDeviceListCallback, (DWORD)this);
if (m_devicelist.GetCount() > 0)
{
m_devicelist.SetFocus();
}
/*
nPos = g_ptrdevicelist->GetHeadPosition();
for(int i = 0; i < g_ptrdevicelist->GetCount(); i ++ )
{
nDev = (DeviceNode *)g_ptrdevicelist->GetNext(nPos);
strDev.Format(" %s (%s)<%s>",nDev->Name, nDev->IP, nDev->UserNanme);
node = m_devicelist.InsertItem(strDev,0,0,TVI_ROOT);
//设备项直接将设备信息指针作为列表Id
m_devicelist.SetItemData(node,(DWORD)nDev);
for(int j = 0; j < nDev->Info.byChanNum; j++)
{
strCh.Format("channel %02d",j+1);
node1 = m_devicelist.InsertItem(strCh,0,0,node);
//通道项将通道序号作为列表ID
m_devicelist.SetItemData(node1,j);
}
}
*/
}
//画面分割刷新显示
void CNetSDKDemoDlg::UpdateScreen(int nSplit)
{
//m_screenPannel.SetShowPlayWin(nSplit, 0);
/*
int k;
int spWide, spHight; //分割大小
CRect nRect;
CRect subRect;
// Invalidate();
m_screenPannel.GetClientRect(&nRect);
if (!m_bFullSCRN)
{
m_screenPannel.ClientToScreen(&nRect);
ScreenToClient(&nRect);
}
//处理为可以对任何画面显示在各种画面
int nScreenStart = GetCurSplitStart(m_curScreen,nSplit);
//隐藏所有画面
for(k = 0 ; k < CUR_MAXCHAN; k++)
{
m_playWnd[k].ShowWindow(SW_HIDE);
}
//确定每个分割项大小
spWide = nRect.Width()/nSplit;
spHight = nRect.Height()/nSplit;
//确定各分割项位置,并显示//CListBox
int offsplit;
for(int i = 0; i < nSplit; i++)
{
for(int j = 0; j < nSplit; j ++)
{
subRect.left = nRect.left + j * spWide+1;
subRect.top = nRect.top + i * spHight+1;
subRect.right = subRect.left + spWide - 1;
subRect.bottom = subRect.top + spHight - 1;
offsplit = nScreenStart + i * nSplit + j;
// m_playWnd[offsplit].ShowWindow(SW_HIDE);
m_playWnd[offsplit].MoveWindow(&subRect,false);
// m_playWnd[offsplit].ShowWindow(SW_NORMAL);
//当是当前选择分割项时,叠加显示外框
if(offsplit == m_curScreen)
{
CRect rect;
rect.left = subRect.left + 1;
rect.top = subRect.top + 1;
rect.right = subRect.right + 1;
rect.bottom = subRect.bottom + 1;
GetDlgItem(IDC_CURWIN)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_CURWIN)->MoveWindow(&rect,false);
GetDlgItem(IDC_CURWIN)->ShowWindow(SW_NORMAL);
}
}
}
//显示有效的分割画面
for(k = nScreenStart ; k < nScreenStart + nSplit * nSplit ; k++)
{
m_playWnd[k].ShowWindow(SW_SHOW);
}
*/
}
//刷新当前显示画面的相关信息
void CNetSDKDemoDlg::UpdateCurScreenInfo()
{
//判断是否打开了语音对讲
SplitInfoNode siNode;
memset(&siNode, 0, sizeof(siNode));
/* BOOL bTalkOpen = FALSE;
for (int i = 0; i < MAX_CHANNUM; i++)
{
BOOL ret = GetSplitInfo_Main(i, &siNode);
if (!ret)
{
MessageBox("error while getting split info");
return;
}
if (siNode.Type == SPLIT_TYPE_MONITOR)
{
if (((SplitMonitorParam *)(siNode.Param))->isTalkOpen)
{
bTalkOpen = TRUE;
break;
}
}
}
m_normalBtnPannel.EnableMultiplay(!bTalkOpen);
*/
//更新保存数据项和音频项
BOOL ret = GetSplitInfo_Main(m_curScreen, &siNode);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -