// MyOutput.cpp : implementation file // #include "stdafx.h" #include "newclient.h" #include "MyOutput.h" #include "CurWin.h" #include "newclientDlg.h" #include "DecodeCardSDK.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif WORD iActiveWndNumber = 0; WORD m_iSubWndCreated = 0; extern void F_AddEvent(CString csEvent); extern CLIENTPARAM ClientParam; extern CCurwin mycurwin; extern CMyOutput myoutput[MAXVIEWNUM]; extern HBRUSH hBrush; extern BOOL g_bShareSound; extern int g_nNetDelay; ///////////////////////////////////////////////////////////////////////////// // CMyOutput dialog RECT g_ShowRect3; RECT g_MouseRect3; void CALLBACK DrawFun3(long nPort,HDC hDc,DWORD nUser) { ::DrawEdge(hDc, &g_ShowRect3, BDR_SUNKENOUTER, BF_RECT); SetBkMode(hDc, TRANSPARENT); } void CALLBACK RealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,DWORD dwUser) { int a=0; // TRACE("lRealHandle = %d dwUser = %d dwDataType = %d dwBufSize = %d", lRealHandle, dwUser, dwDataType, dwBufSize); } CMyOutput::CMyOutput(CWnd* pParent /*=NULL*/) : CDialog(CMyOutput::IDD, pParent) { //{{AFX_DATA_INIT(CMyOutput) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_bIsAutoSave = FALSE; } void CMyOutput::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyOutput) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CMyOutput, CDialog) //{{AFX_MSG_MAP(CMyOutput) ON_WM_CREATE() ON_WM_CTLCOLOR() ON_WM_DESTROY() ON_WM_LBUTTONDBLCLK() ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() ON_WM_PAINT() ON_WM_RBUTTONDOWN() ON_WM_TIMER() ON_COMMAND(IDC_MENU_FRONTPAGE, OnMenuFrontpage) ON_COMMAND(IDC_MENU_NEXTPAGE, OnMenuNextpage) ON_COMMAND(IDC_MENU_PAUSECYCLE, OnMenuPausecycle) ON_COMMAND(IDC_MENU_SOUND, OnMenuSound) ON_COMMAND(IDC_MENU_MULTISCREEN, OnMenuMultiscreen) ON_WM_LBUTTONUP() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMyOutput message handlers BOOL CMyOutput::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here // m_iSubWndCreated = 0; m_dwDVRIP = 0; return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CMyOutput::StartNet(PIP_INFO ipinfo) { NET_DVR_CLIENTINFO playstru; char ipaddress[256]; char multiipaddress[256]; char user[100]; char password[100]; WORD iServerPort; CString sTemp; ZeroMemory(user,100); ZeroMemory(password,100); if(m_iPlayhandle != -1) { TRACE("NET_DVR_StopRealPlay m_iPlayhandle = %d", m_iPlayhandle); if(g_bShareSound) { NET_DVR_CloseSoundShare(m_iPlayhandle); } if(!NET_DVR_StopRealPlay(m_iPlayhandle)) { TRACE("NET_DVR_StopRealPlay 失败 m_iPlayhandle = %d", m_iPlayhandle); } } m_bNeedjudge = FALSE; playstru.hPlayWnd = GetSafeHwnd(); playstru.lChannel = ipinfo->m_iChannel; playstru.lLinkMode = ipinfo->m_dwProtocol; if(ipinfo->m_dwMultiIPvalue == 0) strcpy(multiipaddress,""); else sprintf(multiipaddress,"%s",ipinfo->m_csMultiIP); playstru.sMultiCastIP = multiipaddress; iServerPort = ipinfo->m_wServerport; //TRACE("StartNet"); m_iPlayhandle = NET_DVR_RealPlay(ipinfo->m_lServerID, &playstru); if(m_iPlayhandle == -1) { DWORD dwErr = NET_DVR_GetLastError(); sprintf(ipaddress,"%s",ipinfo->m_csIP); sTemp.Format("访问IP:%s 通道%d 连接启动失败 dwErr = %d",ipaddress,playstru.lChannel, dwErr); F_AddEvent(sTemp); TRACE(sTemp); } else { //TRACE("StartNet m_iPlayhandle = %d", m_iPlayhandle); switch(g_nNetDelay) { case 0: NET_DVR_SetPlayerBufNumber(m_iPlayhandle, 1); break; case 1: NET_DVR_SetPlayerBufNumber(m_iPlayhandle, 6); break; case 2: NET_DVR_SetPlayerBufNumber(m_iPlayhandle, 15); break; case 3: NET_DVR_SetPlayerBufNumber(m_iPlayhandle, 30); break; case 4: NET_DVR_SetPlayerBufNumber(m_iPlayhandle, 45); break; default: NET_DVR_SetPlayerBufNumber(m_iPlayhandle, 15); break; } //NET_DVR_SetPlayerBufNumber(m_iPlayhandle, 15); NET_DVR_ThrowBFrame(m_iPlayhandle,1); NET_DVR_SetRealDataCallBack(m_iPlayhandle, RealDataCallBack, m_iPlayhandle); m_csIP = ipinfo->m_csIP; m_dwDVRIP = ipinfo->m_dwIPvalue; m_lServerID = ipinfo->m_lServerID; m_iChannel = playstru.lChannel; m_bNeedjudge = TRUE; } CNewclientDlg* mainwnd =(CNewclientDlg*) AfxGetMainWnd(); m_iWindowNum = mainwnd->WINDOWNUM; } void CMyOutput::StopNet() { if(m_iPlayhandle != -1) { if(m_bFileSave) NET_DVR_StopSaveRealData(m_iPlayhandle); m_bFileSave = FALSE; if(!NET_DVR_StopRealPlay(m_iPlayhandle)) { TRACE("NET_DVR_StopRealPlay 失败 m_iPlayhandle = %d", m_iPlayhandle); } //TRACE("NET_DVR_StopRealPlay"); m_bNeedjudge = FALSE; invateframe(); m_iPlayhandle = -1; ClientParam.m_bPlaySound[m_iSubWndNumber] = FALSE; CNewclientDlg* mainwnd = (CNewclientDlg*) AfxGetMainWnd(); } } void CMyOutput::StartCard(PIP_INFO ipinfo) { NET_DVR_CARDINFO playstru; char ipaddress[256]; char multiipaddress[256]; char user[100]; char password[100]; WORD iServerPort; CString sTemp; ULONG ulMode = 0; ZeroMemory(user,100); ZeroMemory(password,100); if(m_iPlayhandle != -1) { if(!NET_DVR_StopRealPlay(m_iPlayhandle)) { TRACE("NET_DVR_StopRealPlay 失败 m_iPlayhandle = %d", m_iPlayhandle); } } m_bNeedjudge = FALSE; playstru.lChannel = ipinfo->m_iChannel; playstru.lLinkMode = ipinfo->m_dwProtocol; if(ipinfo->m_dwMultiIPvalue == 0) strcpy(multiipaddress,""); else sprintf(multiipaddress,"%s",ipinfo->m_csMultiIP); playstru.sMultiCastIP = multiipaddress; iServerPort = ipinfo->m_wServerport; playstru.struDisplayPara.nLeft = m_display_para.nLeft; playstru.struDisplayPara.nTop = m_display_para.nTop; playstru.struDisplayPara.nWidth = m_display_para.nWidth; playstru.struDisplayPara.nHeight = m_display_para.nHeight; playstru.struDisplayPara.bToScreen = 1; playstru.struDisplayPara.bToVideoOut = 1; TRACE("使用解码卡"); m_iPlayhandle = NET_DVR_RealPlay_Card(ipinfo->m_lServerID,&playstru,m_iSubWndNumber); if(m_iPlayhandle == -1) { sprintf(ipaddress,"%s",ipinfo->m_csIP); sTemp.Format("访问IP:%s 通道%d 连接启动失败",ipaddress,playstru.lChannel); F_AddEvent(sTemp); TRACE(sTemp); } else { switch(g_nNetDelay) { case 0: ulMode = 1; break; case 1: ulMode = 2; break; case 2: ulMode = 3; break; case 3: ulMode = 4; break; case 4: ulMode = 5; break; default: ulMode = 3; break; } HW_SetStreamOpenMode((HANDLE)m_iSubWndNumber, ulMode); NET_DVR_ThrowBFrame(m_iPlayhandle,1); m_csIP = ipinfo->m_csIP; m_dwDVRIP = ipinfo->m_dwIPvalue; m_lServerID = ipinfo->m_lServerID; m_iChannel = playstru.lChannel; m_bNeedjudge = TRUE; } } BOOL CMyOutput::DestroyWindow() { // TODO: Add your specialized code here and/or call the base class return CDialog::DestroyWindow(); } BOOL CMyOutput::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) { // TODO: Add your specialized code here and/or call the base class if ((nID == 2) || (nID == 1)) return TRUE; return CDialog::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); } int CMyOutput::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here m_iSubWndNumber = m_iSubWndCreated++; m_iPlayhandle = -1; m_bPlaying = FALSE; m_bNeedjudge = FALSE; m_bFileSave = FALSE; return 0; } HBRUSH CMyOutput::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here if(ClientParam.m_bUseCard) { NET_DVR_RestoreSurface_Card(); return hBrush; } // TODO: Return a different brush if the default is not desired return hbr; } void CMyOutput::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here } void CMyOutput::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default iActiveWndNumber = m_iSubWndNumber; if(m_iPlayhandle < 0) return; CNewclientDlg* mainwnd =(CNewclientDlg*) AfxGetMainWnd(); m_iWindowNum = mainwnd->WINDOWNUM; if(ClientParam.m_bFullScreen || ClientParam.m_bMultiScreen) { ClientParam.m_bFullScreen = FALSE; ClientParam.m_bEnlarged = FALSE; ClientParam.m_bMultiScreen = FALSE; NET_DVR_ThrowBFrame(m_iPlayhandle, 1); mainwnd->F_EndFullScreen(); mainwnd->ArrayWindow(iActiveWndNumber,m_iWindowNum); mycurwin.ShowWindow(SW_SHOW); mainwnd->MoveCurWin(m_iWindowNum,iActiveWndNumber); return; } if( (ClientParam.m_bEnlarged) || (m_iWindowNum == 1) ) { //一个窗口或者窗口放大 mainwnd->F_FullScreen(); MoveWindow(0, 0, 1024, 768, TRUE); NET_DVR_ThrowBFrame(m_iPlayhandle, 0); ShowWindow(SW_SHOW); ClientParam.m_bFullScreen = TRUE; } else { //多窗口 NET_DVR_ThrowBFrame(m_iPlayhandle,0); m_iWindowNum = 1; ClientParam.m_bEnlarged = TRUE; mainwnd->ArrayWindow(iActiveWndNumber,m_iWindowNum); mainwnd->MoveCurWin(m_iWindowNum,iActiveWndNumber); } if(!ClientParam.m_bUseCard) { DWORD dwBright,dwContrast, dwSaturation, dwHue; dwBright = dwContrast = dwContrast = dwHue = 0; NET_DVR_ClientGetVideoEffect(m_iPlayhandle, &dwBright,&dwContrast, &dwSaturation, &dwHue); ClientParam.m_VideoInfo[iActiveWndNumber].m_iBrightness = dwBright; ClientParam.m_VideoInfo[iActiveWndNumber].m_iContrast = dwContrast; ClientParam.m_VideoInfo[iActiveWndNumber].m_iSaturation = dwSaturation; ClientParam.m_VideoInfo[iActiveWndNumber].m_iHue = dwHue; } CDialog::OnLButtonDblClk(nFlags, point); } void CMyOutput::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CNewclientDlg* mainwnd =(CNewclientDlg*) AfxGetMainWnd(); if(iActiveWndNumber != m_iSubWndNumber) { iActiveWndNumber = m_iSubWndNumber; mainwnd->MoveCurWin(mainwnd->WINDOWNUM, iActiveWndNumber); mainwnd->F_ShowVideoParams(); if(!ClientParam.m_bUseCard) { DWORD dwBright,dwContrast, dwSaturation, dwHue; dwBright = dwContrast = dwSaturation = dwHue = 0; NET_DVR_ClientGetVideoEffect(m_iPlayhandle, &dwBright,&dwContrast, &dwSaturation, &dwHue); ClientParam.m_VideoInfo[iActiveWndNumber].m_iBrightness = dwBright; ClientParam.m_VideoInfo[iActiveWndNumber].m_iContrast = dwContrast; ClientParam.m_VideoInfo[iActiveWndNumber].m_iSaturation = dwSaturation; ClientParam.m_VideoInfo[iActiveWndNumber].m_iHue = dwHue; } } if (MK_CONTROL&nFlags&&(m_iPlayhandle != -1)) { NET_DVR_RigisterDrawFun(m_iPlayhandle, DrawFun3, 0); if (point.x < 0) point.x = 0; g_MouseRect3.left=point.x/16*16; if (point.y < 0) point.y = 0; g_MouseRect3.top=point.y/16*16; g_MouseRect3.right=g_MouseRect3.left; g_MouseRect3.bottom=g_MouseRect3.top; POINT tPoint=point; g_ShowRect3.left=tPoint.x/16*16; g_ShowRect3.top=tPoint.y/16*16; g_ShowRect3.right=tPoint.x/16*16+1; g_ShowRect3.bottom=tPoint.y/16*16+1; } CDialog::OnLButtonDown(nFlags, point); } void CMyOutput::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if ((MK_CONTROL&nFlags) && (MK_LBUTTON&nFlags) && (m_iPlayhandle != -1)) { POINT tPoint=point; g_ShowRect3.right=tPoint.x/16*16; g_ShowRect3.bottom=tPoint.y/16*16; } CDialog::OnMouseMove(nFlags, point); } void CMyOutput::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here if(ClientParam.m_bUseCard) NET_DVR_RestoreSurface_Card(); // Do not call CDialog::OnPaint() for painting messages } void CMyOutput::OnRButtonDown(UINT nFlags, CPoint point) { CancelSelectZoom(); // TODO: Add your message handler code here and/or call default CMenu m_PopMenu; CNewclientDlg* mainwnd =(CNewclientDlg*) AfxGetMainWnd(); if(iActiveWndNumber != m_iSubWndNumber) { iActiveWndNumber = m_iSubWndNumber; mainwnd->MoveCurWin(mainwnd->WINDOWNUM, iActiveWndNumber); mainwnd->F_ShowVideoParams(); if(!ClientParam.m_bUseCard) { DWORD dwBright,dwContrast, dwSaturation, dwHue; dwBright = dwContrast = dwSaturation = dwHue = 0; NET_DVR_ClientGetVideoEffect(m_iPlayhandle, &dwBright,&dwContrast, &dwSaturation, &dwHue); ClientParam.m_VideoInfo[iActiveWndNumber].m_iBrightness = dwBright; ClientParam.m_VideoInfo[iActiveWndNumber].m_iContrast = dwContrast; ClientParam.m_VideoInfo[iActiveWndNumber].m_iSaturation = dwSaturation; ClientParam.m_VideoInfo[iActiveWndNumber].m_iHue = dwHue; } } if(ClientParam.m_bFullScreen || ClientParam.m_bMultiScreen) return; if(!m_PopMenu.LoadMenu(IDR_MENU1)) return; ClientToScreen(&point); CMenu *psub = (CMenu *)m_PopMenu.GetSubMenu(0); psub->EnableMenuItem(0, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); psub->EnableMenuItem(1, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); psub->EnableMenuItem(2, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); psub->EnableMenuItem(3, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); if(ClientParam.m_bCycling) { if(ClientParam.m_bPaused) psub->ModifyMenu(0, MF_BYPOSITION, IDC_MENU_PAUSECYCLE, "开始循环"); else psub->ModifyMenu(0, MF_BYPOSITION, IDC_MENU_PAUSECYCLE, "暂停循环"); psub->EnableMenuItem(0, MF_BYPOSITION | MF_ENABLED); psub->EnableMenuItem(1, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); psub->EnableMenuItem(2, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); } else { if(ClientParam.m_bNextPage) { psub->EnableMenuItem(0, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); psub->EnableMenuItem(1, MF_BYPOSITION | MF_ENABLED); } if(ClientParam.m_bFrontPage) { psub->EnableMenuItem(0, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); psub->EnableMenuItem(2, MF_BYPOSITION | MF_ENABLED); } } // { if(ClientParam.m_bPlaySound[iActiveWndNumber]) psub->ModifyMenu(3, MF_BYPOSITION, IDC_MENU_SOUND, "关闭声音"); else psub->ModifyMenu(3, MF_BYPOSITION, IDC_MENU_SOUND, "打开声音"); psub->EnableMenuItem(3, MF_BYPOSITION | MF_ENABLED); } psub->EnableMenuItem(4, MF_BYPOSITION | MF_ENABLED); psub->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this); m_PopMenu.DestroyMenu(); CDialog::OnRButtonDown(nFlags, point); } void CMyOutput::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CDialog::OnTimer(nIDEvent); } void CMyOutput::OnMenuFrontpage() { // TODO: Add your command handler code here CNewclientDlg* mainwnd =(CNewclientDlg*) AfxGetMainWnd(); mainwnd->F_FrontPage(); } void CMyOutput::OnMenuNextpage() { // TODO: Add your command handler code here CNewclientDlg* mainwnd =(CNewclientDlg*) AfxGetMainWnd(); mainwnd->F_NextPage(); } void CMyOutput::OnMenuPausecycle() { // TODO: Add your command handler code here CNewclientDlg* mainwnd =(CNewclientDlg*) AfxGetMainWnd(); mainwnd->F_CyclePause(); } void CMyOutput::OnMenuSound() { // TODO: Add your command handler code here int i; WORD wTemp; WORD wVolumevalue; wTemp = (0xFFFF) / 100; wVolumevalue = 50 * wTemp; if(myoutput[iActiveWndNumber].m_iPlayhandle >= 0) { if(ClientParam.m_bUseCard) { if(ClientParam.m_bPlaySound[iActiveWndNumber]) { NET_DVR_CloseSound_Card(myoutput[iActiveWndNumber].m_iPlayhandle); ClientParam.m_bPlaySound[iActiveWndNumber] = FALSE; } else { NET_DVR_OpenSound_Card(myoutput[iActiveWndNumber].m_iPlayhandle); NET_DVR_AudioPreview_Card(myoutput[iActiveWndNumber].m_iPlayhandle, TRUE); NET_DVR_SetVolume_Card(myoutput[iActiveWndNumber].m_iPlayhandle, wVolumevalue); ClientParam.m_bPlaySound[iActiveWndNumber] = TRUE; } } else { TRACE("Close Audio"); if(!g_bShareSound) { NET_DVR_CloseSound(); } if(ClientParam.m_bPlaySound[iActiveWndNumber]) { TRACE("Close m_bPlaySound[%d] Sound", iActiveWndNumber); ClientParam.m_bPlaySound[iActiveWndNumber] = FALSE; if(g_bShareSound) { NET_DVR_CloseSoundShare(myoutput[iActiveWndNumber].m_iPlayhandle); } } else { TRACE("Open m_bPlaySound[%d] = TRUE Sound", iActiveWndNumber); ClientParam.m_bPlaySound[iActiveWndNumber] = TRUE; if(g_bShareSound) { if(!NET_DVR_OpenSoundShare(myoutput[iActiveWndNumber].m_iPlayhandle)) TRACE("Client Play Audio error"); } else { if(!NET_DVR_OpenSound(myoutput[iActiveWndNumber].m_iPlayhandle)) TRACE("Client Play Audio error"); } if(!NET_DVR_Volume(myoutput[iActiveWndNumber].m_iPlayhandle, wVolumevalue)) TRACE("Client Audio Volume error"); } } if(!g_bShareSound) { for(i = 0; i < MAXVIEWNUM; i++) { //关闭别的窗口声音标志 if(i == (int)iActiveWndNumber) continue; ClientParam.m_bPlaySound[i] = FALSE; } } } } void CMyOutput::OnMenuMultiscreen() { // TODO: Add your command handler code here if(m_iPlayhandle < 0) return; CNewclientDlg* mainwnd = (CNewclientDlg*) AfxGetMainWnd(); ClientParam.m_bMultiScreen = TRUE; mainwnd->F_FullScreen(); mainwnd->ArrayWindow(iActiveWndNumber,mainwnd->WINDOWNUM); mainwnd->MoveCurWin(mainwnd->WINDOWNUM,iActiveWndNumber); // StopNet(); } void CMyOutput::invateframe() { Invalidate(TRUE); UpdateData(FALSE); if(ClientParam.m_bUseCard) NET_DVR_RefreshSurface_Card(); } void CMyOutput::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if ((MK_CONTROL&nFlags) && (m_iPlayhandle != -1)) { POINT tPoint=point; g_ShowRect3.right=tPoint.x/16*16; g_ShowRect3.bottom=tPoint.y/16*16; NET_DVR_POINT_FRAME ptFrame; double scale = 1; if (ClientParam.m_bFullScreen) { scale = 0.32; } else if (m_iWindowNum == 1) { scale = 0.5; } else if (m_iWindowNum == 9) { scale = 1.5; } else if (m_iWindowNum == 16) { scale = 2; } ptFrame.xTop = (int)(g_MouseRect3.left*2*scale); ptFrame.yTop = (int)(g_MouseRect3.top*2*scale); ptFrame.xBottom = (int)(g_ShowRect3.right*2*scale); ptFrame.yBottom = (int)(g_ShowRect3.bottom*2*scale); if (g_MouseRect3.left < g_ShowRect3.right) { if (g_MouseRect3.top < g_ShowRect3.bottom) { ptFrame.bCounter = 4; } else { ptFrame.bCounter = 2; } } else { if (g_MouseRect3.top < g_ShowRect3.bottom) { ptFrame.bCounter = 3; } else { ptFrame.bCounter = 1; } } if (!NET_DVR_PTZSelZoomIn(m_iPlayhandle, &ptFrame)) { CString tmp; tmp.Format("Error: NET_DVR_PTZSelZoomIn = %d", NET_DVR_GetLastError()); AfxMessageBox(tmp); } CancelSelectZoom(); } else { CancelSelectZoom(); } CDialog::OnLButtonUp(nFlags, point); } void CMyOutput::CancelSelectZoom() { if (m_iPlayhandle != -1) { g_MouseRect3.top = 0; g_MouseRect3.left = 0; g_MouseRect3.right = 0; g_MouseRect3.bottom = 0; g_ShowRect3.top = 0; g_ShowRect3.left = 0; g_ShowRect3.right = 0; g_ShowRect3.bottom = 0; NET_DVR_RigisterDrawFun(m_iPlayhandle, NULL, 0); } }