📄 playbackdlg.cpp
字号:
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
LRESULT CPlaybackDlg::OnCloseThread(WPARAM wParam, LPARAM lParam)
{
if (m_hRetrieveThread)
CloseHandle(m_hRetrieveThread);
m_hRetrieveThread = NULL;
return 0;
}
// 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 CPlaybackDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<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 function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CPlaybackDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CPlaybackDlg::SetTimeSegment(int index)
{
TMediaDBTimeInterval tTI;
struct tm *stime;
SYSTEMTIME wTime;
memset(&wTime, 0, sizeof(wTime));
if (index >= 0)
{
// clear search result list box
m_SearchResult.ResetContent();
SCODE sRet = MediaDB_GetTimeSegmentInterval(m_hLocation, (WORD) index, &tTI);
if (!IS_SUCCESS(sRet))
return;
/*
int nOld = _daylight;
_daylight = 0;
stime = localtime((time_t *) &tTI.dwStartTime);
*/
// use new converting method now
stime = gmtime((time_t *) &tTI.dwStartTime);
wTime.wYear = stime->tm_year+1900;
wTime.wMonth = stime->tm_mon+1;
wTime.wDay = stime->tm_mday;
wTime.wHour = stime->tm_hour;
wTime.wMinute = stime->tm_min;
wTime.wSecond = stime->tm_sec;
m_StartDate.SetTime(&wTime);
m_StartTime.SetTime(&wTime);
/*
stime = localtime((time_t *) &tTI.dwEndTime);
_daylight = nOld; // restore daylight value
*/
// use new converting method now
stime = gmtime((time_t *) &tTI.dwEndTime);
wTime.wYear = stime->tm_year+1900;
wTime.wMonth = stime->tm_mon+1;
wTime.wDay = stime->tm_mday;
wTime.wHour = stime->tm_hour;
wTime.wMinute = stime->tm_min;
wTime.wSecond = stime->tm_sec;
m_EndDate.SetTime(&wTime);
m_EndTime.SetTime(&wTime);
m_wCurrentTimeSegIndex = index;
m_StartDate.EnableWindow(TRUE);
m_StartTime.EnableWindow(TRUE);
m_EndDate.EnableWindow(TRUE);
m_EndTime.EnableWindow(TRUE);
m_SearchResult.EnableWindow(TRUE);
CButton_DeleteTI.EnableWindow(TRUE);
m_btnSearchTimeI.EnableWindow(TRUE);
m_btnSearchEvent.EnableWindow(TRUE);
m_EventList.EnableWindow(TRUE);
}
else
{
m_StartDate.EnableWindow(FALSE);
m_StartTime.EnableWindow(FALSE);
m_EndDate.EnableWindow(FALSE);
m_EndTime.EnableWindow(FALSE);
m_SearchResult.EnableWindow(FALSE);
CButton_DeleteTI.EnableWindow(FALSE);
m_btnSearchTimeI.EnableWindow(FALSE);
m_btnSearchEvent.EnableWindow(FALSE);
m_EventList.EnableWindow(FALSE);
}
}
void CPlaybackDlg::OpenMediaLocation(char* pszLoc)
{
SCODE ret;
WORD wTimeSegmentNum = 0;
TMediaLocationOption tLocOption;
TMediaDBTimeInterval tTI;
CString TimeSeg, TimeSeg2;
struct tm *stime;
// close current location
if (m_hLocation)
{
MediaDB_CloseLocation(m_hLocation);
m_hLocation = NULL;
}
m_TimeSegmentList.ResetContent();
// Open new location
tLocOption.dwMaxFileSize = 1024 * 1024 * 2;
tLocOption.dwMaxIndexNumber = 20;
tLocOption.pszLocation = pszLoc;
ret = MediaDB_OpenLocation(m_hDatabase, &tLocOption, &m_hLocation);
if (IS_FAIL(ret))
{
char szMsg[MAX_PATH];
sprintf(szMsg, "Open Location Fail ! %d (%X)", ret, ret);
MessageBox(szMsg, "Error", MB_OK);
return;
}
MediaDB_GetTimeSegmentNumber(m_hLocation, &wTimeSegmentNum);
/*
int nOld = _daylight;
_daylight = 0;
*/
for (int i = 0; i<wTimeSegmentNum; i++)
{
MediaDB_GetTimeSegmentInterval(m_hLocation, (WORD) i, &tTI);
//stime = localtime((time_t *) &tTI.dwStartTime);
// use new converting method now
stime = gmtime((time_t *) &tTI.dwStartTime);
TimeSeg.Format("%4d/%2d/%2d %02d:%02d:%02d", stime->tm_year+1900,
stime->tm_mon+1, stime->tm_mday, stime->tm_hour, stime->tm_min, stime->tm_sec);
//stime = localtime((time_t *) &tTI.dwEndTime);
// use new converting method now
stime = gmtime((time_t *) &tTI.dwEndTime);
TimeSeg2.Format(" ~ %4d/%2d/%2d %02d:%02d:%02d", stime->tm_year+1900,
stime->tm_mon+1, stime->tm_mday, stime->tm_hour, stime->tm_min, stime->tm_sec);
TimeSeg += TimeSeg2;
m_TimeSegmentList.AddString(TimeSeg);
}
//_daylight = nOld;
// Select first timesegment as default
if (wTimeSegmentNum > 0)
{
m_TimeSegmentList.EnableWindow(TRUE);
m_TimeSegmentList.SetCurSel(0);
SetTimeSegment(0);
}
else
{
m_TimeSegmentList.EnableWindow(FALSE);
SetTimeSegment(-1);
}
}
void CPlaybackDlg::GetTimeQueryInterval()
{
SYSTEMTIME sDate;
SYSTEMTIME sTime;
struct tm timetm;
time_t tVal;
time(&tVal);
localtime(&tVal);
// start time
m_StartDate.GetTime(&sDate);
m_StartTime.GetTime(&sTime);
timetm.tm_isdst = 0;
timetm.tm_year = sDate.wYear - 1900;
timetm.tm_mon = sDate.wMonth - 1;
timetm.tm_mday = sDate.wDay;
timetm.tm_hour = sTime.wHour;
timetm.tm_min = sTime.wMinute;
timetm.tm_sec = sTime.wSecond;
timetm.tm_hour -= _timezone / 3600;
m_dwStartTime = (DWORD) mktime(&timetm);
// end time
m_EndDate.GetTime(&sDate);
m_EndTime.GetTime(&sTime);
timetm.tm_isdst = 0;
timetm.tm_year = sDate.wYear - 1900;
timetm.tm_mon = sDate.wMonth - 1;
timetm.tm_mday = sDate.wDay;
timetm.tm_hour = sTime.wHour;
timetm.tm_min = sTime.wMinute;
timetm.tm_sec = sTime.wSecond;
timetm.tm_hour -= _timezone / 3600;
m_dwEndTime = (DWORD) mktime(&timetm);
m_BmkDate.GetTime(&sDate);
m_BmkTime.GetTime(&sTime);
timetm.tm_isdst = 0;
timetm.tm_year = sDate.wYear - 1900;
timetm.tm_mon = sDate.wMonth - 1;
timetm.tm_mday = sDate.wDay;
timetm.tm_hour = sTime.wHour;
timetm.tm_min = sTime.wMinute;
timetm.tm_sec = sTime.wSecond;
timetm.tm_hour -= _timezone / 3600;
m_dwBmkTime = (DWORD) mktime(&timetm);
}
void CPlaybackDlg::OnBnClickedOpendatabase()
{
// TODO: Add your control notification handler code here
BROWSEINFO biShell;
char szFolderName[MAX_PATH];
LPITEMIDLIST pidlSelected = NULL;
LPMALLOC pMalloc = NULL;
TMediaDBInitOption tInitOption;
SCODE ret;
DWORD dwLocNum = 0;
// Select Database Folder
SHGetMalloc(&pMalloc);
biShell.hwndOwner = m_hWnd;
biShell.pidlRoot = NULL;
biShell.pszDisplayName = szFolderName;
biShell.lpszTitle = "Select database path";
//biShell.ulFlags = BIF_BROWSEFORCOMPUTER | BIF_DONTGOBELOWDOMAIN | BIF_RETURNFSANCESTORS |
biShell.ulFlags = BIF_RETURNONLYFSDIRS;// | BIF_NONEWFOLDERBUTTON | BIF_USENEWUI;
biShell.lpfn = NULL;
biShell.lParam = 0;
biShell.iImage = 0;
if ((pidlSelected = SHBrowseForFolder(&biShell)) == NULL)
return;
if (!SHGetPathFromIDList(pidlSelected, szFolderName))
return;
if (pidlSelected)
pMalloc->Free(pidlSelected);
pMalloc->Release();
CEdit *pDBCtrl = (CEdit *) GetDlgItem(IDC_DATAPATH);
pDBCtrl->SetWindowText(szFolderName);
m_szDBPath = szFolderName;
// Database initial
if (m_hDatabase)
{
// close current location
if (m_hLocation)
{
MediaDB_CloseLocation(m_hLocation);
m_hLocation = NULL;
}
// close current database
MediaDB_Release(m_hDatabase);
m_hDatabase = NULL;
}
tInitOption.pszDatabasePath = szFolderName; // database path
tInitOption.dwVersion = DATABASE_VERSION; // database library version
ret = MediaDB_Initial(&m_hDatabase, &tInitOption, DB_OPEN);
if (IS_FAIL(ret))
{
MessageBox("Open Database Fail !", "Error", MB_OK);
return;
}
// Get location list
CHAR (*pszLocation)[STR_MAX];
MediaDB_GetLocationNum(m_hDatabase, &dwLocNum);
pszLocation = (char(*)[STR_MAX]) malloc(dwLocNum * STR_MAX);
MediaDB_GetLocationList(m_hDatabase, dwLocNum, pszLocation);
m_LocationList.ResetContent();
for (unsigned int i = 0; i<dwLocNum; i++)
m_LocationList.AddString(pszLocation[i]);
// Open first location as default
OpenMediaLocation(pszLocation[0]);
m_LocationList.SetCurSel(0);
free(pszLocation);
GetDlgItem(IDC_PLAY)->EnableWindow(TRUE);
}
void CPlaybackDlg::OnCbnSelchangeLocation()
{
// TODO: Add your control notification handler code here
int nIndex;
char szLoc[MAX_PATH];
nIndex = m_LocationList.GetCurSel();
if (nIndex != CB_ERR)
{
m_LocationList.GetLBText(nIndex, szLoc);
OpenMediaLocation(szLoc);
}
}
void CPlaybackDlg::OnBnClickedSearchTi()
{
// TODO: Add your control notification handler code here
HANDLE hQuery;
DWORD dwTINum;
TMediaDBTimeInterval tTI;
TMediaDBIntervalInfo tTIInfo;
CString strItem, strItem2;
struct tm *timetm;
SCODE sRet;
// clear list box
m_SearchResult.ResetContent();
GetTimeQueryInterval();
tTI.dwStartTime = m_dwStartTime;
tTI.dwEndTime = m_dwEndTime;
MediaDB_CreateTimeQuery(m_hLocation, m_wCurrentTimeSegIndex, &tTI, &hQuery);
MediaDB_GetTimeIntervalNum(hQuery, &dwTINum);
sRet = MediaDB_FindFirstTimeInterval(hQuery, &tTIInfo);
if(sRet == DATABASE_E_ENDOFQUERY || IS_FAIL(sRet))
{
MediaDB_DeleteQuery(hQuery);
return;
}
/*
int nOld;
nOld = _daylight;
_daylight = 0;
*/
do
{
//timetm = localtime((time_t *) &tTIInfo.tTimeInterval.dwStartTime);
// use new converting method
timetm = gmtime((time_t *) &tTIInfo.tTimeInterval.dwStartTime);
strItem.Format("%4d/%02d/%02d %02d:%02d:%02d", timetm->tm_year+1900,
timetm->tm_mon+1, timetm->tm_mday, timetm->tm_hour, timetm->tm_min, timetm->tm_sec);
//timetm = localtime((time_t *) &tTIInfo.tTimeInterval.dwEndTime);
timetm = gmtime((time_t *) &tTIInfo.tTimeInterval.dwEndTime);
strItem2.Format(" ~ %4d/%02d/%02d %02d:%02d:%02d", timetm->tm_year+1900,
timetm->tm_mon+1, timetm->tm_mday, timetm->tm_hour, timetm->tm_min, timetm->tm_sec);
strItem += strItem2;
switch (tTIInfo.dwMediaType)
{
case MEDIADB_VIDEO_TYPE :
strItem2.Format(" V ");
strItem += strItem2;
break;
case MEDIADB_AUDIO_TYPE :
strItem2.Format(" A ");
strItem += strItem2;
break;
case MEDIADB_VIDEO_TYPE | MEDIADB_AUDIO_TYPE:
strItem2.Format(" A/V ");
strItem += strItem2;
break;
}
switch (tTIInfo.eVideoStreamType)
{
case mctJPEG :
strItem2.Format(" JPEG ");
strItem += strItem2;
break;
case mctH263 :
strItem2.Format(" H.263 ");
strItem += strItem2;
break;
case mctMP4V :
strItem2.Format(" MPEG4 ");
strItem += strItem2;
break;
}
switch (tTIInfo.eAudioStreamType)
{
case mctG7221 :
strItem2.Format(" G.7221 ");
strItem += strItem2;
break;
case mctG729A :
strItem2.Format(" G.729A ");
strItem += strItem2;
break;
case mctGAMR :
strItem2.Format(" GAMR ");
strItem += strItem2;
break;
case mctAAC :
strItem2.Format(" AAC ");
strItem += strItem2;
break;
}
m_SearchResult.AddString(strItem);
} while(((sRet = MediaDB_FindNextTimeInterval(hQuery, &tTIInfo)) != DATABASE_E_ENDOFQUERY) && IS_SUCCESS(sRet));
//_daylight = nOld;
MediaDB_DeleteQuery(hQuery);
}
void CPlaybackDlg::OnBnClickedSearchEvent()
{
// TODO: Add your control notification handler code here
HANDLE hQuery;
DWORD dwEventNum;
TMediaDBTimeInterval tTI;
TMediaDBEventProperty tEventProperty;
CString strItem, strItem2;
DWORD dwEventType;
struct tm *timetm;
SCODE sRet;
// clear list box
m_SearchResult.ResetContent();
GetTimeQueryInterval();
tTI.dwStartTime = m_dwStartTime;
tTI.dwEndTime = m_dwEndTime;
GetEventType(&dwEventType);
MediaDB_CreateEventQuery(m_hLocation, m_wCurrentTimeSegIndex, &tTI, dwEventType, &hQuery);
MediaDB_GetEventIntervalNum(hQuery, &dwEventNum);
sRet = MediaDB_FindFirstEventInterval(hQuery, &tEventProperty);
if(sRet == DATABASE_E_ENDOFQUERY || IS_FAIL(sRet))
{
MediaDB_DeleteQuery(hQuery);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -