织梦CMS - 轻松建站从此开始!

罗索

VC6开发视频监控ActiveX控件总结

jackyhwei 发布于 2010-09-09 19:40 点击:次 
总结前段时间在VC6下使用MFC开发视频监控控件过程中遇到的一些问题.
TAG:

总结前段时间在VC6下使用MFC开发视频监控控件过程中遇到的一些问题.

1.获取控件当前所在路径,用于读取该目录下的INI配置文件

获取配置文件路径

  1. char m_ConfigIni[512]; // 存放配置文件路径 
  2. char szApp[512]; // 当前控件所在完整路径(带文件名) 
  3.     
  4. GetModuleFileName(AfxGetInstanceHandle(), szApp, MAX_PATH); 
  5. //注意第一个参数,平常应用程序开发时候一般传NULL即可,ActiveX中不行,会获取不到准确的路径 
  6. memcpy(m_ConfigIni, szApp, sizeof(szApp)); 
  7. m_ConfigIni[strrchr(m_ConfigIni, 0x5c) - m_ConfigIni+1] = 0; // 去除控件文件名    
  8. strcat(m_ConfigIni, "Config.ini");    
  9.     
  10. char path[512]; 
  11. GetPrivateProfileString("StorePath""RecordPath""D:\\DvrData"
  12. , path, 512, m_ConfigIni); 

2.获取当前运行控件的电脑上的固定盘符列表,用于本地录像文件存放

获取固定盘符列表的函数

  1. char m_cHardDriver[26];    // 盘符数组 
  2. int     m_iDriverNum;         // 盘符个数  
  3. BOOL F_GetSystemInfo();    // 获取固定盘符列表的函数 
  4.  
  5.  
  6. // 获取当前运行控件的电脑上的固定盘符列表 
  7. BOOL CWebPlayerApp::F_GetSystemInfo() 
  8.     DWORD dw=GetLogicalDriveStrings(0, NULL); 
  9.     LPTSTR pAllDrivers=new char[dw]; 
  10.     ::GetLogicalDriveStrings(dw, pAllDrivers); 
  11.     LPTSTR pDriver=pAllDrivers; 
  12.     char tempDriver[26]; 
  13.     DWORD DriverNum=0; 
  14.     while(pDriver[0] != 0) 
  15.     { 
  16.         tempDriver[DriverNum++] = *pDriver; 
  17.         pDriver = _tcschr(pDriver,0) + 1;    //定位到下一个盘符 
  18.     } 
  19.     
  20.     //volume information 
  21.     TCHAR lpVolumeNameBuffer[200]; 
  22.     DWORD dwVolumeSerialNumber, dwMaxComLength; 
  23.     DWORD dwFileSystemFlags; 
  24.     TCHAR lpFileSystemNameBuffer[50]; 
  25.     
  26.     DWORD HardNum=0; 
  27.     for(DWORD num=0; num < DriverNum; num++) 
  28.     { 
  29.         CString csRootPath; 
  30.         csRootPath.Format("%c%s", tempDriver[num], ":\\"); 
  31.         
  32.         if(GetDriveType(csRootPath) == DRIVE_FIXED) 
  33.         { 
  34.             if(GetVolumeInformation(csRootPath,lpVolumeNameBuffer,
  35.  sizeof(lpVolumeNameBuffer), &dwVolumeSerialNumber, 
  36.  &dwMaxComLength, &dwFileSystemFlags,
  37.  lpFileSystemNameBuffer, sizeof(lpFileSystemNameBuffer))) 
  38.             {            
  39.                 this->m_cHardDriver[HardNum++]=tempDriver[num]; 
  40.             } 
  41.         }        
  42.     } 
  43.     m_iDriverNum=HardNum;    
  44.     delete[] pAllDrivers; 
  45.  
  46.     return TRUE; 

3.视频1,4,9,16路画面切换显示

   较简单地实现,在窗体上拖16个STATIC控件(定义数组为panels),动态调整它们的位置大小即可,然后定义一个类如CPlayStatic去继承CStatic,每一个STATIC控件就由CPlayStatic管理;因为我们要在Static控件上添加鼠标,键盘事件处理,鼠标单击事件,选中该一播放面板时绘制绿色边框,可以很明显地看出当前是选中那一路视频播放窗体,同时恢复上一路选中边框为默认灰色边框;鼠标双击事件,实现视频浏览窗口的全屏功能(按多路预览-->单屏预览-->全屏-->单路浏览-->多路预览);右击菜单,对当前画面进行操作,如本地录像,语音对讲,抓图等操作;键盘事件处理,如该窗体当前正在预览按F2/F键进入全屏模式,按Esc退出全屏,恢复普通模式(需让该窗体获得焦点,处理KeyDown事件)

1,4,9,16路画面切换

  1. void CRealPlayDlg::ArrangeWindow() 
  2.         //channelNum当前需要的视频路数 
  3.     int i=0, j=0, k=-1; 
  4.     switch (channelNum) 
  5.     { 
  6.         case 1://DVR只有1个视频通道时候 只显示播放窗口1 
  7.             //show=GetDlgItem(IDC_S01); 
  8.             //show->MoveWindow(0,0,640,520); 
  9.             panels[0]->SetWindowPos(NULL,0,0,640,520,SWP_NOZORDER); 
  10.             panels[0]->ShowWindow(SW_SHOW); 
  11.             
  12.             //隐藏其他通道播放面板 
  13.             for (i=1; i<16; i++) 
  14.             { 
  15.                 panels[i]->ShowWindow(SW_HIDE); 
  16.             } 
  17.             m_Expanded = true
  18.  
  19.             break
  20.         case 4://DVR有4个视频通道 
  21.             panels[0]->MoveWindow(0,0,319,259); 
  22.             panels[0]->ShowWindow(SW_SHOW); 
  23.  
  24.             panels[1]->MoveWindow(320,0,320,259); 
  25.             panels[1]->ShowWindow(SW_SHOW); 
  26.             
  27.             panels[2]->MoveWindow(0,260,319,260); 
  28.             panels[2]->ShowWindow(SW_SHOW); 
  29.             
  30.             panels[3]->MoveWindow(320,260,320,260); 
  31.             panels[3]->ShowWindow(SW_SHOW); 
  32.  
  33.             for (i=4; i<16; i++) 
  34.             { 
  35.                 panels[i]->ShowWindow(SW_HIDE); 
  36.             } 
  37.             m_Expanded=false
  38.  
  39.             break
  40.         case 9://DVR有9个视频通道 
  41.             for (i=0; i<10; i++) 
  42.             { 
  43.                 j = i % 3; 
  44.                 if (j == 0) 
  45.                 { 
  46.                     k++; 
  47.                 } 
  48. panels[i]->SetWindowPos(NULL,j * 214,k * 174,213,173,SWP_NOZORDER); 
  49. panels[i]->ShowWindow(SW_SHOW); 
  50.             } 
  51.             for (i=9; i<16; i++) 
  52.             { 
  53.                 panels[i]->ShowWindow(SW_HIDE); 
  54.             } 
  55.             m_Expanded=false
  56.  
  57.              (peterzb)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201009/10128.html]
本文出处:博客园 作者:peterzb
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容