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

📄 videobackupdlg.cpp

📁 一个完整的数字硬盘录像机系统软件
💻 CPP
字号:
// VideoBackupDlg.cpp : implementation file
//

#include "stdafx.h"
#include "gtmpeg.h"
#include "VideoBackupDlg.h"
#include "GtMpegWnd.h"
#include "PlayList.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CMutex          g_ProgressMutex;
void   BackupProgress(CVideoBackupDlg * pDlg);
////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////
void   BackupProgress(CVideoBackupDlg * pDlg)
{
    int nPreTicks=0, nCurTicks=0;
	CSingleLock SingleLock(&g_ProgressMutex);
	while(pDlg->m_bProgress)
	{
		nCurTicks = GetTickCount();
		nPreTicks = nCurTicks;
		pDlg->m_nPos+=10;
		pDlg->m_cProgress.SetPos(pDlg->m_nPos);
	   SingleLock.Unlock();
	}
}

/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
CVideoBackupDlg::CVideoBackupDlg(CGtMpegWnd* pParent /*=NULL*/)
	: CDialog(CVideoBackupDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CVideoBackupDlg)
	m_Date = COleDateTime::GetCurrentTime();
	//}}AFX_DATA_INIT
    m_pParentWnd=pParent;
	m_sDrive="";
	m_bProgress=FALSE;
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CVideoBackupDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CVideoBackupDlg)
	DDX_Control(pDX, IDC_PROGRESS, m_cProgress);
	DDX_Control(pDX, IDC_DRIVE_LIST, m_cDriveList);
	DDX_Control(pDX, IDC_RECORD_DATE, m_cRecordDate);
	DDX_Control(pDX, IDC_CHANNEL_BOX, m_cChannelBox);
	DDX_DateTimeCtrl(pDX, IDC_RECORD_DATE, m_Date);
	//}}AFX_DATA_MAP
	DDX_Control(pDX, IDC_TIME_GRID, m_cTimeGrid);
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CVideoBackupDlg, CDialog)
	//{{AFX_MSG_MAP(CVideoBackupDlg)
	ON_CBN_CLOSEUP(IDC_CHANNEL_BOX, OnCloseupChannelBox)
	ON_NOTIFY(DTN_CLOSEUP, IDC_RECORD_DATE, OnCloseupRecordDate)
	ON_CBN_CLOSEUP(IDC_DRIVE_LIST, OnCloseupDriveList)
	ON_BN_CLICKED(IDC_DEL, OnDel)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
BOOL CVideoBackupDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	for(DWORD i=0;i<g_dwNumberOfSlots;i++)
	{
	    CString sTxt;
		sTxt.Format("频道%d",i+1);
		m_cChannelBox.AddString(sTxt);
	}
	CStringArray arDrive;
	GetDriveList(DRIVE_CDROM,arDrive);
	for(int j=0;j<arDrive.GetSize();j++)
	   m_cDriveList.AddString(arDrive.GetAt(j));
	if(arDrive.GetSize()>0)
	{
      m_cDriveList.SetCurSel(0);
	  m_sDrive=arDrive.GetAt(0);
	}
	m_nChannel=0;
    m_cChannelBox.SetCurSel(m_nChannel);
	CheckfileValid(GetAppPath()+"mpeg");
	CRect rect;
    m_cProgress.GetClientRect(rect);
	m_cProgress.SetRange(0,rect.Width());
	m_cProgress.SetStep(10);
	m_nPos=0;
    m_cProgress.SetPos(m_nPos);
	m_nPos+=10;
	m_cProgress.SetPos(m_nPos);
	return TRUE;
}
////////////////////////////////////
//
///////////////////////////////////
void CVideoBackupDlg::OnDel() 
{
	BOOL bSection=FALSE;
	m_cRecordDate.GetTime(m_Date);
	CString sDate;
	CPlayList *pList;
	sDate=m_Date.Format("%Y%m%d");
	m_arPlayList.SetSize(0);
	m_arFileName.SetSize(0);
    for(int i=1;i<m_cTimeGrid.m_nRows;i++)
	{
	   for(int j=1;j<m_cTimeGrid.m_nCols;j++)
	   {
	       switch(m_cTimeGrid.GetCellStates(i,j))
		   {
		      case GVIS_NOSELECTED:
				                  if(bSection)
								  {
								    pList=m_arPlayList.GetAt(m_arPlayList.GetSize()-1);
									int nEndRow=i-1,nEndCol=j-1;
									if(j==1)
									{
									   nEndRow--;
									   nEndCol=59;//m_cTimeGrid.m_nCols-1;
									}
									pList->m_sEndTime.Format("%02d:%02d",nEndRow,nEndCol-1);
									bSection=FALSE;
								  }
			                      break;
		      case GVIS_SELECTED:
                                 if(!bSection)
								 {
								   pList=new CPlayList;
								   m_arPlayList.Add(pList);
								   pList->m_nChannel=m_nChannel;
								   pList->m_sPlayDate=sDate;
								   pList->m_sStartTime.Format("%02d:%02d",i-1,j-1);
								   bSection=TRUE;
								 }
			                     break;
		   }
	   }
	}
    if(!EnableBackupFile(sDate,GetAppPath()+"Mpeg",m_arFileName)==FALSE)
	{
	}
	if(m_arFileName.GetSize()==0)
	{
	   MessageBox("所选择的时间段没有进行录像,请重新选择!");
	   return;
	}
	//
	for(i=0;i<m_arFileName.GetSize();i++)
	{
	   char sSource[MAX_PATH];
	   strcpy(sSource,m_arFileName.GetAt(i));
	   if(!DeleteFile(sSource))
	   {
	   }
	}
	MessageBox("文件删除完毕");
	m_arFileName.SetSize(0);
    if(m_arPlayList.GetSize()!=0)
	{
       for(int i=0;i<m_arPlayList.GetSize();i++)
	    delete m_arPlayList.GetAt(i);
	   m_arPlayList.RemoveAll();
	}
	CheckfileValid(GetAppPath()+"mpeg");
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CVideoBackupDlg::OnOK() 
{
	if(m_sDrive=="")
	{
	   MessageBox("请选择备份盘!");
	   return;
	}
	if(GetDiskFreeSpace(m_sDrive)<45)
	{
	   MessageBox("选择备份盘没有足够的空间!");
	   return;
	}
	CString sCurDir=GetCurrentDirectory();
	if(!SetCurrentDirectory(m_sDrive))
	{
	   MessageBox("请插入磁盘到"+m_sDrive+"中!");
	   return;
	}
	SetCurrentDirectory(sCurDir);
	BOOL bSection=FALSE;
	m_cRecordDate.GetTime(m_Date);
	CString sDate;
	CPlayList *pList;
	sDate=m_Date.Format("%Y%m%d");
	m_arPlayList.SetSize(0);
	m_arFileName.SetSize(0);
    for(int i=1;i<m_cTimeGrid.m_nRows;i++)
	{
	   for(int j=1;j<m_cTimeGrid.m_nCols;j++)
	   {
	       switch(m_cTimeGrid.GetCellStates(i,j))
		   {
		      case GVIS_NOSELECTED:
				                  if(bSection)
								  {
								    pList=m_arPlayList.GetAt(m_arPlayList.GetSize()-1);
									int nEndRow=i-1,nEndCol=j-1;
									if(j==1)
									{
									   nEndRow--;
									   nEndCol=59;//m_cTimeGrid.m_nCols-1;
									}
									pList->m_sEndTime.Format("%02d:%02d",nEndRow,nEndCol-1);
									bSection=FALSE;
								  }
			                      break;
		      case GVIS_SELECTED:
                                 if(!bSection)
								 {
								   pList=new CPlayList;
								   m_arPlayList.Add(pList);
								   pList->m_nChannel=m_nChannel;
								   pList->m_sPlayDate=sDate;
								   pList->m_sStartTime.Format("%02d:%02d",i-1,j-1);
								   bSection=TRUE;
								 }
			                     break;
		   }
	   }
	}
    if(!EnableBackupFile(sDate,GetAppPath()+"Mpeg",m_arFileName)==FALSE)
	{
	}
	if(m_arFileName.GetSize()==0)
	{
	   MessageBox("所选择的时间段没有进行录像,请重新选择!");
	   return;
	}
	//
    m_bProgress=TRUE;
	//AfxBeginThread((AFX_THREADPROC) BackupProgress,(LPVOID)this);
	CString sBackupFile;
	for(i=0;i<m_arFileName.GetSize();i++)
	{
	   sBackupFile=m_arFileName.GetAt(i);
       sBackupFile=sBackupFile.Right(21);
       sBackupFile=m_sDrive+sBackupFile;
	   char sSource[MAX_PATH],sTarget[MAX_PATH];
	   strcpy(sSource,m_arFileName.GetAt(i));
	   strcpy(sTarget,sBackupFile);
	   if(!MoveFile(sSource,sTarget))
	   {
	      while(MessageBox("没有磁盘空间,请插入一张新盘!","换盘",MB_OKCANCEL)==IDOK)
		  {
		     if(MoveFile(sSource,sTarget))
				 break;
		  }
	   }
	}
	MessageBox("备份完毕");
	m_bProgress=FALSE;
	m_arFileName.SetSize(0);
    if(m_arPlayList.GetSize()!=0)
	{
       for(int i=0;i<m_arPlayList.GetSize();i++)
	    delete m_arPlayList.GetAt(i);
	   m_arPlayList.RemoveAll();
	}
	CDialog::OnOK();
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CVideoBackupDlg::OnCloseupChannelBox() 
{
   int nIndex=m_cChannelBox.GetCurSel();
   if(nIndex!=m_nChannel)
   {
      m_nChannel=nIndex;
	  CheckfileValid(GetAppPath()+"mpeg");
   }
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
BOOL CVideoBackupDlg::CheckfileValid(CString sPath)
{
   	m_cTimeGrid.SetNoValid();
	m_cRecordDate.GetTime(m_Date);
	CString sDate;
	sDate=m_Date.Format("%Y%m%d");
	CFileFind PlayFile;
	CString sFind;
	sFind.Format("%02d-%s",m_nChannel+1,sDate);
	sFind+="*.mpg";
	sFind=sPath+"\\"+sFind;
	BOOL bFind=PlayFile.FindFile(sFind);
	if(bFind)
	{
		while(bFind)
		{
		   bFind=PlayFile.FindNextFile();
		   CString sTmp=PlayFile.GetFileTitle();
		   CString sHour,sMinute,sEndHour,sEndMinute,sTmp1;
           sHour=sTmp.Mid(11,2);
           sMinute=sTmp.Mid(13,2);
		   CTime LastTime;
		   PlayFile.GetLastWriteTime(LastTime);
		   sEndHour=LastTime.Format("%H");
		   sEndMinute=LastTime.Format("%M");
		   if(sHour<sEndHour)
		   {
			  for(int i=StringToInt(sHour)+1;i<StringToInt(sEndHour)+1;i++)
			  {
				  for(int j=StringToInt(sMinute)+1;j<=60;j++)
				  {
					 m_cTimeGrid.SetValidCell(i,j);
					 m_cTimeGrid.RedrawCell(i,j);
				  }
				  for(j=0;j<=StringToInt(sEndMinute)+1;j++)
				  {
					 m_cTimeGrid.SetValidCell(i+1,j);
					 m_cTimeGrid.RedrawCell(i+1,j);
				  }
			  }
		   }
		   else
		   {
		      for(int j=StringToInt(sMinute)+1;j<=StringToInt(sEndMinute)+1;j++)
			  {
			     m_cTimeGrid.SetValidCell(StringToInt(sHour)+1,j);
				 m_cTimeGrid.RedrawCell(StringToInt(sHour)+1,j);

			  }
		   }
		   if(!bFind)
			   return TRUE;
		}
	}
	return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CVideoBackupDlg::OnCloseupRecordDate(NMHDR* pNMHDR, LRESULT* pResult) 
{
	CheckfileValid(GetAppPath()+"mpeg");
	*pResult = 0;
}
/////////////////////////////////
//
/////////////////////////////////
BOOL CVideoBackupDlg::EnableBackupFile(CString sDate,CString sPath,CStringArray &arFileName)
{
   	CFileFind PlayFile;
	CString sFind;
	sFind.Format("%02d-%s",m_nChannel+1,sDate);
	sFind+="*.mpg";
	sFind=sPath+"\\"+sFind;
	for(int i=0;i<m_arPlayList.GetSize();i++)
	{
	   CPlayList *pList=m_arPlayList.GetAt(i);
	   double fStartTime=StringToFloat(pList->m_sStartTime.Left(2)+"."+pList->m_sStartTime.Right(2));
	   double fEndTime=StringToFloat(pList->m_sEndTime.Left(2)+"."+pList->m_sEndTime.Right(2));
	   BOOL bFind=PlayFile.FindFile(sFind);
	   while(bFind)
	   {
		   bFind=PlayFile.FindNextFile();
		   CString sTmp=PlayFile.GetFileTitle();
		   CTime   Time;
		   PlayFile.GetLastWriteTime(Time);
		   double fFileEndTime=StringToFloat(Time.Format("%H.%M"));
		   double fFileStartTime=StringToFloat(sTmp.Mid(11,2)+"."+sTmp.Mid(13,2));
		   if(fFileStartTime>=fStartTime&&fFileStartTime<=fEndTime)//选择的时间段中包含一个文件
		      arFileName.Add(PlayFile.GetFilePath());
		   else if(fStartTime>fFileStartTime&&fEndTime<fFileEndTime)//选择的时间段中包含在一个文件
		   {
		      arFileName.Add(PlayFile.GetFilePath());
		   }
	   }
	}
	return TRUE;
}
////////////////////////////////////////////
//
////////////////////////////////////////////
void CVideoBackupDlg::OnCloseupDriveList() 
{
   m_cDriveList.GetLBText(m_cDriveList.GetCurSel(),m_sDrive); 
		
}
////////////////////////////////////
//
///////////////////////////////////
void CVideoBackupDlg::OnCancel() 
{
	if(m_bProgress)
		return;
	CDialog::OnCancel();
}
////////////////////////////////////
//
///////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -