1.8.3 无人广角自动监控实现过程
无人广角自动监控实现过程步骤如下:
(1)创建一个对话框,打开对话框属性窗口,将对话框的ID设置为IDD_AUTOMATISM_ DIALOG,将对话框标题设置为“无人广角自动监控”。
(2)向对话框中添加一个群组控件、一个图形控件、一个复选框控件、两个静态文本控件、两个时间控件、3个单选按钮控件和一个按钮控件,各控件的属性设置如表1.7所示。
表1.7 控件资源设置
|
控件ID< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
控 件 属 性 |
对 应 变 量 |
|
IDC_TIMECHECK |
取消选择Auto属性 |
无 |
|
IDC_DATETIMEPICKER1 |
Format:Time |
CDateTimeCtrl m_StartTime |
|
IDC_DATETIMEPICKER2 |
Format:Time |
CDateTimeCtrl m_Log |
|
IDC_AMPLITUDE |
取消选择Auto属性 |
无 |
|
IDC_HORIZONTAL |
取消选择Auto属性 |
无 |
|
IDC_VERTICAL |
取消选择Auto属性 |
无 |
|
IDC_OK |
Caption:开始 |
无 |
(3)在对话框的头文件中声明变量,代码如下:
CCaptureDlg* m_pMain; //主窗口指针 HANDLE m_hThread; //线程句柄 UINT m_Num; //监控方向 BOOL m_Time; //定时监控 BOOL m_Count; //记录复选框是否按下 CString m_UserName ; //用户名 CString m_LogPath; //日志文件路径 CTime starttime; //开始时间 CTime stoptime; //结束时间
|
(4)向对话框中添加OnInitDialog方法,在对话框初始化时设置单选按钮的状态,使时间控件不可用,并设置定时器。代码如下:
BOOL CAutodlg::OnInitDialog() { CDialog::OnInitDialog(); CButton* pButton = (CButton*)GetDlgItem(IDC_AMPLITUDE); pButton->SetCheck(1); //设置“广角监控”单选按钮为选中状态 m_Num = 0; m_Time = FALSE; m_Count = FALSE; //设置时间控件不可用 GetDlgItem(IDC_DATETIMEPICKER1)->EnableWindow(FALSE); GetDlgItem(IDC_DATETIMEPICKER2)->EnableWindow(FALSE); SetTimer(1,1000,NULL); //设置定时器 return TRUE; }
|
(5)处理对话框的WM_TIMER事件,判断是否定时监控,如果是,则获取系统时间,当然系统时间等于开始监控时间时开始监控。代码如下:
void CAutodlg::OnTimer(UINT nIDEvent) { if(m_Time) //判断是否定时监控 { CTime time= CTime::GetCurrentTime(); //获得系统当前时间 m_StartTime.GetTime(starttime); //获得开始监控时间 m_StopTime.GetTime(stoptime); //获得停止监控时间 if(time == starttime) //判断系统时间是否等于开始监控时间 { OnOK(); //关闭当前窗口 KillTimer(1); //停止定时器 } } CDialog::OnTimer(nIDEvent); } |
代码贴士
GetCurrentTime:获得系统当前的时间。
GetTime:获得时间控件中的时间。
(6)在主窗体中编写线程函数,在线程函数中判断是广角监控、水平监控和垂直监控的哪一种,并根据相应的方向实现自动监控功能。代码如下:
DWORD WINAPI ThreadProc(LPVOID lpParameter ) { CCaptureDlg* pDlg = (CCaptureDlg*)lpParameter; while (true) { switch(pDlg->m_Num) { case 0: pDlg->MoveCapture(0); //向上 Sleep(2000); //延时2秒 pDlg->MoveCapture(2); //向左 Sleep(22000); //延时22秒 pDlg->MoveCapture(1); //向下 Sleep(2000); //延时2秒 pDlg->MoveCapture(3); //向右 Sleep(22000); //延时22秒 pDlg->MoveCapture(1); //向下 Sleep(2000); //延时2秒 pDlg->MoveCapture(2); //向左 Sleep(22000); //延时22秒 pDlg->MoveCapture(0); //向上 Sleep(2000); //延时2秒 pDlg->MoveCapture(3); //向右 Sleep(22000); //延时22秒 break; case 1: pDlg->MoveCapture(2); //向左 Sleep(22000); //延时22秒 pDlg->MoveCapture(3); //向右 Sleep(22000); //延时22秒 break; case 2: pDlg->MoveCapture(0); //向上 Sleep(2000); //延时2秒 pDlg->MoveCapture(1); //向下 Sleep(2000); //延时2秒 break; } } return 0; }
|
(7)处理主窗体中“自动监控”按钮的单击事件,当按钮被按下时创建线程并打开无人广角自动监控模块。代码如下:
void CCaptureDlg::OnAutomatism() { CAutodlg dlg; //CAutodlg类对象 if(dlg.DoModal()==IDOK) { DWORD threadID; m_hThread = ::CreateThread(NULL,0,ThreadProc,(LPVOID)this,0, &threadID); //创建线程 m_Num = dlg.m_Num; m_Time = dlg.m_Time; if(m_Time) //判断是否定时监控 { m_StopTime = dlg.stoptime; //获得关闭时间 } } Invalidate(); //刷新窗口 } |
(8)在主窗体的WM_TIMER事件中判断系统时间是否等于停止时间,如果等于则停止定时监控。代码如下:
if(m_Time) //判断是否定时监控 { CTime time= CTime::GetCurrentTime(); //获得系统当前时间 if(time == m_StopTime) //判断当系统时间是否等于关闭时间 { OnStop(); //当系统时间等于关闭时间时停止监控 m_Time = FALSE; } }
|
【责任编辑:
夏书 TEL:(010)68476606】