|
1.5 主窗体设计(3)
(17)向CPanel类中添加RefreshWnd方法,用于刷新预览窗口。代码如下:
void CPanel::RefreshWnd(int preIndex,int curIndex) { //刷新预览窗口 m_pList[preIndex].Invalidate(); m_pList[curIndex].Invalidate(); } | (18)向CPanel类中添加ShowOnly方法,用于显示预览窗口。代码如下:
void CPanel::ShowOnly(int Index) { for (int i =0; i<m_Num; i++) { if (i==Index) { m_pList[i].ShowWindow(SW_SHOW); //显示预览窗口 } else { m_pList[i].ShowWindow(SW_HIDE); //隐藏预览窗口 } } }
| (19)处理CPanel类的WM_SIZE消息,在窗口大小改变时,调整预览窗口的大小。代码如下:
void CPanel::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if (m_Num>0) //创建了预览窗口 { CRect rc; GetClientRect(rc); //获得父窗口的客户区域 m_PreRC = rc; m_PreRC.DeflateRect(m_Div,m_Div,m_Div,m_Div); //预览窗口的宽度 int width = (rc.Width()-(m_UnitNum+1)*m_Div)/m_UnitNum; //预览窗口的高度 int height = (rc.Height()-(m_UnitNum+1)*m_Div)/m_UnitNum; //计算预览窗口的位置 for (int i =0; i<m_Num; i++) { int row = i / uNum + 1; //计算预览窗口的行位置 int col = i % uNum + 1; //计算预览窗口的列位置 int x = col*m_Div+(col-1)*width; //计算预览窗口的左上角横坐标 int y = row*m_Div+(row-1)*height; //计算预览窗口的左上角纵坐标 CRect rect(x,y,x+width,y+height); //设置预览窗口显示位置 if (m_pList[i].IsWindowVisible()) { if (!m_pList[i].m_Dbled) //是否填充父窗口 { m_pList[i].MoveWindow(rect); //恢复窗口初始大小及位置 m_pList[i].Invalidate(); //刷新窗口 } else { m_pList[i].MoveWindow(m_PreRC); //以预览窗口填充父窗口 m_pList[i].Invalidate(); //刷新窗口 } } } } } | (20)在主对话框中添加如下成员变量。
int m_DevNum; //当前芯片数,也就是有多少路 BOOL m_BStop; //是否停止预览 CPanel m_Frame; //预览窗口的父窗口 BOOL m_Kinescope; //是否录像
| (21)当主对话框初始化时,创建预览窗口的父窗口,判断使用的显卡类型并初始化SDK开发包。代码如下:
BOOL CCaptureDlg::OnInitDialog() { CDialog::OnInitDialog(); CButton* pBmpButton = (CButton*) GetDlgItem(IDC_BMP); //……此处代码省略 CString strTemp; m_Frame.Create(IDD_PANEL_DIALOG,NULL); //创建预览窗口的父窗口 CRect rc; GetWindowRect(rc); //获得主窗口的客户区域 //设置预览窗口的父窗口的显示区域 m_Frame.SetWindowPos(&wndTop,0,0,rc.Width()-180,rc.Height ()-10,SWP_SHOWWINDOW); m_Frame.ShowWindow(SW_SHOW); //显示预览窗口的父窗口 CButton* pVGAButton = (CButton*) GetDlgItem(IDC_VGA); CButton* pPCIButton = (CButton*) GetDlgItem(IDC_PCI); CString str= "temp"; //读取INI文件中的数据 GetPrivateProfileString("显卡设置","类型","VGA" ,str.GetBuffer (0), 10, "./syssetting.ini"); BOOL ret; if(str=="VGA") //判断是否选择了VGA显卡 { pVGAButton->SetCheck(1); //设置VGA按钮选中 pPCIButton->SetCheck(0); //设置PCI按钮未选中 //初始化SDK开发包 ret = VCAInitSdk(m_Frame.m_hWnd,PCI_VIEDOMEMORY); } else { ret = VCAInitSdk(m_Frame.m_hWnd,PCI_MEMORY_VIDEOMEMORY); //初始化SDK开发包 pVGAButton->SetCheck(0); //设置VGA按钮未选中 pPCIButton->SetCheck(1); //设置PCI按钮选中 } if(ret) //判断初始化SDK开发包是否成功 { //获得几路视频 m_DevNum = VCAGetDevNum(); m_Frame.CreatePreWnd((int)sqrt(m_DevNum)); //根据获得路数创建视频预览窗口 for (int i = 0; i<m_DevNum; i++) { VCAOpenDevice(i,m_Frame.m_pList[i].m_hWnd); //打开视频预览窗口 BOOL ret = VCAStartVideoPreview(i); //开始预览 m_Frame.UpdateAllPreView(); //更新视频预览窗口 } m_BStop = FALSE; } SetTimer(1,1000,NULL); //设置定时器 return TRUE; }
| (22)处理主对话框的WM_TIMER消息,判断某一路是否有视频信号。代码如下:
void CCaptureDlg::OnTimer(UINT nIDEvent) { //判断某一路是否有信号 eFieldFrequency frequency; for (int i=0;i<m_DevNum;i++) { VCAGetVidFieldFrq(i,frequency); //获得视频源输入频率 if(frequency == FIELD_FREQ_0HZ) //无信号 { if (m_Frame.m_pList[i].m_ShowImage == TRUE) { m_Frame.m_pList[i].m_ShowImage = FALSE; m_Frame.m_pList[i].Invalidate(); //更新预览窗口 } } else { if(m_Frame.m_pList[i].m_ShowImage == FALSE) //判断是否显示图片 { m_Frame.m_pList[i].m_ShowImage = TRUE; m_Frame.m_pList[i].Invalidate(); //更新预览窗口 if(m_Frame.m_pList[i].m_Stop == psPreview) { //更新视频预览窗口 VCAUpdateOverlayWnd(m_Frame.m_hWnd); VCAUpdateVideoPreview(i,m_Frame.m_pList[i].m_hWnd); } } } } CDialog::OnTimer(nIDEvent); } | (23)处理主对话框的WM_SIZE消息,在对话框大小改变时调整视频显示窗口的父窗口大小,从而间接调整预览窗口。代码如下:
void CCaptureDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); CRect rc,frc; GetClientRect(rc); //获取窗口的客户区域 //设置父窗口的大小 m_Frame.SetWindowPos(&wndTop,0,0,rc.Width()-180,rc.Height()-10,SWP_SHOWWINDOW); m_Frame.GetClientRect(frc); //获得父窗口的客户区域 m_Frame.SetWindowPos(NULL,0,7,frc.Width(),rc.Height()-8,0); m_Frame.ShowWindow(SW_SHOW); //显示父窗口 }
| 【责任编辑: 夏书 TEL:(010)68476606】
|