实例介绍
【实例截图】
【核心代码】
// newclientDlg.cpp : implementation file
//
#include "stdafx.h"
#include "newclient.h"
#include "newclientDlg.h"
#include "MyOutput.h"
#include "Curwin.h"
#include "EventLog.h"
#include "VoiceExchange.h"
#include "SetAlarm.h"
#include "PlayBack.h"
#include "SystemConfig.h"
#include "DecodeCardSDK.h"
#include "RemoteParamsCfg.h"
CRemoteParamsCfg RemoteParamsCfgDlg;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define WM_MYCOMMAND WM_USER 1 //for sdk
CLIENTPARAM ClientParam;
SERVER_INFO serverinfo[MAXIPNUMBER];
IP_INFO allipinfo[MAXIPNUMBER][MAXCHANNUM];
IP_INFO selipinfo[MAXNUMBER];
ALARM_INFO alarminfo[MAXALARMIN];
int iSurveillanceNumber;
CMyOutput myoutput[MAXVIEWNUM];
CCurwin mycurwin;
char cWorkDir[256];
BOOL bLargeWnd = FALSE; //播放窗口是否在放大,如果是放大的窗口,则关闭该窗口时,恢复到原来多窗口画面;
WORD numberpos = 0;
HBRUSH hBrush;
extern WORD iActiveWndNumber;
extern LONG lVoiceIndex;
extern void ReadSurveillanceConfig();
extern void ReadClientConfig();
extern void F_AddEvent(CString csEvent);
int MYVIEW_LEFT = 20;
int MYVIEW_TOP = 20;
HANDLE hVideoBeeper; //报警事件
HANDLE hBeepThread; //报警线程
extern int nUseCard;
CNewclientDlg *MainDlg;
BOOL g_bShareSound = FALSE;
int g_nNetDelay = 2;
void *pDecHandle;
void *pEncHandle;
DWORD g_dwcnt = 0;
UINT Beeper(LPVOID pParam)
{
while (true)
{
Beep(800,500);
Beep(1000,500);
Beep(800,500);
Beep(1000,500);
if (WaitForSingleObject(hVideoBeeper,1000) == WAIT_OBJECT_0)
{
ResetEvent(hVideoBeeper);
hBeepThread = NULL;
return FALSE;
}
}
return TRUE;
}
//消息回调处理函数
int CALLBACK MessageCallback(LONG lCommand,char *sDVRIP,char *pBuf,DWORD dwBufLen)
{
BOOL bDisk = FALSE;
CString csTemp;
int i = 0;
csTemp.Format("%s", sDVRIP);
for (i=0; i<MAXIPNUMBER; i )
{
if (strcmp(serverinfo[i].m_csServerIP, csTemp) == 0)
break;
}
int nStartChan = serverinfo[i].m_lStartChannel;
switch (lCommand) {
case COMM_ALARM:
NET_DVR_ALARMINFO m_alarminfo;
memcpy(&m_alarminfo, pBuf, sizeof(NET_DVR_ALARMINFO));
switch (m_alarminfo.dwAlarmType)
{
case 0:
csTemp.Format("服务器%s发生信号量报警 报警输入%d ", sDVRIP, m_alarminfo.dwAlarmInputNumber 1);
F_AddEvent(csTemp);
TRACE(csTemp);
for (i=0; i<MAX_CHANNUM; i )
{
if (m_alarminfo.dwAlarmRelateChannel[i] == 1)
{
csTemp.Format("触发通道号%d ", i nStartChan);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 1:
for (i=0; i<MAX_DISKNUM; i )
{
if (m_alarminfo.dwDiskNumber[i] == 1)
{
csTemp.Format("服务器%s发生硬盘满报警 硬盘号%d ", sDVRIP, i);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 2:
for (i=0; i<MAX_CHANNUM; i )
{
if (m_alarminfo.dwChannel[i] == 1)
{
csTemp.Format("服务器%s发生信号丢失报警 通道号%d ", sDVRIP, i nStartChan);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 3:
for (i=0; i<MAX_CHANNUM; i )
{
if (m_alarminfo.dwChannel[i] == 1)
{
csTemp.Format("服务器%s发生移动侦测报警 通道号%d ", sDVRIP, i nStartChan);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 4:
for (i=0; i<MAX_DISKNUM; i )
{
if (m_alarminfo.dwDiskNumber[i] == 1)
{
csTemp.Format("服务器%s发生硬盘未格式化报警 硬盘号%d ", sDVRIP, i);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 5:
for (i=0; i<MAX_DISKNUM; i )
{
if (m_alarminfo.dwDiskNumber[i] == 1)
{
bDisk = TRUE;
csTemp.Format("服务器%s发生读写硬盘出错报警 硬盘号%d ", sDVRIP, i);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
if (bDisk == FALSE)
{
csTemp.Format("服务器%s发生未接硬盘出错报警 ", sDVRIP);
F_AddEvent(csTemp);
TRACE(csTemp);
}
bDisk = FALSE;
break;
case 6:
for (i=0; i<MAX_CHANNUM; i )
{
if (m_alarminfo.dwChannel[i] == 1)
{
csTemp.Format("服务器%s发生遮挡报警 通道号%d ", sDVRIP, i nStartChan);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 7:
for (i=0; i<MAX_CHANNUM; i )
{
if (m_alarminfo.dwChannel[i] == 1)
{
csTemp.Format("服务器%s发生制式不匹配 通道号%d ", sDVRIP, i nStartChan);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 8:
csTemp.Format("服务器%s发生非法访问 ", sDVRIP);
F_AddEvent(csTemp);
TRACE(csTemp);
break;
default:
csTemp.Format("报警类型:未知 %d",m_alarminfo.dwAlarmType);
F_AddEvent(csTemp);
TRACE(csTemp);
break;
}
if (!hBeepThread)
{
ResetEvent(hVideoBeeper);
// hBeepThread = AfxBeginThread(Beeper,NULL);
}
csTemp.Format("%s", sDVRIP);
for (i=0; i<16; i )//只能对16台布防的设备显示灯
{
if (strcmp(serverinfo[i].m_csServerIP, csTemp) == 0)
break;
}
if (i != MAX_CHANNUM)
{
if (ClientParam.m_iAlarmHandle[i] >= 0)
{
MainDlg->m_pAlarmLed[i]->SetLed(CLed::LED_COLOR_RED,CLed::LED_ON,CLed::LED_ROUND);
}
else
{
MainDlg->m_pAlarmLed[i]->SetLed(CLed::LED_COLOR_RED,CLed::LED_DISABLED,CLed::LED_ROUND);
}
}
break;
case COMM_TRADEINFO:
NET_DVR_TRADEINFO m_TradeInfo;
memcpy(&m_TradeInfo, pBuf, sizeof(NET_DVR_TRADEINFO));
csTemp.Format("服务器%s收到卡号信息%s ", sDVRIP, m_TradeInfo.CardNumber);
F_AddEvent(csTemp);
TRACE(csTemp);
break;
default:
break;
}
return 0;
}
//消息回调处理函数
int CALLBACK MessageCallback_EX(LONG lCommand,LONG lUserID,char *pBuf,DWORD dwBufLen)
{
CString csTemp;
CString sDVRIP;
int i = 0;
for (i=0; i<MAXIPNUMBER; i )
{
if (serverinfo[i].m_lServerID == lUserID)
break;
}
int nStartChan = serverinfo[i].m_lStartChannel;
sDVRIP.Format("%s", serverinfo[i].m_csServerIP);
switch (lCommand) {
case COMM_ALARM:
NET_DVR_ALARMINFO m_alarminfo;
memcpy(&m_alarminfo, pBuf, sizeof(NET_DVR_ALARMINFO));
switch (m_alarminfo.dwAlarmType)
{
case 0:
csTemp.Format("服务器%s发生信号量报警 报警输入%d ", sDVRIP, m_alarminfo.dwAlarmInputNumber 1);
F_AddEvent(csTemp);
TRACE(csTemp);
for (i=0; i<MAX_CHANNUM; i )
{
if (m_alarminfo.dwAlarmRelateChannel[i] == 1)
{
csTemp.Format("触发通道号%d ", i nStartChan);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 1:
for (i=0; i<MAX_DISKNUM; i )
{
if (m_alarminfo.dwDiskNumber[i] == 1)
{
csTemp.Format("服务器%s发生硬盘满报警 硬盘号%d ", sDVRIP, i);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 2:
for (i=0; i<MAX_CHANNUM; i )
{
if (m_alarminfo.dwChannel[i] == 1)
{
csTemp.Format("服务器%s发生信号丢失报警 通道号%d ", sDVRIP, i nStartChan);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 3:
for (i=0; i<MAX_CHANNUM; i )
{
if (m_alarminfo.dwChannel[i] == 1)
{
csTemp.Format("服务器%s发生移动侦测报警 通道号%d ", sDVRIP, i nStartChan);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 4:
for (i=0; i<MAX_DISKNUM; i )
{
if (m_alarminfo.dwDiskNumber[i] == 1)
{
csTemp.Format("服务器%s发生硬盘未格式化报警 硬盘号%d ", sDVRIP, i);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 5:
for (i=0; i<MAX_DISKNUM; i )
{
if (m_alarminfo.dwDiskNumber[i] == 1)
{
csTemp.Format("服务器%s发生读写硬盘出错报警 硬盘号%d ", sDVRIP, i);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 6:
for (i=0; i<MAX_CHANNUM; i )
{
if (m_alarminfo.dwChannel[i] == 1)
{
csTemp.Format("服务器%s发生遮挡报警 通道号%d ", sDVRIP, i nStartChan);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 7:
for (i=0; i<MAX_CHANNUM; i )
{
if (m_alarminfo.dwChannel[i] == 1)
{
csTemp.Format("服务器%s发生制式不匹配 通道号%d ", sDVRIP, i nStartChan);
F_AddEvent(csTemp);
TRACE(csTemp);
}
}
break;
case 8:
csTemp.Format("服务器%s发生非法访问 ", sDVRIP);
F_AddEvent(csTemp);
TRACE(csTemp);
break;
default:
csTemp.Format("报警类型:未知 %d",m_alarminfo.dwAlarmType);
F_AddEvent(csTemp);
TRACE(csTemp);
break;
}
if (!hBeepThread)
{
ResetEvent(hVideoBeeper);
// hBeepThread = AfxBeginThread(Beeper,NULL);
}
csTemp.Format("%s", sDVRIP);
for (i=0; i<16; i )//只能对16台布防的设备显示灯
{
if (strcmp(serverinfo[i].m_csServerIP, csTemp) == 0)
break;
}
if (i != MAX_CHANNUM)
{
if (ClientParam.m_iAlarmHandle[i] >= 0)
{
MainDlg->m_pAlarmLed[i]->SetLed(CLed::LED_COLOR_RED,CLed::LED_ON,CLed::LED_ROUND);
}
else
{
MainDlg->m_pAlarmLed[i]->SetLed(CLed::LED_COLOR_RED,CLed::LED_DISABLED,CLed::LED_ROUND);
}
}
break;
default:
break;
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNewclientDlg dialog
CNewclientDlg::CNewclientDlg(CWnd* pParent /*=NULL*/)
: CDialog(CNewclientDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CNewclientDlg)
m_yzd = 0;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CNewclientDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNewclientDlg)
DDX_Control(pDX, IDC_COMBONETDELAY, m_NetDelayCtrl);
DDX_Control(pDX, IDC_ALARMLED9, m_AlarmLed9);
DDX_Control(pDX, IDC_ALARMLED8, m_AlarmLed8);
DDX_Control(pDX, IDC_ALARMLED7, m_AlarmLed7);
DDX_Control(pDX, IDC_ALARMLED6, m_AlarmLed6);
DDX_Control(pDX, IDC_ALARMLED5, m_AlarmLed5);
DDX_Control(pDX, IDC_ALARMLED4, m_AlarmLed4);
DDX_Control(pDX, IDC_ALARMLED3, m_AlarmLed3);
DDX_Control(pDX, IDC_ALARMLED2, m_AlarmLed2);
DDX_Control(pDX, IDC_ALARMLED16, m_AlarmLed16);
DDX_Control(pDX, IDC_ALARMLED15, m_AlarmLed15);
DDX_Control(pDX, IDC_ALARMLED14, m_AlarmLed14);
DDX_Control(pDX, IDC_ALARMLED13, m_AlarmLed13);
DDX_Control(pDX, IDC_ALARMLED12, m_AlarmLed12);
DDX_Control(pDX, IDC_ALARMLED11, m_AlarmLed11);
DDX_Control(pDX, IDC_ALARMLED10, m_AlarmLed10);
DDX_Control(pDX, IDC_ALARMLED1, m_AlarmLed1);
DDX_Control(pDX, IDC_LED9, m_CapLed9);
DDX_Control(pDX, IDC_LED8, m_CapLed8);
DDX_Control(pDX, IDC_LED7, m_CapLed7);
DDX_Control(pDX, IDC_LED6, m_CapLed6);
DDX_Control(pDX, IDC_LED5, m_CapLed5);
DDX_Control(pDX, IDC_LED4, m_CapLed4);
DDX_Control(pDX, IDC_LED3, m_CapLed3);
DDX_Control(pDX, IDC_LED2, m_CapLed2);
DDX_Control(pDX, IDC_LED16, m_CapLed16);
DDX_Control(pDX, IDC_LED15, m_CapLed15);
DDX_Control(pDX, IDC_LED14, m_CapLed14);
DDX_Control(pDX, IDC_LED13, m_CapLed13);
DDX_Control(pDX, IDC_LED12, m_CapLed12);
DDX_Control(pDX, IDC_LED11, m_CapLed11);
DDX_Control(pDX, IDC_LED10, m_CapLed10);
DDX_Control(pDX, IDC_LED1, m_CapLed1);
DDX_Control(pDX, IDC_COMBOWNDNUM, m_windownum);
DDX_Control(pDX, IDC_SLIDERYL, m_yl);
DDX_Control(pDX, IDC_SLIDERSD, m_sd);
DDX_Control(pDX, IDC_SLIDERLD, m_ld);
DDX_Control(pDX, IDC_SLIDERDBD, m_dbd);
DDX_Control(pDX, IDC_SLIDERBHD, m_bhd);
DDX_Text(pDX, IDC_YZD, m_yzd);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNewclientDlg, CDialog)
//{{AFX_MSG_MAP(CNewclientDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_EXIT, OnExit)
ON_BN_CLICKED(IDC_AUDIOEXCHANGE, OnAudioexchange)
ON_BN_CLICKED(IDC_SYSTEMCFG, OnSystemcfg)
ON_BN_CLICKED(IDC_PLAY, OnVideonetplay)
ON_BN_CLICKED(IDC_GETPICTURE, OnGetpicture)
ON_BN_CLICKED(IDC_RECORD, OnRecord)
ON_BN_CLICKED(IDC_EVENTLIST, OnEventlist)
ON_BN_CLICKED(IDC_BUTTONALARMSET, OnButtonalarmset)
ON_BN_CLICKED(IDC_VIDEOFILEPLAY, OnVideofileplay)
ON_WM_TIMER()
ON_WM_HSCROLL()
ON_BN_CLICKED(IDC_BUTTONPOLL, OnButtonpoll)
ON_BN_CLICKED(IDC_BUTTONYZW, OnButtonyzw)
ON_CBN_SELCHANGE(IDC_COMBOWNDNUM, OnSelchangeCombowndnum)
ON_CBN_SELCHANGE(IDC_COMBONETDELAY, OnSelchangeCombonetdelay)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTXH, OnButxh)
ON_BN_CLICKED(IDC_BUTJPEGPIC, OnButjpegpic)
ON_MESSAGE(WM_MYCOMMAND,OnMyCommand)
ON_WM_MOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//wParam: 消息类型 lParam: 发生异常的索引值。
void CNewclientDlg::OnMyCommand(WPARAM wParam, LPARAM lParam)
{
char tempbuf[256];
int i = 0;
DWORD dwType = wParam; //异常类型
LONG lIndex = lParam; //相对应得操作返回的句柄
ZeroMemory(tempbuf,256);
switch (dwType)
{
case EXCEPTION_AUDIOEXCHANGE: //语音对讲时网络异常
sprintf(tempbuf,"语音对讲时网络异常!!!");
TRACE("%s",tempbuf);
if (lVoiceIndex != -1)
{
if (lIndex == lVoiceIndex)
{
if (NET_DVR_StopVoiceCom(lVoiceIndex))
{
GetDlgItem(IDC_AUDIOEXCHANGE)->SetWindowText("语音对讲");
lVoiceIndex = -1;
}
else
{
AfxMessageBox("停止语音对讲失败!");
}
}
}
break;
case EXCEPTION_ALARM: //报警上传时网络异常
sprintf(tempbuf,"报警上传时网络异常!!!");
TRACE("%s",tempbuf);
for (i = 0; i < MAXIPNUMBER; i )
{
if (ClientParam.m_iAlarmHandle[i] >= 0)
{
if (lIndex == ClientParam.m_iAlarmHandle[i])
{
if (NET_DVR_CloseAlarmChan(ClientParam.m_iAlarmHandle[i]))
{
ClientParam.m_iAlarmHandle[i] = -1;
}
else
{
CString sTemp;
sTemp.Format("%s报警撤防失败!",serverinfo[i].m_csServerName);
AfxMessageBox(sTemp);
}
m_pAlarmLed[i]->SetLed(CLed::LED_COLOR_GREEN,CLed::LED_DISABLED,CLed::LED_ROUND);
}
}
}
break;
case EXCEPTION_PREVIEW: //网络预览时异常
sprintf(tempbuf,"网络预览时网络异常!!!");
TRACE("%s",tempbuf);
if (ClientParam.m_bPlaying)
{
for (i = 0; i < MAXVIEWNUM; i )
{
if (lIndex == myoutput[i].m_iPlayhandle)
{
if (myoutput[i].m_bFileSave)
{
F_StopClientRecord(i);
}
myoutput[i].StopNet();
}
}
}
break;
case EXCEPTION_SERIAL: //透明通道传输时异常
sprintf(tempbuf,"透明通道传输时网络异常!!!");
TRACE("%s",tempbuf);
//TODO: 关闭透明通道
break;
case EXCEPTION_RECONNECT: //预览的时候重连
sprintf(tempbuf,"预览时网络重连!!!");
TRACE("%s",tempbuf);
break;
default:
break;
}
}
// CNewclientDlg message handlers
BOOL CNewclientDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
int i,j;
CString sTemp;
NET_DVR_DEVICEINFO DeviceInfo;
LONG lUserID = 0;
char csServerIP[16];
char cUserName[100];
char cPassword[100];
BOOL bLogin = FALSE;
char cTemp[100];
DWORD dwReturned = 0;
NET_DVR_NETCFG netcfg;
nUseCard =0;
m_byException = 0;
hBrush=::CreateSolidBrush(COLORREF(0xff00ff));
ZeroMemory(cWorkDir, 256);
GetCurrentDirectory(256, cWorkDir);
TRACE("cWordDir = %s", cWorkDir);
CNewclientApp* pApp = (CNewclientApp*)AfxGetApp();
m_iHardDriverNum = pApp->m_iDriverNum;
for (i = 0; i < m_iHardDriverNum; i )
{
m_cHardDriver[i] = pApp->m_cHardDriver[i];
}
ClientParam.m_bCheckServerTime = FALSE;
ClientParam.m_iCheckServerTime = 0;
for (i = 0; i < MAXIPNUMBER; i )
{
serverinfo[i].m_csServerName.Format(_T(""));
serverinfo[i].m_iServerChannelNumber = -1;
serverinfo[i].m_wServerPort = 8000;
serverinfo[i].m_lServerID = -1;
for (j = 0; j < MAXCHANNUM; j )
{
allipinfo[i][j].m_lServerID = -1;
allipinfo[i][j].m_iChannel = -1;
allipinfo[i][j].m_iServerNum = -1;
allipinfo[i][j].m_iChannelNum = -1;
allipinfo[i][j].m_wServerport = 8000;
allipinfo[i][j].m_bChoosed = FALSE;
allipinfo[i][j].m_iSequence = -1;
}
}
for (i=0; i<10; i )
{
cTemp[i] = i;
}
ReadSurveillanceConfig();
for (i=0; i<MAXIPNUMBER; i )
{
if (serverinfo[i].m_iServerChannelNumber >= 0)
{
strcpy(csServerIP, serverinfo[i].m_csServerIP);
strncpy(cUserName, serverinfo[i].m_csServerAdminName, MAX_NAMELEN);
strncpy(cPassword, serverinfo[i].m_csServerAdminPasswd, PASSWD_LEN);
lUserID = NET_DVR_Login(csServerIP, serverinfo[i].m_wServerPort, cUserName, cPassword, &DeviceInfo);
if (lUserID < 0)
{
CString sTemp;
int nErr = NET_DVR_GetLastError();
if (nErr == NET_DVR_PASSWORD_ERROR)
{
sTemp.Format("%s 用户名密码错误! ", csServerIP);
TRACE(sTemp);
AfxMessageBox(sTemp);
}
//TODO: 其他错误值
else
{
sTemp.Format("%s 由于网络原因或DVR忙, 注册失败! ", csServerIP);
TRACE(sTemp);
AfxMessageBox(sTemp);
}
}
else
{
//TRACE("csServerIP = %s lUserID = %d", csServerIP, lUserID);
if (!NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_NETCFG, 0,&netcfg, sizeof(NET_DVR_NETCFG), &dwReturned))
{
CString sTemp;
sTemp.Format("获取服务器配置信息失败: NET_DVR_GET_NETCFG = %d \n", NET_DVR_GetLastError());
TRACE(sTemp);
}
bLogin = TRUE;
serverinfo[i].m_lServerID = lUserID;
serverinfo[i].m_wServerType = DeviceInfo.byDVRType;
serverinfo[i].m_lStartChannel = DeviceInfo.byStartChan;
serverinfo[i].m_dwAlarmInNum = DeviceInfo.byAlarmInPortNum;
serverinfo[i].m_dwAlarmOutNum = DeviceInfo.byAlarmOutPortNum;
serverinfo[i].m_iServerChannelNumber = DeviceInfo.byChanNum;
serverinfo[i].m_dwDiskNum = DeviceInfo.byDiskNum;
serverinfo[i].m_csServerMultiIP = netcfg.sMultiCastIP;
serverinfo[i].m_dwServerMultiIPvalue = inet_addr(netcfg.sMultiCastIP);
ZeroMemory(cTemp, 100);
memcpy(cTemp, DeviceInfo.sSerialNumber, SERIALNO_LEN);
serverinfo[i].m_csSerialNumber.Format("%s", cTemp);
for (j = 0; j < MAXCHANNUM; j )
{
if (j < DeviceInfo.byChanNum)
{
allipinfo[i][j].m_lServerID = lUserID;
allipinfo[i][j].m_csChanName.Format("通道%d",(j DeviceInfo.byStartChan));
allipinfo[i][j].m_iChannel = j DeviceInfo.byStartChan;
allipinfo[i][j].m_csMultiIP = netcfg.sMultiCastIP;
allipinfo[i][j].m_dwMultiIPvalue = inet_addr(allipinfo[i][j].m_csMultiIP);
if ( (allipinfo[i][j].m_bChoosed) && (allipinfo[i][j].m_iSequence != -1) )
{
selipinfo[allipinfo[i][j].m_iSequence].m_bChoosed = allipinfo[i][j].m_bChoosed;
selipinfo[allipinfo[i][j].m_iSequence].m_csChanName = allipinfo[i][j].m_csChanName;
selipinfo[allipinfo[i][j].m_iSequence].m_csIP = allipinfo[i][j].m_csIP;
selipinfo[allipinfo[i][j].m_iSequence].m_csMultiIP = allipinfo[i][j].m_csMultiIP;
selipinfo[allipinfo[i][j].m_iSequence].m_csPassword = allipinfo[i][j].m_csPassword;
selipinfo[allipinfo[i][j].m_iSequence].m_csUser = allipinfo[i][j].m_csUser;
selipinfo[allipinfo[i][j].m_iSequence].m_dwAddress = allipinfo[i][j].m_dwAddress;
selipinfo[allipinfo[i][j].m_iSequence].m_dwAlarmlevel = allipinfo[i][j].m_dwAlarmlevel;
selipinfo[allipinfo[i][j].m_iSequence].m_dwIPvalue = allipinfo[i][j].m_dwIPvalue;
selipinfo[allipinfo[i][j].m_iSequence].m_dwMultiIPvalue = allipinfo[i][j].m_dwMultiIPvalue;
selipinfo[allipinfo[i][j].m_iSequence].m_dwProtocol = allipinfo[i][j].m_dwProtocol;
selipinfo[allipinfo[i][j].m_iSequence].m_iChannel = allipinfo[i][j].m_iChannel;
selipinfo[allipinfo[i][j].m_iSequence].m_iSequence = allipinfo[i][j].m_iSequence;
selipinfo[allipinfo[i][j].m_iSequence].m_lServerID = allipinfo[i][j].m_lServerID;
selipinfo[allipinfo[i][j].m_iSequence].m_wJMQtype = allipinfo[i][j].m_wJMQtype;
selipinfo[allipinfo[i][j].m_iSequence].m_wServerport = allipinfo[i][j].m_wServerport;
selipinfo[allipinfo[i][j].m_iSequence].m_iServerNum = i;
selipinfo[allipinfo[i][j].m_iSequence].m_iChannelNum = j;
iSurveillanceNumber ;
//TRACE("m_iSequence = %d csServerIP = %s m_lServerID = %d", allipinfo[i][j].m_iSequence, selipinfo[allipinfo[i][j].m_iSequence].m_csIP, selipinfo[allipinfo[i][j].m_iSequence].m_lServerID);
}
}
else
{
allipinfo[i][j].m_lServerID = -1;
allipinfo[i][j].m_csChanName.Format("");
allipinfo[i][j].m_iChannel = -1;
}
}
}
}
}
ClientParam.m_bCyclePlay = FALSE;
ClientParam.m_iCycleTime = 20;
ClientParam.m_bUseCard = FALSE;
ClientParam.m_bNTSC = FALSE;
ClientParam.m_bAutoRecord = FALSE;
ClientParam.m_bCycleRecord = FALSE;
ClientParam.m_iRecordFileInterval = 60;
ClientParam.m_iStartRecordDriver = 0;
ClientParam.m_iEndRecordDriver = m_iHardDriverNum - 1;
ClientParam.m_csDownLoadPath.Format(_T("C:\\DownLoad"));
ClientParam.m_csPictureSavePath.Format(_T("C:\\Picture"));
ClientParam.m_csLogSavePath.Format(_T("C:\\EventLog"));
sTemp.Format("%s\\", ClientParam.m_csDownLoadPath);
CreateDirectory(sTemp, NULL);
sTemp.Format("%s\\", ClientParam.m_csPictureSavePath);
CreateDirectory(sTemp, NULL);
sTemp.Format("%s\\", ClientParam.m_csLogSavePath);
CreateDirectory(sTemp, NULL);
for (i = 0; i < 7; i )
{
for (j = 0; j < 4; j )
{
ClientParam.m_ClientRecordTime[i][j].m_iStartHour = 0;
ClientParam.m_ClientRecordTime[i][j].m_iStartMinute = 0;
ClientParam.m_ClientRecordTime[i][j].m_iStartTime = 0;
ClientParam.m_ClientRecordTime[i][j].m_iStopHour = 0;
ClientParam.m_ClientRecordTime[i][j].m_iStopMinute = 0;
ClientParam.m_ClientRecordTime[i][j].m_iStopTime = 0;
}
}
ClientParam.m_bAllDiskFull = FALSE;
ClientParam.m_bPlaying = FALSE;
ClientParam.m_bCycling = FALSE;
ClientParam.m_bNextPage = FALSE;
ClientParam.m_bFrontPage = FALSE;
ClientParam.m_bEnlarged = FALSE;
ClientParam.m_bFullScreen = FALSE;
ClientParam.m_bMultiScreen = FALSE;
for (i = 0; i < MAXIPNUMBER; i )
ClientParam.m_iAlarmHandle[i] = -1;
for (i = 0; i < MAXVIEWNUM; i )
{
ClientParam.m_VideoInfo[i].m_iBrightness = DEFAULTBRIGHTNESS;
ClientParam.m_VideoInfo[i].m_iContrast = DEFAULTCONTRAST;
ClientParam.m_VideoInfo[i].m_iSaturation = DEFAULTSATURATION;
ClientParam.m_VideoInfo[i].m_iHue = DEFAULTHUE;
}
ClientParam.m_Volume = DEFAULTVOLUME;
ReadClientConfig();
m_cCurrentRecordDriver = m_cHardDriver[ClientParam.m_iStartRecordDriver];
autorecordtimer = 0;
autorecordtimer = SetTimer(AUTORECORD_TIMER, 2000, NULL);
if (ClientParam.m_bCheckServerTime)
{
TRACE("启动硬盘录像机校时时钟,校时时间是每天的%06d", ClientParam.m_iCheckServerTime);
checkservertimer = 0;
checkservertimer = SetTimer(CHECKSERVER_TIMER, 1000, NULL);
}
for (i = 0; i < MAXALARMIN; i )
{
alarminfo[i].m_csIP.Format(_T(""));
alarminfo[i].m_csUsername.Format(_T(""));
alarminfo[i].m_csPassword.Format(_T(""));
alarminfo[i].m_lServerID = -1;
alarminfo[i].m_iChannel = -1;
alarminfo[i].m_iAlarmLevel = -1;
alarminfo[i].m_iAlarmType = -1;
alarminfo[i].m_iPortIndex = -1;
alarminfo[i].m_wServerPort = 8000;
}
m_iAlarmNumber = 0;
m_ld.SetRange(1,10,TRUE);
m_sd.SetRange(1,10,TRUE);
m_bhd.SetRange(1,10,TRUE);
m_dbd.SetRange(1,10,TRUE);
m_yl.SetRange(1,100,TRUE);
m_ld.SetPos(DEFAULTBRIGHTNESS);
m_sd.SetPos(DEFAULTHUE);
m_bhd.SetPos(DEFAULTSATURATION);
m_dbd.SetPos(DEFAULTCONTRAST);
m_yl.SetPos(DEFAULTVOLUME);
m_mybuttonup.SubclassDlgItem(IDC_BUTTONUP,this);
m_mybuttondown.SubclassDlgItem(IDC_BUTTONDOWN,this);
m_mybuttonleft.SubclassDlgItem(IDC_BUTTONLEFT,this);
m_mybuttonright.SubclassDlgItem(IDC_BUTTONRIGHT,this);
m_mybuttontjright.SubclassDlgItem(IDC_BUTTONTJRIGHT,this);
m_mybuttontjleft.SubclassDlgItem(IDC_BUTTONTJLEFT,this);
m_mybuttonjjleft.SubclassDlgItem(IDC_BUTTONJJLEFT,this);
m_mybuttonjjright.SubclassDlgItem(IDC_BUTTONJJRIGHT,this);
m_mybuttongqleft.SubclassDlgItem(IDC_BUTTONGQLEFT,this);
m_mybuttongqright.SubclassDlgItem(IDC_BUTTONGQRIGHT,this);
InitLed();
for (i=0;i<MAXVIEWNUM;i )
{
myoutput[i].Create(IDD_MYOUTPUT,this);
}
m_windownum.SetCurSel(2);
WINDOWNUM = 9;
channelcount = 0;
if (ClientParam.m_bUseCard)
{
F_InitDecodeCard();
}
mycurwin.Create(IDD_CURWIN,this);
ArrayWindow(0,WINDOWNUM);
MoveCurWin(WINDOWNUM,0);
hVideoBeeper=NULL; //报警事件
hBeepThread=NULL; //报警线程
hVideoBeeper = ::CreateEvent(NULL, // no security attributes
TRUE, // auto-reset event
FALSE, // initial state is signaled
NULL // object name
);
ResetEvent(hVideoBeeper);
freespacetimer = 0;
freespacetimer = SetTimer(FREESPACE_TIMER, 5000, NULL);
fileintervaltimer = 0;
fileintervaltimer = SetTimer(FILEINTERVAL_TIMER, 2000, NULL);
//SDK中收到DVR发过来的信息需要上传的通过回调函数实现,比如报警信息,日志信息等。
NET_DVR_SetDVRMessCallBack(MessageCallback);
//SDK中检测到异常通过消息的方式上传,比如网络断开
NET_DVR_SetDVRMessage(WM_MYCOMMAND,this->m_hWnd);
// 设置连接的超时设置
NET_DVR_SetConnectTime(5000,1);
//7200端口是监听端口
if (!NET_DVR_StartListen(NULL,7200))
{
CString sTemp;
sTemp.Format("ERROR: NET_DVR_StartListen = %d \n", NET_DVR_GetLastError());
AfxMessageBox(sTemp);
}
cycletimer = 0;
m_NetDelayCtrl.SetCurSel(g_nNetDelay);
pDecHandle = pEncHandle = NULL;
pEncHandle = NET_DVR_InitG722Encoder();
pDecHandle = NET_DVR_InitG722Decoder(16000);
MainDlg = this;
return TRUE; // return TRUE unless you set the focus to a control
}
void CNewclientDlg::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 CNewclientDlg::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 CNewclientDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CNewclientDlg::OnExit()
{
// TODO: Add your control notification handler code here
if (IDOK != MessageBox("确定要退出吗?","警告",IDOK))
return;
int i = 0;
F_StopPlay();
if (lVoiceIndex != -1)
{
if (NET_DVR_StopVoiceCom(lVoiceIndex))
{
GetDlgItem(IDC_AUDIOEXCHANGE)->SetWindowText("语音对讲");
lVoiceIndex = -1;
}
else
{
AfxMessageBox("停止语音对讲失败!");
}
}
if (cycletimer)
{
KillTimer(CYCLE_TIMER);
cycletimer = 0;
}
if (freespacetimer)
{
KillTimer(FREESPACE_TIMER);
freespacetimer = 0;
}
if (fileintervaltimer)
{
KillTimer(FILEINTERVAL_TIMER);
fileintervaltimer = 0;
}
if (checkservertimer)
{
// TRACE("关闭校时时钟");
KillTimer(CHECKSERVER_TIMER);
checkservertimer = 0;
}
if (hVideoBeeper)
SetEvent(hVideoBeeper);
if (ClientParam.m_bUseCard)
{
NET_DVR_ReleaseDevice_Card();
NET_DVR_ReleaseDDraw_Card();
}
NET_DVR_StopListen();
for (i=0; i<MAXIPNUMBER; i )
{
if (serverinfo[i].m_iServerChannelNumber >= 0)
{
if (serverinfo[i].m_lServerID != -1)
{
if (ClientParam.m_iAlarmHandle[i] >= 0)
{
if (NET_DVR_CloseAlarmChan(ClientParam.m_iAlarmHandle[i]))
{
ClientParam.m_iAlarmHandle[i] = -1;
}
}
if (!NET_DVR_Logout(serverinfo[i].m_lServerID))
{
CString sTemp;
sTemp.Format("ERROR: %s NET_DVR_Logout = %d",serverinfo[i].m_csServerIP, NET_DVR_GetLastError());
TRACE(sTemp);
}
}
}
}
NET_DVR_ReleaseG722Decoder(pDecHandle);
NET_DVR_ReleaseG722Encoder(pEncHandle);
CDialog::OnCancel();
}
void CNewclientDlg::ArrayWindow(WORD iPos, WORD iNumber)
{
int i = 0;
CRect crect;
GetClientRect(&crect);
WORD iWidth,iHeight;
NET_DVR_DISPLAY_PARA displaypara;
for (i = 0;i < MAXVIEWNUM;i )
{
myoutput[i].ShowWindow(SW_HIDE);
}
switch (iNumber)
{
case 4:
if (ClientParam.m_bMultiScreen)
{
iWidth = 510;
iHeight = 383;
MYVIEW_LEFT = 0;
MYVIEW_TOP = 0;
}
else
{
MYVIEW_LEFT = 20;
MYVIEW_TOP = 20;
iWidth = 354;
iHeight = 290;
}
bLargeWnd = FALSE;
for (i = 0; i < 2; i )
{
myoutput[i].MoveWindow(MYVIEW_LEFT i*iWidth i*3,MYVIEW_TOP,iWidth,iHeight,true);
myoutput[i].m_display_para.nLeft = MYVIEW_LEFT i*iWidth i*3/*-2*/;
myoutput[i].m_display_para.nTop = MYVIEW_TOP;
myoutput[i].m_display_para.nWidth = iWidth/* 2*/;
myoutput[i].m_display_para.nHeight = iHeight;
myoutput[i].ShowWindow(SW_SHOW);
}
for (i = 2; i < 4; i )
{
myoutput[i].MoveWindow(MYVIEW_LEFT (i-2)*iWidth (i-2)*3,MYVIEW_TOP iHeight 2,iWidth,iHeight,true);
myoutput[i].m_display_para.nLeft = MYVIEW_LEFT (i-2)*iWidth (i-2)*3/*-2*/;
myoutput[i].m_display_para.nTop = MYVIEW_TOP iHeight 2;
myoutput[i].m_display_para.nWidth = iWidth/* 2*/;
myoutput[i].m_display_para.nHeight = iHeight;
myoutput[i].ShowWindow(SW_SHOW);
}
break;
case 9:
if (ClientParam.m_bMultiScreen)
{
iWidth = 339;
iHeight = 254;
MYVIEW_LEFT = 0;
MYVIEW_TOP = 0;
}
else
{
iWidth = 234;
iHeight = 192;
MYVIEW_LEFT = 20;
MYVIEW_TOP = 20;
}
bLargeWnd = FALSE;
for (i=0;i<3;i )
{
myoutput[i].MoveWindow(MYVIEW_LEFT i*iWidth i*3,MYVIEW_TOP,iWidth,iHeight,true);
myoutput[i].m_display_para.nLeft = MYVIEW_LEFT i*iWidth i*3/*-2*/;
myoutput[i].m_display_para.nTop = MYVIEW_TOP;
myoutput[i].m_display_para.nWidth = iWidth/* 2*/;
myoutput[i].m_display_para.nHeight = iHeight;
myoutput[i].ShowWindow(SW_SHOW);
}
for (i=3;i<6;i )
{
myoutput[i].MoveWindow(MYVIEW_LEFT (i-3)*iWidth (i-3)*3,MYVIEW_TOP iHeight 2,iWidth,iHeight,true);
myoutput[i].m_display_para.nLeft = MYVIEW_LEFT (i-3)*iWidth (i-3)*3/*-2*/;
myoutput[i].m_display_para.nTop = MYVIEW_TOP iHeight 2;
myoutput[i].m_display_para.nWidth = iWidth/* 2*/;
myoutput[i].m_display_para.nHeight = iHeight;
myoutput[i].ShowWindow(SW_SHOW);
}
for (i=6;i<9;i )
{
myoutput[i].MoveWindow(MYVIEW_LEFT (i-6)*iWidth (i-6)*3,MYVIEW_TOP 2*iHeight 4,iWidth,iHeight,true);
myoutput[i].m_display_para.nLeft = MYVIEW_LEFT (i-6)*iWidth (i-6)*3/*-2*/;
myoutput[i].m_display_para.nTop = MYVIEW_TOP (iHeight 2)*2;
myoutput[i].m_display_para.nWidth = iWidth/* 2*/;
myoutput[i].m_display_para.nHeight = iHeight;
myoutput[i].ShowWindow(SW_SHOW);
}
break;
case 16:
if (ClientParam.m_bMultiScreen)
{
iWidth = 254;
iHeight = 190;
MYVIEW_LEFT = 0;
MYVIEW_TOP = 0;
}
else
{
MYVIEW_LEFT = 20;
MYVIEW_TOP = 20;
iWidth = 178;//176;
iHeight = 146;//144;
}
bLargeWnd = FALSE;
for (i = 0; i < 4; i )
{
myoutput[i].MoveWindow(MYVIEW_LEFT i*iWidth i*3, MYVIEW_TOP, iWidth, iHeight, true);
myoutput[i].m_display_para.nLeft = MYVIEW_LEFT i*iWidth i*3/*-2*/;
myoutput[i].m_display_para.nTop = MYVIEW_TOP;
myoutput[i].m_display_para.nWidth = iWidth/* 2*/;
myoutput[i].m_display_para.nHeight = iHeight;
myoutput[i].ShowWindow(SW_SHOW);
}
for (i = 4; i < 8; i )
{
myoutput[i].MoveWindow(MYVIEW_LEFT (i-4)*iWidth (i-4)*3, MYVIEW_TOP iHeight 2, iWidth, iHeight, true);
myoutput[i].m_display_para.nLeft = MYVIEW_LEFT (i-4)*iWidth (i-4)*3/*-2*/;
myoutput[i].m_display_para.nTop = MYVIEW_TOP iHeight 2;
myoutput[i].m_display_para.nWidth = iWidth/* 2*/;
myoutput[i].m_display_para.nHeight = iHeight;
myoutput[i].ShowWindow(SW_SHOW);
}
for (i = 8; i < 12; i )
{
myoutput[i].MoveWindow(MYVIEW_LEFT (i-8)*iWidth (i-8)*3, MYVIEW_TOP iHeight*2 4, iWidth, iHeight, true);
myoutput[i].m_display_para.nLeft = MYVIEW_LEFT (i-8)*iWidth (i-8)*3/*-2*/;
myoutput[i].m_display_para.nTop = MYVIEW_TOP (iHeight 2)*2;
myoutput[i].m_display_para.nWidth = iWidth/* 2*/;
myoutput[i].m_display_para.nHeight = iHeight;
myoutput[i].ShowWindow(SW_SHOW);
}
for (i = 12; i < 16; i )
{
myoutput[i].MoveWindow(MYVIEW_LEFT (i-12)*iWidth (i-12)*3, MYVIEW_TOP iHeight*3 6, iWidth, iHeight, true);
myoutput[i].m_display_para.nLeft = MYVIEW_LEFT (i-12)*iWidth (i-12)*3/*-2*/;
myoutput[i].m_display_para.nTop = MYVIEW_TOP (iHeight 2)*3;
myoutput[i].m_display_para.nWidth = iWidth/* 2*/;
myoutput[i].m_display_para.nHeight = iHeight;
myoutput[i].ShowWindow(SW_SHOW);
}
break;
case 1:
// wndsize为TRUE时,表示画面中的某个窗口放大;
// wndsize为FALSE时,表示画面只有一个窗口,也就不需要放大、缩小;
if (ClientParam.m_bMultiScreen)
{
iWidth = 1024;
iHeight = 768;
MYVIEW_LEFT = 0;
MYVIEW_TOP = 0;
}
else
{
MYVIEW_LEFT = 20;
MYVIEW_TOP = 20;
iWidth = 706;
iHeight = 578;
}
myoutput[iPos].MoveWindow(MYVIEW_LEFT,MYVIEW_TOP,iWidth,iHeight,true);
myoutput[iPos].m_display_para.nLeft = MYVIEW_LEFT;
myoutput[iPos].m_display_para.nTop = MYVIEW_TOP;
myoutput[iPos].m_display_para.nWidth = iWidth;
myoutput[iPos].m_display_para.nHeight = iHeight;
myoutput[iPos].ShowWindow(SW_SHOW);
break;
default:
break;
}
if (ClientParam.m_bUseCard)
{
TRACE("Use Decode Card");
TRACE("iNumber = %d", iNumber);
NET_DVR_ClearSurface_Card();
for (i = 0; i < MAXVIEWNUM; i )
{
displaypara.bToScreen = 0;
displaypara.bToVideoOut = 1;
displaypara.nLeft = myoutput[i].m_display_para.nLeft;
displaypara.nTop = myoutput[i].m_display_para.nTop;
displaypara.nWidth = myoutput[i].m_display_para.nWidth;
displaypara.nHeight = myoutput[i].m_display_para.nHeight;
NET_DVR_ResetPara_Card(myoutput[i].m_iPlayhandle,&displaypara);
}
if (iNumber == 1)
{//放大
displaypara.bToScreen = 1;
displaypara.bToVideoOut = 1;
displaypara.nLeft = myoutput[iPos].m_display_para.nLeft;
displaypara.nTop = myoutput[iPos].m_display_para.nTop;
displaypara.nWidth = myoutput[iPos].m_display_para.nWidth;
displaypara.nHeight = myoutput[iPos].m_display_para.nHeight;
NET_DVR_ResetPara_Card(myoutput[iPos].m_iPlayhandle,&displaypara);
}
else
{//缩小
for (i = 0; i < iNumber; i )
{
displaypara.bToScreen = 1;
displaypara.bToVideoOut = 1;
displaypara.nLeft = myoutput[i].m_display_para.nLeft;
displaypara.nTop = myoutput[i].m_display_para.nTop;
displaypara.nWidth = myoutput[i].m_display_para.nWidth;
displaypara.nHeight = myoutput[i].m_display_para.nHeight;
NET_DVR_ResetPara_Card(myoutput[i].m_iPlayhandle,&displaypara);
}
}
}
}
void CNewclientDlg::MoveCurWin(int iWindowNum,int iCurWinPos)
{
CNewclientDlg* mainwnd =(CNewclientDlg*) AfxGetMainWnd();
int rectWidth = 0;
int rectHeight = 0;
int rectTop = 0;
int rectLeft = 0;
switch (iWindowNum)
{
case 1:
rectWidth = 706;
rectHeight = 578;
rectTop = MYVIEW_TOP;
rectLeft = MYVIEW_LEFT;
break;
case 4:
rectWidth = 354;
rectHeight = 290;
switch (iCurWinPos)
{
case 0:
case 1:
rectTop = MYVIEW_TOP;
rectLeft = MYVIEW_LEFT iCurWinPos*rectWidth iCurWinPos*3;
break;
case 2:
case 3:
rectTop = MYVIEW_TOP rectHeight 2;
rectLeft = MYVIEW_LEFT (iCurWinPos-2)*rectWidth (iCurWinPos-2)*3;
break;
default:
break;
}
break;
case 9:
rectWidth = 234;
rectHeight = 192;
switch (iCurWinPos)
{
case 0:
case 1:
case 2:
rectTop = MYVIEW_TOP;
rectLeft = MYVIEW_LEFT iCurWinPos*rectWidth iCurWinPos*3;
break;
case 3:
case 4:
case 5:
rectTop = MYVIEW_TOP rectHeight 2;
rectLeft = MYVIEW_LEFT (iCurWinPos-3)*rectWidth (iCurWinPos-3)*3;
break;
case 6:
case 7:
case 8:
rectTop = MYVIEW_TOP 2*rectHeight 4;
rectLeft = MYVIEW_LEFT (iCurWinPos-6)*rectWidth (iCurWinPos-6)*3;
break;
default:
break;
}
break;
case 16:
rectWidth = 178;
rectHeight = 146;
switch (iCurWinPos)
{
case 0:
case 1:
case 2:
case 3:
rectTop = MYVIEW_TOP;
rectLeft = MYVIEW_LEFT iCurWinPos*rectWidth iCurWinPos*3;
break;
case 4:
case 5:
case 6:
case 7:
rectTop = MYVIEW_TOP rectHeight 2;
rectLeft = MYVIEW_LEFT (iCurWinPos-4)*rectWidth (iCurWinPos-4)*3;
break;
case 8:
case 9:
case 10:
case 11:
rectTop = MYVIEW_TOP 2*rectHeight 4;
rectLeft = MYVIEW_LEFT (iCurWinPos-8)*rectWidth (iCurWinPos-8)*3;
break;
case 12:
case 13:
case 14:
case 15:
rectTop = MYVIEW_TOP 3*rectHeight 6;
rectLeft = MYVIEW_LEFT (iCurWinPos-12)*rectWidth (iCurWinPos-12)*3;
break;
default:
break;
}
break;
default:
break;
}
mycurwin.m_black.ShowWindow(SW_HIDE);
mycurwin.MoveWindow(rectLeft-1,rectTop-1,rectWidth 2,rectHeight 2);
mycurwin.m_black.ShowWindow(SW_SHOW);
mycurwin.EnableWindow(FALSE);
}
void CNewclientDlg::InitLed()
{
int i;
m_pCapLed[0] = &m_CapLed1;
m_pCapLed[1] = &m_CapLed2;
m_pCapLed[2] = &m_CapLed3;
m_pCapLed[3] = &m_CapLed4;
m_pCapLed[4] = &m_CapLed5;
m_pCapLed[5] = &m_CapLed6;
m_pCapLed[6] = &m_CapLed7;
m_pCapLed[7] = &m_CapLed8;
m_pCapLed[8] = &m_CapLed9;
m_pCapLed[9] = &m_CapLed10;
m_pCapLed[10] = &m_CapLed11;
m_pCapLed[11] = &m_CapLed12;
m_pCapLed[12] = &m_CapLed13;
m_pCapLed[13] = &m_CapLed14;
m_pCapLed[14] = &m_CapLed15;
m_pCapLed[15] = &m_CapLed16;
for (i = 0; i < MAXVIEWNUM; i )
{
m_pCapLed[i]->SetLed(CLed::LED_COLOR_RED,CLed::LED_DISABLED,CLed::LED_ROUND);
}
m_pAlarmLed[0] = &m_AlarmLed1;
m_pAlarmLed[1] = &m_AlarmLed2;
m_pAlarmLed[2] = &m_AlarmLed3;
m_pAlarmLed[3] = &m_AlarmLed4;
m_pAlarmLed[4] = &m_AlarmLed5;
m_pAlarmLed[5] = &m_AlarmLed6;
m_pAlarmLed[6] = &m_AlarmLed7;
m_pAlarmLed[7] = &m_AlarmLed8;
m_pAlarmLed[8] = &m_AlarmLed9;
m_pAlarmLed[9] = &m_AlarmLed10;
m_pAlarmLed[10] = &m_AlarmLed11;
m_pAlarmLed[11] = &m_AlarmLed12;
m_pAlarmLed[12] = &m_AlarmLed13;
m_pAlarmLed[13] = &m_AlarmLed14;
m_pAlarmLed[14] = &m_AlarmLed15;
m_pAlarmLed[15] = &m_AlarmLed16;
for (i = 0; i < MAXVIEWNUM; i )
{
m_pAlarmLed[i]->SetLed(CLed::LED_COLOR_RED,CLed::LED_DISABLED,CLed::LED_ROUND);
}
}
void CNewclientDlg::F_InitDecodeCard()
{
int nDispNum = 0;
TRACE("初始化解码卡");
int iRet = NET_DVR_InitDDraw_Card(this->m_hWnd,0xff00ff);
iRet=NET_DVR_InitDevice_Card(&channelcount);
TRACE("ChannelCount = %d", channelcount);
if (channelcount <= 0)
{
AfxMessageBox("请插入解码卡!");
return;
}
else if (channelcount > 16)
{
channelcount = 16;
}
if(ClientParam.m_bNTSC)
{
nDispNum = GetDisplayChannelCount();
if (nDispNum >= 2)
{
REGION_PARAM param[MAX_DISPLAY_REGION];
int i;
memset(param, 0, sizeof(param));
for (i=0; i<MAX_DISPLAY_REGION; i )
param[i].color = RGB(i, i*8, i*16);
for (i=0; i<nDispNum/2; i )
{
SetDisplayStandard(2*i,StandardNTSC);
param[0].left=0; param[0].top=0; param[0].width=320; param[0].height=240;
param[1].left=320; param[1].top=0; param[1].width=320; param[1].height=240;
param[2].left=0; param[2].top=240; param[2].width=320; param[2].height=240;
param[3].left=320; param[3].top=240; param[3].width=320; param[3].height=240;
if (SetDisplayRegion(2*i, 4, param, 0) != HWERR_SUCCESS)
{
TRACE("SetDisplayRegion failed!");
}
SetDecoderVideoExtOutput(4*i, 0, 1, 2*i, 0, 0);
SetDecoderVideoExtOutput(4*i 1, 0, 1, 2*i, 1, 0);
SetDecoderVideoExtOutput(4*i 2, 0, 1, 2*i, 2, 0);
SetDecoderVideoExtOutput(4*i 3, 0, 1, 2*i, 3, 0);
SetDisplayStandard(2*i 1,StandardNTSC);
param[0].left=0; param[0].top=0; param[0].width=704; param[0].height=480;
if (SetDisplayRegion(2*i 1, 1, param, 0) != HWERR_SUCCESS)
{
TRACE("SetDisplayRegion failed!");
}
SetDecoderVideoExtOutput(4*i, 1, 1, 2*i 1, 0, 0);
}
}
}
else
{
nDispNum = GetDisplayChannelCount();
if (nDispNum >= 2)
{
REGION_PARAM param[MAX_DISPLAY_REGION];
int i;
memset(param, 0, sizeof(param));
for (i=0; i<MAX_DISPLAY_REGION; i )
param[i].color = RGB(i, i*8, i*16);
for (i=0; i<nDispNum/2; i )
{
SetDisplayStandard(2*i,StandardPAL);
param[0].left=0; param[0].top=0; param[0].width=352; param[0].height=288;
param[1].left=352; param[1].top=0; param[1].width=352; param[1].height=288;
param[2].left=0; param[2].top=288; param[2].width=352; param[2].height=288;
param[3].left=352; param[3].top=288; param[3].width=352; param[3].height=288;
if (SetDisplayRegion(2*i, 4, param, 0) != HWERR_SUCCESS)
{
TRACE("SetDisplayRegion failed!");
}
SetDecoderVideoExtOutput(4*i, 0, 1, 2*i, 0, 0);
SetDecoderVideoExtOutput(4*i 1, 0, 1, 2*i, 1, 0);
SetDecoderVideoExtOutput(4*i 2, 0, 1, 2*i, 2, 0);
SetDecoderVideoExtOutput(4*i 3, 0, 1, 2*i, 3, 0);
SetDisplayStandard(2*i 1,StandardPAL);
param[0].left=0; param[0].top=0; param[0].width=704; param[0].height=576;
if (SetDisplayRegion(2*i 1, 1, param, 0) != HWERR_SUCCESS)
{
TRACE("SetDisplayRegion failed!");
}
SetDecoderVideoExtOutput(4*i, 1, 1, 2*i 1, 0, 0);
}
}
}
if (channelcount==1)
{
WINDOWNUM=1;
m_windownum.SetCurSel(0);
}
else if (channelcount<=4)
{
WINDOWNUM=4;
m_windownum.SetCurSel(1);
}
else if (channelcount<=9)
{
WINDOWNUM = 9;
m_windownum.SetCurSel(2);
}
else
{
m_windownum.SetCurSel(3);
WINDOWNUM = 16;
}
}
void CNewclientDlg::OnAudioexchange()
{
// TODO: Add your control notification handler code here
if (lVoiceIndex == -1)
{
CVoiceExchange VoiceDlg;
VoiceDlg.DoModal();
if (lVoiceIndex != -1)
{
GetDlgItem(IDC_AUDIOEXCHANGE)->SetWindowText("停止对讲");
}
}
else
{
if (NET_DVR_StopVoiceCom(lVoiceIndex))
{
GetDlgItem(IDC_AUDIOEXCHANGE)->SetWindowText("语音对讲");
lVoiceIndex = -1;
}
else
{
AfxMessageBox("停止语音对讲失败!");
}
}
}
void CNewclientDlg::OnSystemcfg()
{
// TODO: Add your control notification handler code here
CSystemConfig SysCfgDlg;
SysCfgDlg.DoModal();
if (nUseCard == 1)
{
channelcount = 0;
F_InitDecodeCard();
ArrayWindow(0,WINDOWNUM);
MoveCurWin(WINDOWNUM,0);
nUseCard = 0;
}
if (nUseCard == 2)
{
NET_DVR_ReleaseDevice_Card();
NET_DVR_ReleaseDDraw_Card();
nUseCard = 0;
}
if (ClientParam.m_bCheckServerTime)
{
if (checkservertimer == 0)
{
TRACE("启动硬盘录像机校时时钟,校时时间是每天的%06d", ClientParam.m_iCheckServerTime);
checkservertimer = SetTimer(CHECKSERVER_TIMER, 1000, NULL);
}
}
else
{
if (checkservertimer)
{
// TRACE("关闭硬盘录像机校时时钟");
KillTimer(CHECKSERVER_TIMER);
checkservertimer = 0;
}
}
F_JudgeDiskFull();
}
void CNewclientDlg::OnSelchangeCombowndnum()
{
// TODO: Add your control notification handler code here
int i;
WORD wndnum;
i = m_windownum.GetCurSel();
switch (i)
{
case 0:
wndnum = 1;
break;
case 1:
wndnum = 4;
break;
case 2:
wndnum = 9;
break;
case 3:
wndnum = 16;
break;
default:
break;
}
if (WINDOWNUM != wndnum)
{
WINDOWNUM = wndnum;
if (ClientParam.m_bCycling)
{
AfxMessageBox("请停止循环播放!");
return;
}
/* if (ClientParam.m_bPlaying)
{
TRACE("Stop Play");
F_StopPlay();
OnVideonetplay();
}
*/
for (i = 0; i < MAXVIEWNUM; i )
{
if (myoutput[i].m_iPlayhandle != -1)
{
// NET_DVR_RealPlayPause(myoutput[i].m_iPlayhandle);
}
}
ArrayWindow(0, WINDOWNUM);
MoveCurWin(WINDOWNUM,0);
for (i = 0; i < WINDOWNUM; i )
{
if (myoutput[i].m_iPlayhandle != -1)
{
// NET_DVR_RealPlayRestart(myoutput[i].m_iPlayhandle);
}
}
}
}
void CNewclientDlg::F_StopPlay()
{
int i;
if (cycletimer)
{
KillTimer(CYCLE_TIMER);
cycletimer = 0;
}
if (!ClientParam.m_bUseCard)
{
if (!g_bShareSound)
NET_DVR_CloseSound();
}
for (i = 0; i < MAXVIEWNUM; i )
{
if (myoutput[i].m_bFileSave)
F_StopClientRecord(i);
if (g_bShareSound)
NET_DVR_CloseSoundShare(myoutput[i].m_iPlayhandle);
myoutput[i].StopNet();
}
GetDlgItem(IDC_PLAY)->SetWindowText("预览");
numberpos = 0;
if ( (ClientParam.m_bEnlarged) || (ClientParam.m_bFullScreen) )
{
ArrayWindow(0, WINDOWNUM);
MoveCurWin(WINDOWNUM,0);
}
ClientParam.m_bPlaying = FALSE;
ClientParam.m_bCycling = FALSE;
ClientParam.m_bPaused = FALSE;
ClientParam.m_bNextPage = FALSE;
ClientParam.m_bFrontPage = FALSE;
GetDlgItem(IDC_COMBOWNDNUM)->EnableWindow(TRUE);
}
void CNewclientDlg::OnVideonetplay()
{
// TODO: Add your control notification handler code here
int itemp,i;
UpdateData(TRUE);
if (iSurveillanceNumber == 0)
return;
if (ClientParam.m_bPlaying)
{
TRACE("Stop Play");
F_StopPlay();
return;
}
GetDlgItem(IDC_COMBOWNDNUM)->EnableWindow(FALSE);
ClientParam.m_bPlaying = TRUE;
if (iSurveillanceNumber < WINDOWNUM)
itemp = iSurveillanceNumber;
else
itemp = WINDOWNUM;
for (i=0;i<itemp;i )
{
myoutput[i].m_lIndex = i;
nCnt = i;
if (ClientParam.m_bUseCard)
myoutput[i].StartCard(&selipinfo[i]);
else
{
TRACE("start play %s m_lServerId = %d", selipinfo[i].m_csIP, selipinfo[i].m_lServerID);
myoutput[i].StartNet(&selipinfo[i]);
if (g_bShareSound && (myoutput[i].m_iPlayhandle >= 0))
{
ClientParam.m_bPlaySound[i] = TRUE;
}
}
Sleep(100);
}
if (iSurveillanceNumber <= WINDOWNUM)
{
numberpos = iSurveillanceNumber;
}
else
{
numberpos = WINDOWNUM;
if (ClientParam.m_bCyclePlay) //循环播放
{
if (cycletimer == 0)
{
cycletimer = SetTimer(CYCLE_TIMER,ClientParam.m_iCycleTime*1000,NULL);
}
ClientParam.m_bCycling = TRUE;
m_bChangePage = TRUE;
ClientParam.m_bPaused = FALSE;
}
else
{
ClientParam.m_bNextPage = TRUE;
ClientParam.m_bFrontPage = FALSE;
}
}
// m_windownum.EnableWindow(FALSE);
GetDlgItem(IDC_PLAY)->SetWindowText("停止");
UpdateData(FALSE);
}
void CNewclientDlg::F_FullScreen()
{
GetWindowPlacement(&m_OldWndPlacement);
CRect WindowRect, ClientRect, FullScreenRect;
int FullWidth, FullHeight;
GetWindowRect(&WindowRect);
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
ClientToScreen(&ClientRect);
//获取屏幕的分辨率;
FullWidth = GetSystemMetrics(SM_CXSCREEN);
FullHeight = GetSystemMetrics(SM_CYSCREEN);
//将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区位置间的差值, 就得到全屏显示的窗口位置;
FullScreenRect.left = WindowRect.left-ClientRect.left;
FullScreenRect.top = WindowRect.top-ClientRect.top;
FullScreenRect.right = WindowRect.right-ClientRect.right FullWidth;
FullScreenRect.bottom = WindowRect.bottom-ClientRect.bottom FullHeight;
//进入全屏显示状态 ;
WINDOWPLACEMENT wndpl;
wndpl.length = sizeof(WINDOWPLACEMENT);
wndpl.flags = 0;
wndpl.showCmd = SW_SHOWNORMAL;
wndpl.rcNormalPosition = FullScreenRect;
SetWindowPlacement(&wndpl);
for (int i = 0; i < WINDOWNUM; i )
myoutput[i].ShowWindow(SW_HIDE);
F_ShowHide(FALSE);
mycurwin.ShowWindow(SW_HIDE);
i = iActiveWndNumber;
if (ClientParam.m_bUseCard)
{
NET_DVR_DISPLAY_PARA displaypara;
displaypara.bToVideoOut = 1;
displaypara.bToScreen = 1;
displaypara.nLeft = 0;
displaypara.nTop = 0;
displaypara.nWidth = 1024;
displaypara.nHeight = 768;
NET_DVR_ResetPara_Card(myoutput[i].m_iPlayhandle,&displaypara);
}
}
void CNewclientDlg::F_EndFullScreen()
{
SetWindowPlacement(&m_OldWndPlacement);
F_ShowHide(TRUE);
mycurwin.ShowWindow(SW_SHOW);
}
void CNewclientDlg::F_ShowHide(BOOL bShow)
{
if (bShow)
{
//云台
GetDlgItem(IDC_BUTTONUP)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_BUTTONLEFT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_BUTTONRIGHT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_BUTTONDOWN)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_BUTTONTJLEFT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_BUTTONTJRIGHT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_BUTTONJJLEFT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_BUTTONJJRIGHT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_BUTTONGQLEFT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_BUTTONGQRIGHT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_YZD)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_BUTTONYZW)->ShowWindow(SW_SHOW);
//预览
GetDlgItem(IDC_PLAY)->ShowWindow(SW_SHOW);
//系统设置
GetDlgItem(IDC_SYSTEMCFG)->ShowWindow(SW_SHOW);
//抓图
GetDlgItem(IDC_GETPICTURE)->ShowWindow(SW_SHOW);
//录像
GetDlgItem(IDC_RECORD)->ShowWindow(SW_SHOW);
//时间日志
GetDlgItem(IDC_EVENTLIST)->ShowWindow(SW_SHOW);
//布防,撤防
GetDlgItem(IDC_BUTTONALARMSET)->ShowWindow(SW_SHOW);
//语音对讲
GetDlgItem(IDC_AUDIOEXCHANGE)->ShowWindow(SW_SHOW);
//回放
GetDlgItem(IDC_VIDEOFILEPLAY)->ShowWindow(SW_SHOW);
//亮度
GetDlgItem(IDC_SLIDERLD)->ShowWindow(SW_SHOW);
//对比度
GetDlgItem(IDC_SLIDERDBD)->ShowWindow(SW_SHOW);
//饱和度
GetDlgItem(IDC_SLIDERBHD)->ShowWindow(SW_SHOW);
//色度
GetDlgItem(IDC_SLIDERSD)->ShowWindow(SW_SHOW);
//音量
GetDlgItem(IDC_SLIDERYL)->ShowWindow(SW_SHOW);
//恢复默认值
GetDlgItem(IDC_BUTTONPOLL)->ShowWindow(SW_SHOW);
//退出系统
GetDlgItem(IDC_EXIT)->ShowWindow(SW_SHOW);
//窗口画面数
GetDlgItem(IDC_COMBOWNDNUM)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED1)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED2)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED3)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED4)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED5)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED6)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED7)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED8)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED9)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED10)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED11)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED12)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED13)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED14)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED15)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LED16)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED1)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED2)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED3)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED4)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED5)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED6)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED7)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED8)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED9)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED10)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED11)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED12)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED13)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED14)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED15)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_ALARMLED16)->ShowWindow(SW_SHOW);
//2006-01-11
GetDlgItem(IDC_STATIC0)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC2)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC3)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC4)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC5)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC6)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC7)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC8)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC9)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC10)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC11)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC12)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC13)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC14)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC15)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC16)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC17)->ShowWindow(SW_SHOW);
}
else
{
//云台
GetDlgItem(IDC_BUTTONUP)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUTTONLEFT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUTTONRIGHT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUTTONDOWN)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUTTONTJLEFT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUTTONTJRIGHT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUTTONJJLEFT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUTTONJJRIGHT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUTTONGQLEFT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUTTONGQRIGHT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_YZD)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUTTONYZW)->ShowWindow(SW_HIDE);
//预览
GetDlgItem(IDC_PLAY)->ShowWindow(SW_HIDE);
//系统设置
GetDlgItem(IDC_SYSTEMCFG)->ShowWindow(SW_HIDE);
//抓图
GetDlgItem(IDC_GETPICTURE)->ShowWindow(SW_HIDE);
//录像
GetDlgItem(IDC_RECORD)->ShowWindow(SW_HIDE);
//时间日志
GetDlgItem(IDC_EVENTLIST)->ShowWindow(SW_HIDE);
//布防,撤防
GetDlgItem(IDC_BUTTONALARMSET)->ShowWindow(SW_HIDE);
//语音对讲
GetDlgItem(IDC_AUDIOEXCHANGE)->ShowWindow(SW_HIDE);
//回放
GetDlgItem(IDC_VIDEOFILEPLAY)->ShowWindow(SW_HIDE);
//亮度
GetDlgItem(IDC_SLIDERLD)->ShowWindow(SW_HIDE);
//对比度
GetDlgItem(IDC_SLIDERDBD)->ShowWindow(SW_HIDE);
//饱和度
GetDlgItem(IDC_SLIDERBHD)->ShowWindow(SW_HIDE);
//色度
GetDlgItem(IDC_SLIDERSD)->ShowWindow(SW_HIDE);
//音量
GetDlgItem(IDC_SLIDERYL)->ShowWindow(SW_HIDE);
//恢复默认值
GetDlgItem(IDC_BUTTONPOLL)->ShowWindow(SW_HIDE);
//退出系统
GetDlgItem(IDC_EXIT)->ShowWindow(SW_HIDE);
//窗口画面数
GetDlgItem(IDC_COMBOWNDNUM)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED1)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED2)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED3)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED4)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED5)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED6)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED7)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED8)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED9)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED10)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED11)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED12)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED13)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED14)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED15)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LED16)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED1)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED2)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED3)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED4)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED5)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED6)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED7)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED8)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED9)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED10)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED11)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED12)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED13)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED14)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED15)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_ALARMLED16)->ShowWindow(SW_HIDE);
//2006-01-11
GetDlgItem(IDC_STATIC0)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC2)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC3)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC4)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC5)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC6)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC7)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC8)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC9)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC10)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC11)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC12)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC13)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC14)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC15)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC16)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC17)->ShowWindow(SW_HIDE);
}
}
void CNewclientDlg::F_ShowVideoParams()
{
m_ld.SetPos(ClientParam.m_VideoInfo[iActiveWndNumber].m_iBrightness);
m_sd.SetPos(ClientParam.m_VideoInfo[iActiveWndNumber].m_iHue);
m_bhd.SetPos(ClientParam.m_VideoInfo[iActiveWndNumber].m_iSaturation);
m_dbd.SetPos(ClientParam.m_VideoInfo[iActiveWndNumber].m_iContrast);
m_yl.SetPos(ClientParam.m_Volume);
}
void CNewclientDlg::F_NextPage()
{
int itemp,i;
itemp = numberpos % WINDOWNUM;
if ((itemp > 0) || (numberpos == iSurveillanceNumber))//只有当numberpos是WINDOWNUM的整数倍时才有可能按next
return;
for (i = 0; i < MAXVIEWNUM; i )
{
if ( (myoutput[i].m_iPlayhandle >= 0) || (myoutput[i].m_bFileSave) )
F_StopClientRecord(i);
}
if ( (ClientParam.m_bEnlarged) || (ClientParam.m_bFullScreen) )
{
ArrayWindow(0, WINDOWNUM); //窗口放大状态时,循环到下一画面,恢复原窗口数;
MoveCurWin(WINDOWNUM,0);
ClientParam.m_bEnlarged = FALSE;
ClientParam.m_bFullScreen = FALSE;
}
itemp = iSurveillanceNumber - numberpos;
if (itemp > WINDOWNUM)
itemp = WINDOWNUM;
if (!ClientParam.m_bUseCard)
{
if (!g_bShareSound)
NET_DVR_CloseSound();
}
for (i=0;i<WINDOWNUM;i )
{
if (g_bShareSound)
NET_DVR_CloseSoundShare(myoutput[i].m_iPlayhandle);
myoutput[i].StopNet();
}
for (i=0;i<itemp;i )
{
if (i numberpos < MAXNUMBER)
{
myoutput[i].m_lIndex = i;
if (ClientParam.m_bUseCard)
myoutput[i].StartCard(&selipinfo[i numberpos]);
else
{
myoutput[i].StartNet(&selipinfo[i numberpos]);
if (g_bShareSound && (myoutput[i].m_iPlayhandle >= 0))
{
ClientParam.m_bPlaySound[i] = TRUE;
}
}
Sleep(100);
}
}
itemp = iSurveillanceNumber - numberpos;
if (itemp <= WINDOWNUM)
{
numberpos = iSurveillanceNumber;
ClientParam.m_bNextPage = FALSE;
}
else
{
numberpos = WINDOWNUM;
}
ClientParam.m_bFrontPage = TRUE;
UpdateData(FALSE);
}
void CNewclientDlg::F_FrontPage()
{
int itemp,i;
if (numberpos <= WINDOWNUM)
return;
for (i = 0; i < MAXVIEWNUM; i )
{
if ( (myoutput[i].m_iPlayhandle >= 0) || (myoutput[i].m_bFileSave) )
F_StopClientRecord(i);
}
if ( (ClientParam.m_bEnlarged) || (ClientParam.m_bFullScreen) )
{
ArrayWindow(0, WINDOWNUM); //窗口放大状态时,循环到下一画面,恢复原窗口数;
MoveCurWin(WINDOWNUM,0);
ClientParam.m_bEnlarged = FALSE;
ClientParam.m_bFullScreen = FALSE;
}
if (numberpos > WINDOWNUM)
{
if (numberpos < 2*WINDOWNUM)
{
itemp = 0;
}
else
{
i = numberpos % WINDOWNUM;
if (i == 0)
itemp = numberpos - 2*WINDOWNUM ;
else
itemp = numberpos - WINDOWNUM -i;
}
if (!ClientParam.m_bUseCard)
{
if (!g_bShareSound)
NET_DVR_CloseSound();
}
//itemp:确定上一页要播放监控点的起始编号;
for (i=0;i<WINDOWNUM;i )
{
if (g_bShareSound)
NET_DVR_CloseSoundShare(myoutput[i].m_iPlayhandle);
myoutput[i].StopNet();
}
for (i=0;i<WINDOWNUM;i )
{
if (itemp i < MAXNUMBER)
{
myoutput[i].m_lIndex = i;
if (ClientParam.m_bUseCard)
myoutput[i].StartCard(&selipinfo[i itemp]);
else
{
myoutput[i].StartNet(&selipinfo[i itemp]);
if (g_bShareSound && (myoutput[i].m_iPlayhandle >= 0))
{
ClientParam.m_bPlaySound[i] = TRUE;
}
}
Sleep(100);
}
}
if (numberpos <= 2*WINDOWNUM)
{
numberpos = WINDOWNUM;
ClientParam.m_bFrontPage = FALSE; //没有上一页
}
else
{
i = numberpos % WINDOWNUM;
if (i == 0)
numberpos -= WINDOWNUM;
else
numberpos -= i;
}
}
ClientParam.m_bNextPage = TRUE;
UpdateData(FALSE);
}
void CNewclientDlg::F_CyclePause()
{
if (!ClientParam.m_bPaused)
{
ClientParam.m_bPaused = TRUE;
if (cycletimer)
{
KillTimer(CYCLE_TIMER);
cycletimer = 0;
}
}
else
{
m_bChangePage = TRUE;
F_CyclePlay();
if (cycletimer == 0)
cycletimer = SetTimer(CYCLE_TIMER,ClientParam.m_iCycleTime*1000,NULL);
ClientParam.m_bPaused = FALSE;
}
}
void CNewclientDlg::F_CyclePlay()
{
int itemp,i,j;
TRACE("F_CyclePlay");
if (iSurveillanceNumber <= WINDOWNUM)
return;
m_bChangePage = FALSE;
if ( (ClientParam.m_bEnlarged) || (ClientParam.m_bFullScreen) )
{
if (ClientParam.m_bFullScreen)
{
F_EndFullScreen();
}
ArrayWindow(0, WINDOWNUM); //窗口放大状态时,循环到下一画面,恢复原窗口数;
MoveCurWin(WINDOWNUM,0);
ClientParam.m_bEnlarged = FALSE;
ClientParam.m_bFullScreen = FALSE;
}
if (iSurveillanceNumber == numberpos) //循环已到了最后一页,又开始第一页;
itemp = WINDOWNUM;
else
{
itemp = iSurveillanceNumber - numberpos;
if (itemp > WINDOWNUM)
itemp = WINDOWNUM;
}
if (iSurveillanceNumber == numberpos)
j = 0;
else
j = numberpos;
if (!ClientParam.m_bUseCard)
{
if (!g_bShareSound)
NET_DVR_CloseSound();
}
//如果一个循环结束,可能不是从9->9,或许是9->i,所以需要对对(9-i)做ClientStop
//循环到最后一个画面,要播放的窗口数可能小于WINDOWNUM,所以在播放最后一个画面时,关闭多余的播放窗口;
for (i=0;i<WINDOWNUM;i )
{
// TRACE("cycle stopplay %d", myoutput[i].m_iPlayhandle);
if (g_bShareSound)
NET_DVR_CloseSoundShare(myoutput[i].m_iPlayhandle);
myoutput[i].StopNet();
// TRACE("StopNet");
}
for (i=0;i<itemp;i )
{
if (i j < MAXNUMBER)
{
// TRACE("play sel = %d", i j);
myoutput[i].m_lIndex = i;
if (ClientParam.m_bUseCard)
myoutput[i].StartCard(&selipinfo[i j]);
else
{
myoutput[i].StartNet(&selipinfo[i j]);
if (g_bShareSound && (myoutput[i].m_iPlayhandle >= 0))
{
ClientParam.m_bPlaySound[i] = TRUE;
}
}
Sleep(100);
// TRACE("cycle startplay %d", myoutput[i].m_iPlayhandle);
}
}
// MyInvalidate();
itemp = iSurveillanceNumber - numberpos;
if (itemp ==0)
{
numberpos = WINDOWNUM;
}
else if (itemp <= WINDOWNUM)
{
numberpos = iSurveillanceNumber;
}
else
{
numberpos = WINDOWNUM;
}
m_bChangePage = TRUE;
UpdateData(FALSE);
}
void CNewclientDlg::OnGetpicture()
{
// TODO: Add your control notification handler code here
int i;
char cFilename[256];
CString sTemp;
i = iActiveWndNumber;
CTime time = CTime::GetCurrentTime();
if (myoutput[i].m_iPlayhandle >= 0)
{
sTemp.Format("%s\\", ClientParam.m_csPictureSavePath);
if (GetFileAttributes(sTemp) != FILE_ATTRIBUTE_DIRECTORY)
{
CreateDirectory(sTemp, NULL);
}
sprintf(cFilename, "%s\\Picture_%s_%02d_%4d%02d%02d_%02d%02d%02d_%d.bmp", ClientParam.m_csPictureSavePath, myoutput[i].m_csIP, myoutput[i].m_iChannel, \
time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond(), GetTickCount());
TRACE("Picture save file name : %s", cFilename);
if (ClientParam.m_bUseCard)
{
//2005-12-08 add
if(NET_DVR_CapturePicture_Card(myoutput[i].m_iPlayhandle, cFilename))
{
CString sTemp;
sTemp.Format("Capture picture succeed %s!",cFilename);
AfxMessageBox(sTemp);
return;
}
else
{
AfxMessageBox("Failed to capture picture!");
}
}
else
{
if (NET_DVR_CapturePicture(myoutput[i].m_iPlayhandle, cFilename))
{
CString sTemp;
sTemp.Format("抓图成功 %s!",cFilename);
AfxMessageBox(sTemp);
return;
}
else
{
AfxMessageBox("抓图失败!");
}
}
}
}
void CNewclientDlg::OnRecord()
{
// TODO: Add your control notification handler code here
int i;
if (ClientParam.m_bAutoRecord)
return;
i = iActiveWndNumber;
if ( (myoutput[i].m_iPlayhandle >= 0) && (!myoutput[i].m_bFileSave) )
{
//AfxMessageBox("111");
if (F_MakeDir())
F_StartClientRecord(i);
}
else if (myoutput[i].m_bFileSave)
F_StopClientRecord(i);
}
BOOL CNewclientDlg::F_MakeDir()
{
CString sTemp;
DWORD dirattr;
CTime time;
time = CTime::GetCurrentTime();
sTemp.Format("%c:\\mpeg4record\\", m_cCurrentRecordDriver);
dirattr = GetFileAttributes(sTemp);
if (dirattr == FILE_ATTRIBUTE_DIRECTORY)
{
sTemp.Format("%c:\\mpeg4record\\%4d-%02d-%02d\\", m_cCurrentRecordDriver, time.GetYear(), time.GetMonth(), time.GetDay());
dirattr=GetFileAttributes(sTemp);
if (dirattr == FILE_ATTRIBUTE_DIRECTORY)
{
ClientParam.m_csClientRecordPath.Format("%s",sTemp);
TRACE("已经创建了目录%s", sTemp);
return TRUE;
}
else
{
if (!CreateDirectory(sTemp, NULL))
{
AfxMessageBox("创建年月日目录失败!");
return FALSE;
}
else
{
ClientParam.m_csClientRecordPath.Format("%s",sTemp);
TRACE("在已有的目录%c:\\mpeg4record下创建子目录%4d-%02d-%02d", m_cCurrentRecordDriver, time.GetYear(), time.GetMonth(), time.GetDay());
return TRUE;
}
}
}
if (!CreateDirectory(sTemp, NULL))
{
TRACE("创建mpeg4record目录失败!");
return FALSE;
}
sTemp.Format("%c:\\mpeg4record\\%4d-%02d-%02d\\",m_cCurrentRecordDriver, time.GetYear(), time.GetMonth(), time.GetDay());
if (!CreateDirectory(sTemp, NULL))
{
return FALSE;
}
ClientParam.m_csClientRecordPath.Format("%s",sTemp);
TRACE("先创建%c:\\mpeg4record目录,再创建子目录%4d-%02d-%02d", m_cCurrentRecordDriver, time.GetYear(), time.GetMonth(), time.GetDay());
return TRUE;
}
void CNewclientDlg::F_StartClientRecord(int iRecordWndIndex)
{
int i;
char cFilename[256];
i = iRecordWndIndex;
TRACE("Start myoutput[%d] Client Record", i);
CTime time = CTime::GetCurrentTime();
sprintf(cFilename, "%s%s_%02d_%4d%02d%02d_%02d%02d%02d.mp4", ClientParam.m_csClientRecordPath, myoutput[i].m_csIP, myoutput[i].m_iChannel, \
time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond() );
if (!NET_DVR_SaveRealData(myoutput[i].m_iPlayhandle, cFilename))
{
AfxMessageBox("录像失败!");
return;
}
TRACE("Client Record Filename = %s", cFilename);
myoutput[i].m_lChangeFileNameTime = time.GetTime() ClientParam.m_iRecordFileInterval * 60;
myoutput[i].m_bFileSave = TRUE;
m_pCapLed[i]->SetLed(CLed::LED_COLOR_RED,CLed::LED_ON,CLed::LED_ROUND);
}
void CNewclientDlg::F_StopClientRecord(int iRecordWndIndex)
{
int i;
i = iRecordWndIndex;
TRACE("Stop myoutput[%d] Client Record", i);
NET_DVR_StopSaveRealData(myoutput[i].m_iPlayhandle);
myoutput[i].m_bFileSave = FALSE;
m_pCapLed[i]->SetLed(CLed::LED_COLOR_RED,CLed::LED_DISABLED,CLed::LED_ROUND);
}
/*
void CNewclientDlg::OnHide()
{
// TODO: Add your control notification handler code here
ShowWindow(SW_MINIMIZE);
}
*/
void CNewclientDlg::OnEventlist()
{
// TODO: Add your control notification handler code here
int i;
CEventLog EventLogDlg;
EventLogDlg.DoModal();
SetEvent(hVideoBeeper);
for (i = 0; i < MAXVIEWNUM; i )
{
if (ClientParam.m_iAlarmHandle[i] >= 0)
{
m_pAlarmLed[i]->SetLed(CLed::LED_COLOR_GREEN,CLed::LED_ON,CLed::LED_ROUND);
}
else
m_pAlarmLed[i]->SetLed(CLed::LED_COLOR_RED,CLed::LED_DISABLED,CLed::LED_ROUND);
}
for (i = 0; i < MAXALARMIN; i )
{
alarminfo[i].m_csIP.Format(_T(""));
alarminfo[i].m_csUsername.Format(_T(""));
alarminfo[i].m_csPassword.Format(_T(""));
alarminfo[i].m_iChannel = -1;
alarminfo[i].m_iAlarmLevel = -1;
alarminfo[i].m_iAlarmType = -1;
alarminfo[i].m_iPortIndex = -1;
alarminfo[i].m_wServerPort = 8000;
}
m_iAlarmNumber = 0;
}
void CNewclientDlg::OnButtonalarmset()
{
// TODO: Add your control notification handler code here
int i;
CSetAlarm SetAlarmDlg;
SetAlarmDlg.DoModal();
if (SetAlarmDlg.m_bOK)
{
for (i = 0; i < MAXVIEWNUM; i )
{
if (ClientParam.m_iAlarmHandle[i] >= 0)
{
m_pAlarmLed[i]->SetLed(CLed::LED_COLOR_GREEN,CLed::LED_ON,CLed::LED_ROUND);
}
else
{
m_pAlarmLed[i]->SetLed(CLed::LED_COLOR_RED,CLed::LED_DISABLED,CLed::LED_ROUND);
}
}
}
}
void CNewclientDlg::OnVideofileplay()
{
// TODO: Add your control notification handler code here
CPlayBack PlayBackDlg;
PlayBackDlg.DoModal();
}
BOOL CNewclientDlg::F_JudgeDiskFull()
{
int i;
ULARGE_INTEGER FreeSpace,CallerSpace,TotalSpace;
CString csRootPath;
for (i = ClientParam.m_iStartRecordDriver; i < ClientParam.m_iEndRecordDriver 1; i )
{
csRootPath.Format("%c%s",m_cHardDriver[i],":\\"); //从录像起始驱动器开始
GetDiskFreeSpaceEx(csRootPath,&CallerSpace,&TotalSpace,&FreeSpace);
if (CallerSpace.QuadPart > MINSPACE)
{
m_cCurrentRecordDriver = m_cHardDriver[i];
// TRACE("m_cCurrentRecordDriver = %c:\\", m_cCurrentRecordDriver);
ClientParam.m_bAllDiskFull = FALSE;
return TRUE;
}
}
ClientParam.m_bAllDiskFull = TRUE;
return FALSE;
}
void CNewclientDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
// time_t lCurrentTime;
CString csRootPath;
CString csTemp;
int i,j;
CTime time1 = CTime::GetCurrentTime();
int iWeekday = time1.GetDayOfWeek() - 1;
WORD iNowTime = time1.GetHour() * 100 time1.GetMinute();
NET_DVR_TIME CurTime;
CurTime.dwYear = time1.GetYear();
CurTime.dwMonth = time1.GetMonth();
CurTime.dwDay = time1.GetDay();
CurTime.dwHour = time1.GetHour();
CurTime.dwMinute = time1.GetMinute();
CurTime.dwSecond = time1.GetSecond();
i = j = 0;
switch (nIDEvent)
{
case CYCLE_TIMER:
if (m_bChangePage)
F_CyclePlay();
break;
case FREESPACE_TIMER:
csRootPath.Format("%c:\\", m_cCurrentRecordDriver);
ULARGE_INTEGER FreeSpace,CallerSpace,TotalSpace;
GetDiskFreeSpaceEx(csRootPath,&CallerSpace,&TotalSpace,&FreeSpace);
ClientParam.m_bAllDiskFull = FALSE;
if (CallerSpace.QuadPart < MINSPACE)
{
csTemp.Format("%4d-%02d-%02d %02d:%02d:%02d 硬盘驱动器%c已满", CurTime.dwYear, CurTime.dwMonth, CurTime.dwDay, CurTime.dwHour, CurTime.dwMinute, CurTime.dwSecond, m_cCurrentRecordDriver);
TRACE(csTemp);
//AfxMessageBox(csTemp);
if (!F_JudgeDiskFull()) //所有硬盘都满,删除8个最早的录像文件
{
if (ClientParam.m_bCycleRecord)
F_DeleteClientRecordFile();
else
{
for (i = 0; i < MAXVIEWNUM; i )
{
if ( (myoutput[i].m_iPlayhandle >= 0) && (myoutput[i].m_bFileSave) )
F_StopClientRecord(i);
}
AfxMessageBox("客户端录像硬盘驱动器已满,无法继续录像!");
return;
}
}
else
{ //其他分区还有空间,存放到其他分区
//AfxMessageBox("222");
if (F_MakeDir())
{
TRACE("客户端录像文件存放到%c分区", m_cCurrentRecordDriver);
for (i = 0; i < MAXVIEWNUM; i )
{
if ( (myoutput[i].m_iPlayhandle >= 0) && (myoutput[i].m_bFileSave) )
F_ChangeRecordFileName(i);
}
}
}
}
break;
case FILEINTERVAL_TIMER:
#if 0
char csServerIP[16];
char cUserName[100];
char cPassword[100];
LONG lUserID;
NET_DVR_COMPRESSIONCFG m_compressioncfg;
NET_DVR_RECORD m_record;
NET_DVR_PICCFG m_piccfg;
NET_DVR_DEVICEINFO DeviceInfo;
strcpy(csServerIP, serverinfo[i].m_csServerIP);
strncpy(cUserName, serverinfo[i].m_csServerAdminName, MAX_NAMELEN);
strncpy(cPassword, serverinfo[i].m_csServerAdminPasswd, PASSWD_LEN);
lUserID = NET_DVR_Login(csServerIP, serverinfo[i].m_wServerPort, cUserName, cPassword, &DeviceInfo);
if (lUserID < 0)
{
CString sTemp;
int nErr = NET_DVR_GetLastError();
if (nErr == NET_DVR_PASSWORD_ERROR)
{
sTemp.Format("!!!!!!!!!!%s 用户名密码错误! ", csServerIP);
TRACE(sTemp);
//AfxMessageBox(sTemp);
}
else
{
sTemp.Format("!!!!!!!!!!%s 由于网络原因或DVR忙, 注册失败, nErr[%d]! ", csServerIP, nErr);
TRACE(sTemp);
//AfxMessageBox(sTemp);
}
}
DWORD dwReturned;
if (!NET_DVR_GetDVRConfig(serverinfo[i].m_lServerID, NET_DVR_GET_PICCFG, 1,&m_piccfg, sizeof(NET_DVR_PICCFG), &dwReturned))
{
CString sTemp;
sTemp.Format("%d : NET_DVR_GET_PICCFG = %d \n", 1, NET_DVR_GetLastError());
TRACE(sTemp);
}
if (!NET_DVR_GetDVRConfig(serverinfo[i].m_lServerID,NET_DVR_GET_COMPRESSCFG, 1,&m_compressioncfg, sizeof(NET_DVR_COMPRESSIONCFG), &dwReturned))
{
CString sTemp;
sTemp.Format("%d : ERROR: NET_DVR_GET_COMPRESSCFG = %d \n", 1, NET_DVR_GetLastError());
TRACE(sTemp);
}
if (!NET_DVR_GetDVRConfig(serverinfo[i].m_lServerID,NET_DVR_GET_RECORDCFG, 1,&m_record, sizeof(NET_DVR_RECORD), &dwReturned))
{
CString sTemp;
sTemp.Format("%d : ERROR: NET_DVR_GET_RECORDCFG = %d \n", 1, NET_DVR_GetLastError());
TRACE(sTemp);
}
if (lUserID >= 0)
{
if(!NET_DVR_Logout(lUserID))
TRACE("%s[ID: %d] 注销失败! ", csServerIP, lUserID);
}
#endif
//////////////////////
/* NET_DVR_ALARMOUTSTATUS AlarmOutState;
if (NET_DVR_GetAlarmOut(serverinfo[0].m_lServerID,&AlarmOutState))
{
TRACE("AlarmOut [%d][%d][%d][%d]", AlarmOutState.Output[0], AlarmOutState.Output[1], AlarmOutState.Output[2], AlarmOutState.Output[3]);
if (AlarmOutState.Output[0] == 0)
;
//NET_DVR_SetAlarmOut(serverinfo[0].m_lServerID, 0, 1);
}
*/
//////////////////////
for (i = 0; i < MAXVIEWNUM; i )
{
if ( (myoutput[i].m_iPlayhandle >= 0) && (myoutput[i].m_bFileSave) )
{
if (time1.GetTime() - myoutput[i].m_lChangeFileNameTime >= 0)
{
TRACE("更改客户端录象文件名时间到");
if (F_MakeDir())
F_ChangeRecordFileName(i);
}
}
}
break;
case AUTORECORD_TIMER:
if (ClientParam.m_bCycling)
return; //循环播放客户端不允许录像
if (!ClientParam.m_bAutoRecord)
return;
for (i = 0; i < 4; i )
{
if ( (iNowTime >= ClientParam.m_ClientRecordTime[iWeekday][i].m_iStartTime) &&
(iNowTime < ClientParam.m_ClientRecordTime[iWeekday][i].m_iStopTime) )
{ //自动录像时间到
for (j = 0; j < MAXVIEWNUM; j )
{
if (myoutput[j].m_iPlayhandle >= 0)
{
if (!myoutput[j].m_bFileSave)
{
if (ClientParam.m_bAllDiskFull)
{
TRACE("自动录像时间到,但硬盘满暂不录像");
return; //如果客户端硬盘满就不录像
}
//AfxMessageBox("444");
if (F_MakeDir())
{
TRACE("%02d:%02d myoutput[%d]开始自动录像", CurTime.dwHour, CurTime.dwMinute, j);
F_StartClientRecord(j);
}
}
}
}
break;
}
else
i ;
}
if (i == 4)
{
for (j = 0; j < MAXVIEWNUM; j )
{
if (myoutput[j].m_bFileSave)
{
TRACE("%02d:%02d 停止自动录像的时间到,停止myoutput[%d]自动录像", CurTime.dwHour, CurTime.dwMinute, j);
F_StopClientRecord(j);
}
}
}
break;
case CHECKSERVER_TIMER:
if (ClientParam.m_iCheckServerTime == (LONG)(CurTime.dwHour*10000 CurTime.dwMinute*100 CurTime.dwSecond) )
{
for (i = 0; i < MAXIPNUMBER; i )
{
if (serverinfo[i].m_csServerName != "")
{
if (NET_DVR_SetDVRConfig(serverinfo[i].m_lServerID, NET_DVR_SET_TIMECFG,0,&CurTime, sizeof(NET_DVR_TIME)))
{
TRACE("%4d年%02d月%02d日%02d时%02d分%02d秒进行硬盘录像机校时成功.", CurTime.dwYear, CurTime.dwMonth, CurTime.dwDay, CurTime.dwHour, CurTime.dwMinute, CurTime.dwSecond);
}
else
{
TRACE("%4d年%02d月%02d日%02d时%02d分%02d秒进行硬盘录像机校时失败.", CurTime.dwYear, CurTime.dwMonth, CurTime.dwDay, CurTime.dwHour, CurTime.dwMinute, CurTime.dwSecond);
}
}
}
}
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
void CNewclientDlg::F_DeleteClientRecordFile()
{
CFileFind fdfile,fdfilemp4;
BOOL bFinded,bfilefind;
CString sDeleteDir,sTempDelete;
CString sDir;
CString sDate;
CString sFileName;
CTime time,temptime;
int i,deletenum = 0;
sDeleteDir.Format("0000-00-00");
sTempDelete.Format("3000-00-00");
time=CTime::GetCurrentTime();
for (i = ClientParam.m_iStartRecordDriver; i < (ClientParam.m_iEndRecordDriver 1); i )
{
sDir.Format("%c:\\mpeg4record\\*.*",m_cHardDriver[i]);
bFinded=fdfile.FindFile(sDir);
while (bFinded)
{
bFinded=fdfile.FindNextFile();
if (fdfile.IsDots())
{
continue;
}
if (fdfile.IsDirectory())
{
if (fdfile.GetFileName()==_T("download"))
{
continue;
}
if (fdfile.GetFileName()==_T("alarm"))
{
continue;
}
sFileName.Format("%c:\\mpeg4record\\%s\\*.mp4",m_cHardDriver[i],fdfile.GetFileName());
bfilefind=fdfilemp4.FindFile(sFileName);
if (!bfilefind)
{
RemoveDirectory(fdfile.GetFilePath());
TRACE("删除目录:%s",fdfile.GetFilePath());
}
while (bfilefind)
{
bfilefind=fdfilemp4.FindNextFile();
if (fdfile.IsDots())
{
continue;
}
fdfilemp4.GetCreationTime(temptime);
if (temptime<time)
{
time=temptime;
sTempDelete.Format("%s",fdfilemp4.GetFilePath());
}
}
}
}
}
sFileName.Format("%s",sTempDelete);
if (!DeleteFile(sFileName))
{
sTempDelete.Format("删除文件%s失败",sFileName);
F_AddEvent(sTempDelete);
for (i = 0; i < MAXVIEWNUM; i )
{
if ( (myoutput[i].m_iPlayhandle >= 0) || (myoutput[i].m_bFileSave) )
F_StopClientRecord(i);
}
AfxMessageBox("硬盘容量不足,自动删除文件失败,请清理硬盘后重新开始录像!");
}
else
{
sTempDelete.Format("删除文件%s成功",sFileName);
TRACE("删除文件%s",sFileName);
deletenum ;
}
}
void CNewclientDlg::F_ChangeRecordFileName(int iRecordWndIndex)
{
int i;
char cFilename[256];
CTime time = CTime::GetCurrentTime();
i = iRecordWndIndex;
if (myoutput[i].m_bFileSave)
{
TRACE("停止myoutput[%d]客户端录像,更换文件名", i);
NET_DVR_StopSaveRealData(myoutput[i].m_iPlayhandle);
}
if (myoutput[i].m_iPlayhandle >= 0)
{
sprintf(cFilename, "%s%s_%02d_%4d%02d%02d_%02d%02d%02d.mp4", ClientParam.m_csClientRecordPath, myoutput[i].m_csIP, myoutput[i].m_iChannel, \
time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond() );
if (!NET_DVR_SaveRealData(myoutput[i].m_iPlayhandle, cFilename))
{
AfxMessageBox("录像失败!");
m_pCapLed[i]->SetLed(CLed::LED_COLOR_RED,CLed::LED_DISABLED,CLed::LED_ROUND);
return;
}
myoutput[i].m_lChangeFileNameTime = time.GetTime() ClientParam.m_iRecordFileInterval * 60;
TRACE("Client Record Filename = %s", cFilename);
myoutput[i].m_bFileSave = TRUE;
m_pCapLed[i]->SetLed(CLed::LED_COLOR_RED,CLed::LED_ON,CLed::LED_ROUND);
}
}
void CNewclientDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
int i;
WORD wTemp;
WORD wVolumevalue;
BOOL bRet;
i = iActiveWndNumber;
wTemp = (0xFFFF) / 100;
bRet = FALSE;
if (myoutput[i].m_iPlayhandle >= 0)
{
if (GetDlgItem(IDC_SLIDERLD) == pScrollBar)
{
ClientParam.m_VideoInfo[i].m_iBrightness = m_ld.GetPos();
bRet = TRUE;
}
else if (GetDlgItem(IDC_SLIDERDBD) == pScrollBar)
{
ClientParam.m_VideoInfo[i].m_iContrast = m_dbd.GetPos();
bRet = TRUE;
}
else if (GetDlgItem(IDC_SLIDERBHD) == pScrollBar)
{
ClientParam.m_VideoInfo[i].m_iSaturation = m_bhd.GetPos();
bRet = TRUE;
}
else if (GetDlgItem(IDC_SLIDERSD) == pScrollBar)
{
ClientParam.m_VideoInfo[i].m_iHue= m_sd.GetPos();
bRet = TRUE;
}
else if (GetDlgItem(IDC_SLIDERYL) == pScrollBar)
{
if (ClientParam.m_bPlaySound[i])
{
TRACE("调整音频浏览声音.");
ClientParam.m_Volume = m_yl.GetPos();
wVolumevalue = (WORD)(m_yl.GetPos()) * wTemp;
if (g_bShareSound)
{
NET_DVR_OpenSoundShare(myoutput[iActiveWndNumber].m_iPlayhandle);
}
else
{
NET_DVR_OpenSound(myoutput[i].m_iPlayhandle);
}
NET_DVR_Volume(myoutput[i].m_iPlayhandle, wVolumevalue);
}
}
if (bRet)
{
bRet = NET_DVR_ClientSetVideoEffect(myoutput[i].m_iPlayhandle, ClientParam.m_VideoInfo[i].m_iBrightness, ClientParam.m_VideoInfo[i].m_iContrast,
ClientParam.m_VideoInfo[i].m_iSaturation, ClientParam.m_VideoInfo[i].m_iHue);
//bRet = NET_DVR_SetVideoEffect(myoutput[i].m_lServerID, myoutput[i].m_iChannel,ClientParam.m_VideoInfo[i].m_iBrightness, ClientParam.m_VideoInfo[i].m_iContrast,
// ClientParam.m_VideoInfo[i].m_iSaturation, ClientParam.m_VideoInfo[i].m_iHue);
if (!bRet)
{
AfxMessageBox("设置视频参数失败!");
}
}
}
if (GetDlgItem(IDC_SLIDERYL) == pScrollBar)
{
if (lVoiceIndex >= 0)
{
TRACE("调整语音对讲声音.");
ClientParam.m_Volume = m_yl.GetPos();
wVolumevalue = (WORD)(m_yl.GetPos()) * wTemp;
NET_DVR_SetVoiceComClientVolume(lVoiceIndex, wVolumevalue);
}
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CNewclientDlg::OnButtonpoll()
{
// TODO: Add your control notification handler code here
int i = iActiveWndNumber;
WORD wTemp = (0xFFFF) / 100;
WORD wVolumevalue;
ClientParam.m_VideoInfo[i].m_iBrightness = DEFAULTBRIGHTNESS;
ClientParam.m_VideoInfo[i].m_iContrast = DEFAULTCONTRAST;
ClientParam.m_VideoInfo[i].m_iSaturation = DEFAULTSATURATION;
ClientParam.m_VideoInfo[i].m_iHue = DEFAULTHUE;
NET_DVR_ClientSetVideoEffect(myoutput[i].m_iPlayhandle, ClientParam.m_VideoInfo[i].m_iBrightness, ClientParam.m_VideoInfo[i].m_iContrast,
ClientParam.m_VideoInfo[i].m_iSaturation, ClientParam.m_VideoInfo[i].m_iHue);
//NET_DVR_SetVideoEffect(myoutput[i].m_lServerID, myoutput[i].m_iChannel,ClientParam.m_VideoInfo[i].m_iBrightness, ClientParam.m_VideoInfo[i].m_iContrast,
// ClientParam.m_VideoInfo[i].m_iSaturation, ClientParam.m_VideoInfo[i].m_iHue);
ClientParam.m_Volume = DEFAULTVOLUME;
if (lVoiceIndex >= 0)
{
TRACE("调整语音对讲声音.");
wVolumevalue = (WORD)(ClientParam.m_Volume) * 10 *wTemp;
NET_DVR_SetVoiceComClientVolume(lVoiceIndex, wVolumevalue);
}
else if (ClientParam.m_bPlaySound)
{
TRACE("调整音频浏览声音.");
wVolumevalue = (WORD)(ClientParam.m_Volume) * 10 * wTemp;
if (g_bShareSound)
{
NET_DVR_OpenSoundShare(myoutput[iActiveWndNumber].m_iPlayhandle);
}
else
{
NET_DVR_OpenSound(myoutput[i].m_iPlayhandle);
}
NET_DVR_Volume(myoutput[i].m_iPlayhandle, wVolumevalue);
}
m_ld.SetPos(ClientParam.m_VideoInfo[iActiveWndNumber].m_iBrightness);
m_sd.SetPos(ClientParam.m_VideoInfo[iActiveWndNumber].m_iHue);
m_bhd.SetPos(ClientParam.m_VideoInfo[iActiveWndNumber].m_iSaturation);
m_dbd.SetPos(ClientParam.m_VideoInfo[iActiveWndNumber].m_iContrast);
m_yl.SetPos(ClientParam.m_Volume);
}
void CNewclientDlg::OnButtonyzw()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
int i = iActiveWndNumber;
if (myoutput[i].m_iPlayhandle >= 0)
{
NET_DVR_PTZPreset(myoutput[i].m_iPlayhandle, GOTO_PRESET, m_yzd);
}
}
void CNewclientDlg::OnCancel()
{
// TODO: Add extra cleanup here
// CDialog::OnCancel();
}
void CNewclientDlg::OnOK()
{
// TODO: Add extra cleanup here
// CDialog::OnOk();
}
/*
void CNewclientDlg::OnButauto()
{
// TODO: Add your control notification handler code here
char buf[20];
buf[0] = 0xa0;
buf[1] = 0x00;
buf[2] = 0x00;
buf[3] = 0x07;
buf[4] = 0x00;
buf[5] = 0x63;
buf[6] = 0xaf;
buf[7] = 0x6b;
NET_DVR_TransPTZ_Other(myoutput[0].m_lServerID, 1, buf, 8);
}
*/
/*
void CNewclientDlg::OnButsharesound()
{
// TODO: Add your control notification handler code here
if (g_bShareSound)
{
NET_DVR_SetAudioMode(1);
g_bShareSound = FALSE;
// GetDlgItem(IDC_BUTSHARESOUND)->SetWindowText("sound");
}
else
{
NET_DVR_SetAudioMode(2);
g_bShareSound = TRUE;
// GetDlgItem(IDC_BUTSHARESOUND)->SetWindowText("sharesound");
}
}
*/
void CNewclientDlg::OnSelchangeCombonetdelay()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
g_nNetDelay = m_NetDelayCtrl.GetCurSel();
}
void CNewclientDlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
int i = iActiveWndNumber;
if (!NET_DVR_MakeKeyFrame(myoutput[i].m_lServerID, myoutput[i].m_iChannel))
{
AfxMessageBox("NET_DVR_MakeKeyFrame failed [%d]", NET_DVR_GetLastError());
}
}
void CNewclientDlg::OnButxh()
{
// TODO: Add your control notification handler code here
int i;
i = iActiveWndNumber;
if ( (myoutput[i].m_iPlayhandle >= 0) && (!myoutput[i].m_bCruise) )
{
NET_DVR_PTZCruise(myoutput[i].m_iPlayhandle, RUN_SEQ, 0, 0, 0);
myoutput[i].m_bCruise = TRUE;
GetDlgItem(IDC_BUTXH)->SetWindowText("停止巡航");
}
else if (myoutput[i].m_bCruise)
{
NET_DVR_PTZCruise(myoutput[i].m_iPlayhandle, STOP_SEQ, 0, 0, 0);
myoutput[i].m_bCruise = FALSE;
GetDlgItem(IDC_BUTXH)->SetWindowText("巡航");
}
}
void CNewclientDlg::OnButjpegpic()
{
// TODO: Add your control notification handler code here
int i;
char cFilename[256];
CString sTemp;
NET_DVR_JPEGPARA JpegPara;
i = iActiveWndNumber;
JpegPara.wPicQuality = 0;
JpegPara.wPicSize = 0;
CTime time = CTime::GetCurrentTime();
if (myoutput[i].m_iPlayhandle >= 0)
{
sTemp.Format("%s\\", ClientParam.m_csPictureSavePath);
if (GetFileAttributes(sTemp) != FILE_ATTRIBUTE_DIRECTORY)
{
CreateDirectory(sTemp, NULL);
}
sprintf(cFilename, "%s\\JPEG_%s_%02d_%4d%02d%02d_%02d%02d%02d_%d.jpg", ClientParam.m_csPictureSavePath, myoutput[i].m_csIP, myoutput[i].m_iChannel, \
time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond(), GetTickCount());
TRACE("Picture save file name : %s", cFilename);
if (!ClientParam.m_bUseCard)
{
if (NET_DVR_CaptureJPEGPicture(myoutput[i].m_lServerID, myoutput[i].m_iChannel, &JpegPara, cFilename))
{
CString sTemp;
sTemp.Format("JPEG抓图成功 %s!",cFilename);
AfxMessageBox(sTemp);
return;
}
else
{
AfxMessageBox("JPEG抓图失败!");
}
}
}
}
void CNewclientDlg::OnMove(int x, int y)
{
CDialog::OnMove(x, y);
Invalidate(TRUE);
if (ClientParam.m_bUseCard)
NET_DVR_RefreshSurface_Card();
UpdateWindow();
// TODO: Add your message handler code here
}
标签: 客户端源码
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论