快乐的天空

时间来得快,去得也快

 

DVR 视频控件开发

总结前段时间用MFC开发视频监控控件过程中遇到的一些问题.
1.获取控件当前所在路径,用于读取该目录下的INI配置文件
char m_ConfigIni[512]; // 存放配置文件路径
char szApp[512]; // 当前控件所在完整路径(带文件名)
    
GetModuleFileName(AfxGetInstanceHandle(), szApp, MAX_PATH);
//注意第一个参数,平常应用程序开发时候一般传NULL即可,ActiveX中不行,会获取不到准确的路径
memcpy(m_ConfigIni, szApp, sizeof(szApp));
m_ConfigIni[strrchr(m_ConfigIni, 
0x5c- m_ConfigIni+1= 0// 去除控件文件名    
strcat(m_ConfigIni, "Config.ini");    
    
char path[512];
GetPrivateProfileString(
"StorePath""RecordPath""D:\\DvrData", path, 512, m_ConfigIni);
2.获取当前运行控件的电脑上的固定盘符列表,用于本地录像文件存放
char m_cHardDriver[26];    // 盘符数组
int     m_iDriverNum;         // 盘符个数  
BOOL F_GetSystemInfo();    // 获取固定盘符列表的函数


// 获取当前运行控件的电脑上的固定盘符列表
BOOL CWebPlayerApp::F_GetSystemInfo()
{
DWORD dw
=GetLogicalDriveStrings(0, NULL);
LPTSTR pAllDrivers
=new char[dw];
::GetLogicalDriveStrings(dw, pAllDrivers);
LPTSTR pDriver
=pAllDrivers;
char tempDriver[26];
DWORD DriverNum
=0;
while(pDriver[0!= 0)
{
tempDriver[DriverNum
++= *pDriver;
pDriver 
= _tcschr(pDriver,0+ 1;    //定位到下一个盘符
    }

//volume information
    TCHAR lpVolumeNameBuffer[200];
DWORD dwVolumeSerialNumber, dwMaxComLength;
DWORD dwFileSystemFlags;
TCHAR lpFileSystemNameBuffer[
50];

DWORD HardNum
=0;
for(DWORD num=0; num < DriverNum; num++)
{
CString csRootPath;
csRootPath.Format(
"%c%s", tempDriver[num], ":\\");

if(GetDriveType(csRootPath) == DRIVE_FIXED)
{
if(GetVolumeInformation(csRootPath,lpVolumeNameBuffer, sizeof(lpVolumeNameBuffer), &dwVolumeSerialNumber,
&dwMaxComLength, &dwFileSystemFlags, lpFileSystemNameBuffer, sizeof(lpFileSystemNameBuffer)))
{            
this->m_cHardDriver[HardNum++]=tempDriver[num];
}
}        
}
m_iDriverNum
=HardNum;    
delete[] pAllDrivers;

return TRUE;
}
3.视频1,4,9,16路画面切换显示
较简单地实现,在窗体上拖16个STATIC控件(定义数组为panels),动态调整它们的位置大小即可,然后定义一个类如CPlayStatic去继 承CStatic,每一个STATIC控件就由CPlayStatic管理;因为我们要在Static控件上添加鼠标,键盘事件处理,鼠标单击事件,选中 该一播放面板时绘制绿色边框,可以很明显地看出当前是选中那一路视频播放窗体,同时恢复上一路选中边框为默认灰色边框;鼠标双击事件,实现视频浏览窗口的 全屏功能(按多路预览-->单屏预览-->全屏-->单路浏览-->多路预览);右击菜单,对当前画面进行操作,如本地录像,语 音对讲,抓图等操作;键盘事件处理,如该窗体当前正在预览按F2/F键进入全屏模式,按Esc退出全屏,恢复普通模式(需让该窗体获得焦点,处理 KeyDown事件)
void CRealPlayDlg::ArrangeWindow()
{
//channelNum当前需要的视频路数
    int i=0, j=0, k=-1;
switch (channelNum)
{
case 1://DVR只有1个视频通道时候 只显示播放窗口1
//show=GetDlgItem(IDC_S01);
//show->MoveWindow(0,0,640,520);
            panels[0]->SetWindowPos(NULL,0,0,640,520,SWP_NOZORDER);
panels[
0]->ShowWindow(SW_SHOW);

//隐藏其他通道播放面板
            for (i=1; i<16; i++)
{
panels[i]
->ShowWindow(SW_HIDE);
}
m_Expanded 
= true;

break;
case 4://DVR有4个视频通道
            panels[0]->MoveWindow(0,0,319,259);
panels[
0]->ShowWindow(SW_SHOW);

panels[
1]->MoveWindow(320,0,320,259);
panels[
1]->ShowWindow(SW_SHOW);

panels[
2]->MoveWindow(0,260,319,260);
panels[
2]->ShowWindow(SW_SHOW);

panels[
3]->MoveWindow(320,260,320,260);
panels[
3]->ShowWindow(SW_SHOW);

for (i=4; i<16; i++)
{
panels[i]
->ShowWindow(SW_HIDE);
}
m_Expanded
=false;

break;
case 9://DVR有9个视频通道
            for (i=0; i<10; i++)
{
= i % 3;
if (j == 0)
{
k
++;
}
panels[i]
->SetWindowPos(NULL,j * 214,k * 174,213,173,SWP_NOZORDER);
panels[i]
->ShowWindow(SW_SHOW);
}
for (i=9; i<16; i++)
{
panels[i]
->ShowWindow(SW_HIDE);
}
m_Expanded
=false;

break;
case 16://DVR有16个视频通道
            for (i=0; i<16; i++)
{
j
=% 4;
if (j == 0)
{
k
++;
}
panels[i]
->SetWindowPos(NULL,j * 160,k * 130,159,129,SWP_NOZORDER);
panels[i]
->ShowWindow(SW_SHOW);
}
m_Expanded
=false;

break;
}
Invalidate();
//立即重绘窗体,显示效果
}

posted on 2012-04-09 10:28 探路者 阅读(813) 评论(1)  编辑 收藏 引用

评论

# re: DVR 视频控件开发 2012-05-22 11:40 左雁宏

我公司需要一款好用的视频控件
若有兴趣请尽快联系我:18847207007
  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

新闻档案

Android

Compiler Course

VIM

编译技术集合

测试

高性能计算

个人博客

框架/组件/库

搜索

最新评论

阅读排行榜

评论排行榜