⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netsdkdemodlg.cpp

📁 大华DVR的客户端开发包和Demo,从网上是下载不到的。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	//初始化画面分割模式选择项
	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 + -