📄 netsdkdemodlg.cpp
字号:
}
else
//sun modify
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);
}
this->SetSplitByChannelNo(node.Info.byChanNum);
this->SwitchMultiWnd(this->m_cur_channel_no);
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);
if (!ret)
{
MessageBox("error while getting split info");
return;
}
m_saveDataPannel.SetCheckReal(siNode.isSaveData);
m_saveDataPannel.SetCheckRaw(siNode.SavecbFileRaw ? 1 : 0);
m_saveDataPannel.SetCheckStd(siNode.SavecbFileStd ? 1 : 0);
m_saveDataPannel.SetCheckYuv(siNode.SavecbFileYUV ? 1 : 0);
m_saveDataPannel.SetCheckPcm(siNode.SavecbFilePcm ? 1 : 0);
m_advanceBtnPannel.SetCheckSound(m_curSoundSplit == m_curScreen ? 1 : 0);
//更新视频参数项
UpdateVideoCtrl(VIDEO_TOTAL);
if (siNode.Type == SPLIT_TYPE_MONITOR &&
((SplitMonitorParam *)siNode.Param)->isTalkOpen)
{
m_advanceBtnPannel.SetCheckTalk(1);
}
else
{
m_advanceBtnPannel.SetCheckTalk(0);
}
}
//刷新视频参数控制区,nMode 0~3对应单项刷新
void CNetSDKDemoDlg::UpdateVideoCtrl(int nMode)
{
SplitInfoNode siNode;
memset(&siNode, 0, sizeof(siNode));
BOOL ret = GetSplitInfo_Main(m_curScreen, &siNode);
if (!ret)
{
MessageBox("error while getting split info");
return;
}
BYTE bVideo[4];
memset(bVideo,0, 4);
if(siNode.Type == SPLIT_TYPE_MONITOR)
{
memcpy(bVideo, siNode.nVideoParam.bParam, 4);
BOOL nRet = CLIENT_ClientSetVideoEffect(siNode.iHandle,
bVideo[0], bVideo[1], bVideo[2], bVideo[3]);
if (!nRet)
{
LastError();
}
}
if (nMode == VIDEO_TOTAL)
{
for (int i = 0; i < VIDEO_TOTAL; i++)
{
m_colorPannel.UpdateVideoDisplay(i, bVideo[i]);
}
}
else
{
m_colorPannel.UpdateVideoDisplay(nMode, bVideo[nMode]);
}
}
/////////////for one////////////////
DWORD GetMonthDays(const DWORD& dwYear, const DWORD& dwMonth)
{
DWORD dwMDays = 0;
switch(dwMonth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
dwMDays = 31;
break;
case 2:
{
if (((dwYear%4==0)&& dwYear%100) || (dwYear%400==0))
{
dwMDays = 29;
}
else
{
dwMDays = 28;
}
}
break;
case 4:
case 6:
case 9:
case 11:
dwMDays = 30;
break;
default:
break;
}
return dwMDays;
}
/*
* can't surpport year offset time
*/
NET_TIME GetSeekTimeByOffsetTime(const NET_TIME& bgtime, unsigned int offsettime)
{
NET_TIME tmseek;
memset(&tmseek, 0x00, sizeof(NET_TIME));
DWORD dwNext = 0;
//second
tmseek.dwSecond = (bgtime.dwSecond+offsettime)%60;
dwNext = (bgtime.dwSecond+offsettime)/60;
//minute
tmseek.dwMinute = (dwNext+bgtime.dwMinute)%60;
dwNext = (dwNext+bgtime.dwMinute)/60;
//hour
tmseek.dwHour = (dwNext+bgtime.dwHour)%24;
dwNext = (dwNext+bgtime.dwHour)/24;
DWORD dwMDays = GetMonthDays(bgtime.dwYear, bgtime.dwMonth);
//day
tmseek.dwDay = (dwNext+bgtime.dwDay)%dwMDays;
dwNext = (dwNext+bgtime.dwDay)/dwMDays;
//month
tmseek.dwMonth = (dwNext+bgtime.dwMonth)%12;
dwNext = (dwNext+bgtime.dwMonth)/12;
tmseek.dwYear = dwNext+bgtime.dwYear;
return tmseek;
}
/*
* can't surpport year offset time
*/
DWORD GetOffsetTime(const NET_TIME& st, const NET_TIME& et)
{
DWORD dwRet = -1;
if (et.dwYear != st.dwYear)
{
return dwRet;
}
DWORD dwDays = 0;
for(int i=st.dwMonth+1; i < et.dwMonth; ++i)
{
dwDays += GetMonthDays(st.dwYear, i);
}
if (et.dwMonth == st.dwMonth)
{
dwDays +=et.dwDay - st.dwDay;
}
else
{
dwDays += et.dwDay;
dwDays += GetMonthDays(st.dwYear, st.dwMonth) - st.dwDay;
}
dwRet = dwDays*24*60*60 + ((int)et.dwHour - (int)st.dwHour)*60*60 +
((int)et.dwMinute - (int)st.dwMinute)*60 + (int)et.dwSecond - (int)st.dwSecond;
return dwRet;
}
/////////////for one////////////////
//播放进度条拖动的处理
BOOL CNetSDKDemoDlg::SeekPlayPositon(int nPos)
//void CNetSDKDemoDlg::OnReleasedcapturePlayPosition(NMHDR* pNMHDR, LRESULT* pResult)
{
SplitInfoNode siNode;
memset(&siNode, 0, sizeof(siNode));
BOOL ret = GetSplitInfo_Main(m_curScreen, &siNode);
if (!ret)
{
MessageBox("error while getting split info");
return FALSE;
}
ret = FALSE;
if(siNode.Type == SPLIT_TYPE_NETPLAY)
{
SplitNetPlayParam * pbParam = (SplitNetPlayParam *)siNode.Param;
if (pbParam->iStatus == STATUS_PAUSE)
{
return FALSE;
}
pbParam->iPlayPos = nPos;
DWORD total = pbParam->pFileInfo->fileinfo.size;
ret = CLIENT_SeekPlayBack(siNode.iHandle, 0xFFFFFFFF, nPos * total /100);
if (!ret)
{
LastError();
}
}
else if (siNode.Type == SPLIT_TYPE_PBBYTIME)
{
SplitPBByTimeParam * pbParam = (SplitPBByTimeParam *)siNode.Param;
if (pbParam->iStatus == STATUS_PAUSE)
{
return FALSE;
}
pbParam->npos = nPos;
//DWORD time = g_IntervalTime(&pbParam->starttime, &pbParam->endtime);
DWORD time = GetOffsetTime(pbParam->starttime, pbParam->endtime);
BOOL ret = CLIENT_SeekPlayBack(siNode.iHandle, nPos * time /100, 0xFFFFFFFF);
if (!ret)
{
LastError();
}
}
return ret;
// *pResult = 0;
}
////////////////////////////////////////////功能操作//////////////////////////////////////////////
//增加设备连接项
void CNetSDKDemoDlg::AddDevice()
{
AddDeviceDlg dlg;
if(dlg.DoModal() == IDOK)
{
UpdateDeviceList(); //刷新设备列表显示
}
// TODO: Add your control notification handler code here
}
//实时数据回调,用于计算码流统计和保存数据
void CALLBACK RealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, DWORD dwUser)
{
if(dwUser == 0)
{
return;
}
CNetSDKDemoDlg *dlg = (CNetSDKDemoDlg *)dwUser;
dlg ->ReceiveRealData(lRealHandle,dwDataType, pBuffer, dwBufSize);
}
//回放数据回调函数,demo里将数据保存成文件
int CALLBACK PBDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, DWORD dwUser)
{
if(dwUser == 0)
{
return -1;
}
CNetSDKDemoDlg *dlg = (CNetSDKDemoDlg *)dwUser;
dlg ->ReceiveRealData(lRealHandle,dwDataType, pBuffer, dwBufSize);
return 1;
}
void CALLBACK RealDataCallBackEx(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize, LONG lParam, DWORD dwUser)
{
if(dwUser == 0)
{
return;
}
CNetSDKDemoDlg *dlg = (CNetSDKDemoDlg *)dwUser;
dlg->ReceiveRealData(lRealHandle,dwDataType, pBuffer, dwBufSize);
}
//根据设备列表取得设备Id,根据通道选择通道号
void CNetSDKDemoDlg::OpenChannel()
{
HTREEITEM node_dev, tmpnode;
DWORD nItem;
CString strCh;
tmpnode = m_devicelist.GetSelectedItem();
if(!tmpnode)
{
MessageBox(MSG_DEMODLG_CHECKSEL);
return;
}
nItem = m_devicelist.GetItemData(tmpnode);
if(nItem < 16) //是通道项
{
node_dev = m_devicelist.GetParentItem(tmpnode);
DeviceNode *pInfo = (DeviceNode *)m_devicelist.GetItemData(node_dev);
OpenSingleChannel(pInfo, nItem, m_curScreen);
}
else if(nItem>29) //设备项
{
OpenAllChannel((DeviceNode *)nItem);
}
else if((nItem>19) && (nItem<30))//未连接项
{
ConnectDevice();
}
}
void CNetSDKDemoDlg::OpenSingleChannel(DeviceNode *pInfo, int nCh, int screenNo)
{
//查询是否被列入轮循列表
if (IsCycling((DWORD)pInfo, nCh))
{
MessageBox(MSG_DEMODLG_ERROR_CYCLING);
return;
}
//关闭当前窗口的播放
ProcessCloseScreen(screenNo);
CWnd* pWnd = m_screenPannel.GetPage(screenNo);
if (!pWnd)
{
return ;
}
LONG nID = pInfo->LoginID;
LONG nChannelID;
// nChannelID = CLIENT_RealPlay(nID, nCh, GetDlgItem(IDC_SCREEN1 + m_curScreen )->m_hWnd);
nChannelID = CLIENT_RealPlayEx(nID, nCh, pWnd->m_hWnd/*m_playWnd[screenNo].m_hWnd*/, RType_Realplay);
if(!nChannelID)
{
LastError();
MessageBox(MSG_DEMODLG_OPENCHLFAILED);
return;
}
//获取视频参数
BYTE bVideo[4];
BOOL nRet = CLIENT_ClientGetVideoEffect(nChannelID, &bVideo[0],&bVideo[1],&bVideo[2],&bVideo[3]);
if (!nRet)
{
LastError();
}
SplitInfoNode siNode;
memset(&siNode, 0, sizeof(siNode));
BOOL ret = GetSplitInfo_Main(screenNo, &siNode);
if (!ret)
{
MessageBox("error while getting split info");
}
siNode.Type = SPLIT_TYPE_MONITOR;
siNode.nVideoParam.dwParam = *(DWORD *)bVideo;
siNode.iHandle = nChannelID;
SplitMonitorParam *mparam = new SplitMonitorParam;
mparam->pDevice = pInfo;
mparam->iChannel = nCh;
mparam->isTalkOpen = false;
siNode.Param = mparam;
ret = SetSplitInfo_Main(screenNo, &siNode);
if (!ret)
{
MessageBox("error while setting split info");
}
//更新保存数据状态
if(siNode.isSaveData)
{
CString strName ;
strName.Format("savech%d.dav", nCh);
BOOL ret = CLIENT_SaveRealData(nChannelID, strName.GetBuffer(0));
if(!ret)
{
LastError();
MessageBox(MSG_DEMODLG_SAVEDATAFAILED);
}
}
UpdateCurScreenInfo();
//更新音频
if(m_curSoundSplit == screenNo)
{
BOOL nRet = CLIENT_OpenSound(nChannelID);
if (!nRet)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -