版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
–PAGE2––PAGE3–-1-会议视频管理系统学院专业班级学号姓名指导教师教师职称年月日目录TOC\o"1—3”\n\p""\h\zHYPERLINK\l"_Toc137292139"会议视频管理系统HYPERLINK\l"_Toc137292140"目录HYPERLINK\l"_Toc137292141”摘要HYPERLINK1系统需求分析HYPERLINK\l"_Toc137292145”2开发工具的选择HYPERLINK\l”_Toc137292146"2总体设计HYPERLINK\l"_Toc137292147”1项目规划HYPERLINK\l"_Toc137292148"2系统功能结构HYPERLINK\l”_Toc137292149"3设计目标HYPERLINK\l”_Toc137292150”3系统设计HYPERLINK\l"_Toc137292151”1开发及运行环境HYPERLINK\l"_Toc137292152”2数据库设计HYPERLINK\l”_Toc137292153"1构建应用程序框架HYPERLINK\l"_Toc137292154”2封装数据库HYPERLINK\l”_Toc137292155”3主窗口设计HYPERLINK\l"_Toc137292156"4系统登录管理HYPERLINK\l"_Toc137292157”5视频采集HYPERLINK\l"_Toc137292158"6视频录像HYPERLINK\l"_Toc137292159"7会议记录HYPERLINK\l"_Toc137292160”附录A参考文献HYPERLINK\l"_Toc137292161"附录B数据表吉林省明日科技有限公司监制吉林省明日科技有限公司监制–PAGE2––PAGE39–摘要【摘要】为了适应全球经济一体化的迅速发展,各大企业纷纷在世界各地建立企业的分支机构,以扩大企业在经济领域中的影响力。企业规模的不断扩大,给企业管理出现了新的管理要求,为了让各地分支机构能够及时的对企业决策作出迅速的反应,各企业都积极采用高科技技术——视频会议,对各分支机构进行统一的通知、调整等,使各地的分支机构能够同一时间,同时按照企业的整体规化和按排开始行动.具有关研究表明,人脑所接受的信息中55%来自于面对面的视觉效果,38%依赖于说话者的语音,而只有7%依赖于内容.随着计算机网络通信技术发展和电信基础运营成本的降低,新一代视频会议系统在各企业中得到广泛的应用。2004年和2005年,中国HYPERLINK"http://www.soonlink。cn/"\t"_blank"视频会议市场增长率将保持在32%以上,在年度IT业界热点技术中,HYPERLINK"http://www.soonlink.cn/"\t”_blank”视频会议技术位居前列,显示了这一市场的潜力确实值得期待.【关键词】会议视频管理系统吉林省明日科技有限公司监制吉林省明日科技有限公司监制–PAGE22––PAGE21–吉林省明日科技有限公司监制0引言视频会议管理系统通过录像对会议的全程跟踪和记录,把会议记录的图像信息存储到数据库中,通过管理系统对数据库中记录进行管理,实现了通过管理系统对会议的全程图像信息进行管理。本系统为单机版视频管理系统,通过摄像头进行图像的摄录,以记录形式保存在数据库中.通过对数据库中的记录的管理实现对会议信息的管理.1系统需求分析1.1系统需求分析根据市场的需求,要求系统具有以下功能:记录会议信息。具有数据备份及数据恢复的功能,确保系统的安全性。视频录像。视频控制。会议信息查询。1.2开发工具的选择会议视频管理系统采用Microsoft公司的VisualC++6。0进行开发。相信大家都听说过这样一句话,“聪明的程序员使用Delphi,真正的程序员使用VC",与其他工具相比,VisualC++具有以下特点:1。VisualC++工具以C++语言为基础,因此生成的可执行文件小,执行效率高.2.VisualC++具有强大的调试功能,可以设置和跟踪断点,查看栈和变量信息,能够自动检测内存泄露。3.VisualC++具有强大的硬件控制功能,与VB、Delphi的RAD开发工具不同,VisualC++拥有很强的底层控制能力,现今的许多驱动程序都采用VisualC++进行开发。4。VisualC++具有丰富的帮助文档,即MSDN。MSDN包含了几GB的文档和源代码,通过它,可以解决各种技术难题.5.VisualC++出自Micorosoft公司,因此,对Windows系统的新技术具有很好的支持,而其他公司的产品似乎总慢上半拍.2总体设计2.1项目规划根据需求分析,设计系统框架。会议视频管理系统由视频管理、综合设置、会议管理、系统维护、系统帮助等5部分组成。设计各部分具体功能如下:视频管理模块视频管理模块包括视频采集和结束视频采集两部分。综合设置模块综合设置模块由视频格式设定、综合设定、载取图像到剪贴板、视频压缩、录像5部分组成。会议管理模块会议管理模块主要由会议记录和会议查询两部分组成。系统维护模块系统维护模块包括数据备份、数据还原、系统初始化、开机自动运行4个部分。系统帮助模块系统帮助模块由关于视频系统和帮助内容两部分构成。2。2系统功能结构会议视频系统的功能结构如图1所示。图1会议视频系统功能结构图2.3设计目标本系统是根据中小企业的实际需求而开发的,完全能够实现企业的会议视频管理,通过本系统可以达到以下目标:系统运行稳定,安全可靠。界面设计美观,人机交互界面友好。信息查询灵活、方便、快捷、准确,数据存储安全可靠。满足键盘和鼠标的双重操作,完全支持回车键。信息安全保密。3系统设计3.1开发及运行环境1.硬件要求CPU:300MHz以上的处理器.内存:128MB,推荐256MB.硬盘:150MB以上剩余空间。显示像素:最低800*600,最佳效果1024*768。摄像头:百脑通摄像头。2.软件要求操作系统:Windows2000/NT/XP/CE。数据库:SQLServer2000。驱动程序:百脑通驱动程序。3.2数据库设计1.数据库概要说明数据库的选择应根据实际情况确定,首先应考虑用户的数据量大小,如果数据量不大,可以采用本地数据库,例如Access、Paradox等,如果数量大,应采用大型数据库,例如SQLServer、Oracle、Sybase等.其次应考虑经费问题,因此一套大型数据库需要几万、甚至几十万的价格,所以在选择数据库时,还需要充分考虑用户的实际条件。2.主要数据表的结构数据库中的数据表请参见附录B.4功能模块设计4。1构建应用程序框架会议视频管理系统采用单文档/视图结构。框架设计步骤如下:(1)在VisualC++集成开发环境中单击“File/New”菜单项,打开New窗口,选择Projects选项卡,如图2所示。图2New窗口(2)在New窗口中选择“MFCAppWizard(exe)"选项,在“Projectname"编辑框中输入工程名称,这里为“Capture”,单击“OK”按钮进入MFC应用程序向导步骤1窗口,如图3所示。图3MFC应用程序向导步骤1窗口(3)选择“Singledocument”选项,表示创建单文档/视图结构应用程序,单击“Finish”按钮创建应用程序框架。4.2主窗口设计会议视频管理系统主窗口由菜单、工具栏、客户区和状态栏组成,其中状态栏采用系统默认创建的状态栏,其他部分需要额外设计。主窗口运行效果如图4所示。图4主窗口效果图1。菜单设计1。设计菜单资源菜单是应用程序经常使用的界面元素,它对应着应用程序的一项功能,单击菜单项将会执行欲定义的操作。下面笔者详细介绍菜单的设计过程.(1)在工作区窗口中选中“ResourceView”标签页,如图5所示.图5资源视图窗口(2)展开“Menu”节点,默认情况下,在文档\视图结构中,MFC向导会创建一个菜单资源“IDR_MAINFRAME”,双击该资源节点,打开菜单资源编辑窗口,修改菜单资源如下:BEGINPOPUP"视频管理"BEGINMENUITEM"视频采集”,ID_Set_disPlayMENUITEM”结束视频采集",ID_MENUITEMEndENDPOPUP"综合设置”BEGINMENUITEM”视频格式设定”,ID_Set_disFormatMENUITEM"综合设定”,ID_Set_dissorceMENUITEM"载取图像到剪贴板”,IDC_PICPICMENUITEM"视频压缩",ID_VideoCompressMENUITEM”录像”,IDCAPTUREENDPOPUP”会议管理”BEGINMENUITEM”会议记录",ID_MENUITEMRECORDMENUITEM”会议查询”,ID_MENUITEMQUERYENDPOPUP"系统维护”BEGINMENUITEM"数据备份",ID_MENUITEMBACKMENUITEM"数据还原”,ID_MENUITEMRESTOREMENUITEM"系统初始化",ID_MENUITEMSYSINIMENUITEM”开机自动运行”,ID_MENUIAUTORUNENDPOPUP”帮助"BEGINMENUITEM"关于视频系统...”,ID_APP_ABOUTMENUITEM"帮助内容”,ID_MENUITEMHELPENDEND2。自定义菜单类默认情况下,VisualC++中的菜单并不能显示图标。如果需要在菜单项中显示图标,需要自己重新封装菜单类CMenu。在本系统中,笔者自定义一个菜单类CMyMenu,该类能够在菜项项中显示图标,并且实现了菜单项的重绘,效果如图6所示。图6菜单设计效果图CMyMenu类设计步骤如下:(1)新建一个CMyMenu类,该类派生于CMenu。(2)定义一个CMenuItemInfo类,该类用于记录菜单项的信息,包括菜单项的图标索引、菜单项文本、菜单项ID,代码如下:/**************************************************定义菜单项信息**************************************************/classCMenuItemInfo{public:ﻩCMenuItemInfo(){m_MenuID=0;}; ~CMenuItemInfo(){};ﻩUINTm_Iconindex;//菜单项图标索引 CStringm_Text;//菜单项文本 intm_MenuID;//菜单标识,-2顶层菜单,-1弹出式菜单,0分隔条,命令ID普通菜单};(3)为CMyMenu类添加3个成员变量,如下:UINTm_index;UINTm_imageindex;CMenuItemInfoMenus[100];//记录菜单项信息(4)添加ResetMenuStyle方法,该方法用于修改菜单项的风格,使菜单项具有重绘功能,设置菜单项信息.在ResetMenuStyle方法中利用递归的方式遍历菜单资源中的每个菜单项,代码如下:voidCMyMenu::ResetMenuStyle(HMENUm_hmenu,BOOLIsTop){ﻩCMenu*m_pMenu;//菜单指针 m_pMenu=CMenu::FromHandle(m_hmenu);//根据句柄获取菜单指针 if(m_pMenu!=NULL)ﻩ{ for(UINTi=0;i〈m_pMenu->GetMenuItemCount();i++)ﻩﻩ{ intm=m_pMenu-〉GetMenuItemID(i);//获取菜单项ID ﻩﻩMenus[m_index]。m_MenuID=m;//m_pMenu—〉GetMenuItemID(i);//如果为弹出式菜单,返回-1,//分隔条返回0,普通菜单,返回IDﻩ ﻩif(((Menus[m_index]。m_MenuID〈0)&&IsTop== TRUE))//顶层菜单ﻩ Menus[m_index].m_MenuID=—2;ﻩﻩﻩMenus[m_index]。m_Iconindex=-1;m_pMenu—〉GetMenuString(i,Menus[m_index].m_Text,MF_BYPOSITION);//获取菜单项文本m_pMenu-〉ModifyMenu(i,MF_OWNERDRAW|MF_BYPOSITION|MF_STRING,Menus[m_index]。m_MenuID,(LPCTSTR)(&Menus[m_index]));//修改菜单信息 ﻩ if(Menus[m_index].m_MenuID>0)ﻩ { ﻩMenus[m_index].m_Iconindex=m_imageindex;//设置菜单项图标索引ﻩﻩﻩﻩm_imageindex+=1; ﻩ}ﻩ ﻩm_index+=1;CMenu*m_pSubmenu=m_pMenu-〉GetSubMenu(i);//获取子菜单ﻩ if(m_pSubmenu)//如果存在子菜单,利用递归修改其风格 {ﻩﻩﻩ ResetMenuStyle(m_pSubmenu—>GetSafeHmenu());ﻩ } ﻩ} }}(5)添加AttachMenu方法,该方法将菜单与指定的句柄关联,并调用ResetMenuStyle方法修改菜单风格。代码如下:/***************************************函数名:AttachMenu作用:将菜单资源与菜单类关联,改变菜单风格参数:m_hmenu是菜单资源句柄返回值:执行成功返回值为true,否则出错***************************************/boolCMyMenu::AttachMenu(HMENUm_hmenu){ﻩAttach(m_hmenu); ResetMenuStyle(m_hmenu,true); returntrue;}(6)改写菜单项的MeasureItem方法,设置顶层菜单、弹出示菜单、分隔条、普通菜单的大小。代码如下://根据菜单的风格确定菜单项的大小voidCMyMenu::MeasureItem(LPMEASUREITEMSTRUCTlpMeasureItemStruct){ﻩlpMeasureItemStruct->itemHeight=26;ﻩlpMeasureItemStruct->itemWidth=130; UINTm_type; m_type=((CMenuItemInfo*)(lpMeasureItemStruct—>itemData))—>m_MenuID; switch(m_type)ﻩ{ case-2://顶层菜单ﻩﻩ{ ﻩ lpMeasureItemStruct->itemWidth=((CMenuItemInfo*)(lpMeasureItemStruct-〉itemData))—>m_Text.GetLength()*10;ﻩﻩ break; }ﻩcase-1://弹出式菜单ﻩﻩ{ﻩ ﻩlpMeasureItemStruct->itemWidth=((CMenuItemInfo*)(lpMeasureItemStruct-〉itemData))->m_Text.GetLength()*10; ﻩﻩ break; ﻩ} case0://分隔条 ﻩ{ﻩ ﻩlpMeasureItemStruct—>itemHeight=10; ﻩﻩ break;ﻩ ﻩﻩ}ﻩdefault://普通菜单项ﻩ { break; ﻩ} }ﻩ}(7)改写菜单项的DrawItem方法,修改绘制菜单。在该方法中调用了多个自定义的方法,这些方法用户绘制菜单的图标、文本、背景颜色等,由于篇幅关系,具体代码请参考光盘.//重新绘制菜单项voidCMyMenu::DrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct){ﻩif(lpDrawItemStruct->CtlType=ODT_MENU)ﻩ{ if(lpDrawItemStruct—>itemData==NULL)ﻩreturn;CDC*pdc=CDC::FromHandle(lpDrawItemStruct->hDC);pdc—>SetBkMode(TRANSPARENT); CRectm_rect(lpDrawItemStruct—〉rcItem); ﻩCStringm_text=((CMenuItemInfo*)(lpDrawItemStruct->itemData))—>m_Text; ﻩUINTm_MenuID,m_State,m_imageid; m_imageid=((CMenuItemInfo*)(lpDrawItemStruct—>itemData))-〉m_Iconindex; m_State=lpDrawItemStruct->itemState; m_MenuID=((CMenuItemInfo*)(lpDrawItemStruct->itemData))->m_MenuID;ﻩﻩswitch(m_MenuID)ﻩ { ﻩcase-2:ﻩ ﻩ{ ﻩ ﻩDrawTopMenu(pdc,m_rect,m_State&ODS_SELECTED);ﻩ DrawText(pdc,m_rect,m_text);ﻩ ﻩﻩbreak;ﻩﻩ }ﻩ case—1:ﻩﻩ { ﻩﻩif(m_State&ODS_SELECTED) ﻩﻩ ﻩDrawBestRect(pdc,m_rect,0xff00ff,0xfffff,false); ﻩﻩelse ﻩ ﻩ DrawTopMenu(pdc,m_rect,false);ﻩﻩﻩﻩ ﻩﻩDrawText(pdc,m_rect,m_text);ﻩ ﻩﻩbreak;ﻩﻩ ﻩ }ﻩﻩcase0:ﻩﻩﻩ{ ﻩCRectrect1(m_rect);ﻩﻩ ﻩrect1。DeflateRect(2,10,2,5);pdc—〉Draw3dRect(&rect1,RGB(64,0,128),RGB(255,255,255));ﻩ ﻩﻩbreak; ﻩ } default: { ﻩ CRectc_rect(m_rect);ﻩﻩ DrawBKColor(pdc,c_rect,m_State&ODS_SELECTED); ﻩ ﻩDrawText(pdc,m_rect,m_text);ﻩﻩﻩ DrawMenuIcon(pdc,m_imageid,m_rect,true);ﻩﻩﻩ break; ﻩﻩ }ﻩﻩ} }}(8)在框架类中定义一个CMyMenu变量m_menu,处理框架的WM_DRAWITEM、WM_MEASUREITEM消息,代码如下:voidCMainFrame::OnMeasureItem(intnIDCtl,LPMEASUREITEMSTRUCTlpMeasureItemStruct){ﻩm_menu.MeasureItem(lpMeasureItemStruct);}voidCMainFrame::OnDrawItem(intnIDCtl,LPDRAWITEMSTRUCTlpDrawItemStruct){ m_menu.DrawItem(lpDrawItemStruct);}2.工具栏设计默认情况下,在文档\视图结构中MFC应用程序向导会创建一个工具栏。该工具栏是一个普通的工具栏,背景不能够显示图像,为此,笔者修改了该工具栏,使其背景透明,效果如图7所示。图7工具栏效果图MFC提供的工具栏类CToolBar,背景不能显示图像,因此笔者又添加了一个CReBar对象m_rebar,CReBar能够作为工具栏的容器,并且可以设置背景图像,如果将工具栏放置在CReBar控件中,并将工具栏设置为透明效果,这样,工具栏不就可以显示图像背景了吗? 工具栏除了显示背景图像外,还应显示工具栏按钮图标。可以在程序中定义一个CImageList控件,通过该控件添加一组图标,调用工具栏的“GetToolBarCtrl().SetHotImageList()"方法设置图像列表。工具栏创建过程代码如下:if(!m_wndToolBar.CreateEx(this,WS_CHILD|CBRS_TOOLTIPS|CBRS_FLOATING|WS_VISIBLE|CBRS_ALIGN_TOP|TBSTYLE_FLAT))ﻩ{ ﻩTRACE0("Failedtocreatetoolbar\n"); ﻩreturn-1; } m_wndToolBar.SetButtons(NULL,13);ﻩintrecord=0; CStringmenutext; CCHAR*c_temp; for(intm=0;m<13;m++) {ﻩﻩ if((m+1)%3==0) m_wndToolBar。SetButtonStyle(m,TBBS_SEPARATOR); ﻩﻩelseﻩﻩ{ ﻩﻩm_wndToolBar.SetButtonInfo(m,ID_Set_disPlay+record,TBBS_BUTTON,record); ﻩ menutext.LoadString(ID_Set_disPlay1+record); ﻩrecord+=1;ﻩﻩﻩc_temp=menutext。GetBuffer(menutext。GetLength()+1);ﻩ ﻩc_temp[menutext.GetLength()+1]='\n';ﻩﻩﻩm_wndToolBar.SetButtonText(m,c_temp); ﻩ}ﻩ} m_wndToolBar.GetToolBarCtrl().SetButtonSize(CSize(60,55));//设置工具栏按钮大小 //m_wndToolBar.GetToolBarCtrl()。SetButtonWidth(30,60); m_toolimages。Create(28,28,ILC_COLOR16|ILC_MASK,0,0);//创建图像列表 //加载图像列表ﻩm_toolimages.Add(AfxGetApp()—>LoadIcon(IDI_ICON2));//向图像列表中添加图标 m_toolimages。Add(AfxGetApp()-〉LoadIcon(IDI_ICON3));ﻩm_toolimages.Add(AfxGetApp()—>LoadIcon(IDI_ICON4)); m_toolimages.Add(AfxGetApp()->LoadIcon(IDI_ICON5)); m_toolimages.Add(AfxGetApp()—>LoadIcon(IDI_ICON6)); m_toolimages.Add(AfxGetApp()-〉LoadIcon(IDI_ICON7)); m_toolimages。Add(AfxGetApp()->LoadIcon(IDI_ICON8));ﻩm_toolimages。Add(AfxGetApp()-〉LoadIcon(IDI_ICON9));ﻩm_toolimages.Add(AfxGetApp()—>LoadIcon(IDI_ICON10)); m_wndToolBar。GetToolBarCtrl().SetHotImageList(&m_toolimages);//设置工具栏的热点图标ﻩm_toolimages。Detach();ﻩ//创建工具栏图像列表ﻩm_toolimages。Create(32,32,ILC_COLOR32|ILC_MASK,1,1);ﻩ//加载图像列表 m_toolimages。Add(AfxGetApp()->LoadIcon(IDI_ICON2));ﻩm_toolimages。Add(AfxGetApp()-〉LoadIcon(IDI_ICON3));ﻩm_toolimages.Add(AfxGetApp()-〉LoadIcon(IDI_ICON4));ﻩm_toolimages。Add(AfxGetApp()->LoadIcon(IDI_ICON5)); m_toolimages.Add(AfxGetApp()->LoadIcon(IDI_ICON6)); m_toolimages.Add(AfxGetApp()->LoadIcon(IDI_ICON7));ﻩm_toolimages.Add(AfxGetApp()—〉LoadIcon(IDI_ICON8));ﻩm_toolimages.Add(AfxGetApp()—〉LoadIcon(IDI_ICON9));ﻩm_toolimages。Add(AfxGetApp()-〉LoadIcon(IDI_ICON10));ﻩm_wndToolBar.GetToolBarCtrl().SetImageList(&m_toolimages);//设置工具栏按钮的图标 m_toolimages。Detach();ﻩm_rebar.Create(this);ﻩm_rebar。AddBar(&m_wndToolBar); REBARBANDINFObarinfo;ﻩbarinfo。cbSize=sizeof(barinfo);ﻩbarinfo。fMask=RBBIM_BACKGROUND; m_wndToolBar。ModifyStyle(0,TBSTYLE_TRANSPARENT);//将工具栏设置为透明效果 barinfo.hbmBack=::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP4)); m_rebar.GetReBarCtrl()。SetBandInfo(0,&barinfo);3。客户区设计会议视频管理系统的客户区域由树视图和普通视图两部分组成.在树视图中列出了系统中的常用功能,用户可以双击节点打开各功能模块.为实现该功能,笔者自定义了一个树视图类CCustomTree,该类派生于CTreeView。CCustomTree类设计步骤如下:(1)通过工作区创建一个类,名称为CCustomTree,父类为CTreeView。(2)在CCustomTree类中定义3个成员变量,如下: CStringArraym_Treenodes;//记录节点文本 CImageListm_imagelist;//图像列表 CFontm_font;//控件字体(3)在OnInitialUpdate方法中创建图像列表,添加图标,创建和设置字体,修改树视图风格,添加节点。代码如下:voidCCustomTree::OnInitialUpdate(){ CTreeView::OnInitialUpdate();ﻩm_imagelist.Create(16,16,ILC_COLOR24|ILC_MASK,5,5);ﻩm_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON1));ﻩm_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON2)); m_imagelist。Add(AfxGetApp()-〉LoadIcon(IDI_ICON3));ﻩm_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON4)); this-〉GetTreeCtrl().SetImageList(&m_imagelist,TVSIL_NORMAL); this-〉GetTreeCtrl().DeleteAllItems();ﻩthis-〉ModifyStyle(0,TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS);ﻩ//添加树节点ﻩHTREEITEMh_root; CStringtempstr; h_root=this—〉GetTreeCtrl()。InsertItem(”功能列表",0,0); for(inti=0;i<NODECOUNT;i++)ﻩ{ﻩﻩtempstr=m_Treenodes[i];ﻩ this->GetTreeCtrl().InsertItem(tempstr,1,2,h_root); } this->GetTreeCtrl().Expand(h_root,TVE_EXPAND); this-〉GetTreeCtrl().SetBkColor(RGB(232,254,255));ﻩthis-〉GetTreeCtrl().SetTextColor(RGB(0,0,255));ﻩm_font.CreateFont(0,0,0,0,FW_BOLD,0,0,0,DEFAULT_CHARSET,OUT_STRING_PRECIS,CLIP_TT_ALWAYS,DEFAULT_QUALITY,DEFAULT_PITCH,"宋体”);ﻩthis—〉SetFont(&m_font);}注意:树视图的双击事件并没有在CCustomTree类中实现,而是在主框架中实现的。客户区域由树视图和普通视图两部分组成,因此需要分隔框架窗口。具体步骤如下:(1)在框架类中定义一个CSplitterWnd对象m_splitter.(2)改写框架类的虚拟方法OnCreateClient,划分客户区域,代码如下:BOOLCMainFrame::OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext){ m_splitter。CreateStatic(this,1,2);ﻩm_splitter.CreateView(0,1,RUNTIME_CLASS(CCaptureView),CSize(200,100),pContext);ﻩm_splitter。CreateView(0,0,RUNTIME_CLASS(CCustomTree),CSize(200,100),pContext); m_temptree=(CCustomTree*)m_splitter.GetPane(0,0); m_treehandle=m_temptree->m_hWnd; returnTRUE;//CFrameWnd::OnCreateClient(lpcs,pContext);}4.3系统登录管理1.实现目标为了防止非法用户进入系统,笔者设计了系统登录窗口.在程序启动时,首先显示登录窗口,要求用户输入登录信息,如果用户输入不合法,将禁止进入系统。系统登录窗口运行结果如图8所示。图8系统登录2。设计步骤(1)在工作区中选择“ClassView”选项卡,鼠标右键单击根节点,在弹出的快捷菜单中选择“NewForm”菜单项,打开NewForm窗口,如图9所示。图9NewForm窗口(2)在“Name”编辑框中输入窗口类名,例如“CLogin”,在“Baseclass”组合框中选择一个基类,这里为“CDialog”,单击“OK”按钮创建窗口。(3)在工作区的资源视图中选择新创建的窗口,向窗口中添加图片、静态文本、群组框、列表视图、标签、编辑框、按钮等资源。设置主要资源属性如表1所示。表1主要资源属性设置资源名称资源ID属性值EditIDC_EDIT2StylesPasswordButtonIDC_CONFIRMCaption登录StylesFlatEditIDC_EDIT3GeneralDisabled3。代码分析改写对话框的PreTranslateMessage方法,按<Enter>键控制焦点移动.BOOLCLogin::PreTranslateMessage(MSG*pMsg){ if(pMsg->message==ﻩWM_KEYDOWN)ﻩ if(pMsg->wParam==13) ﻩ if(pMsg->hwnd==m_password.m_hWnd) ﻩ pMsg-〉wParam=9; returnCDialog::PreTranslateMessage(pMsg);}处理对话框初始化时的消息,创建图像列表,向图像列表中添加图标,加载操作员信息,将其显示在列表视图中.BOOLCLogin::OnInitDialog(){ CDialog::OnInitDialog(); m_imagelist.Create(32,32,ILC_COLOR24|ILC_MASK,0,0);//创建图像列表 m_imagelist.Add(AfxGetApp()—>LoadIcon(IDI_LOGIN1));//加载图标 m_imagelist.Add(AfxGetApp()—〉LoadIcon(IDI_LOGIN2));ﻩm_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON11)); m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON12));ﻩm_list。SetImageList(&m_imagelist,LVSIL_NORMAL);//设置列表视图的图像列表ﻩLoadOperators();//向列表视图中加载操作员信息h_prohandle=::LoadLibrary("user32");//加载动态库AnimateWindow=(CFun*)::GetProcAddress(h_prohandle,”AnimateWindow");//获取函数地址ﻩAnimateWindow(m_hWnd,1500,AW_CENTER);//调用动态库中的函数,使窗口特殊效果显示 returnTRUE;}自定义函数LoadOperators用于加载操作员信息,并将操作员信息显示在列表视图中。voidCLogin::LoadOperators(){ _RecordsetPtrm_pRecord;ﻩCStringsql="select*fromtb_Login”; CStringm_operator;ﻩintimageindex=0; intimagecount=m_imagelist.GetImageCount(); m_pRecord=dataManage。p_Con-〉Execute((_bstr_t)sql,NULL,adCmdText); while(!m_pRecord-〉ADOEOF) {ﻩﻩm_operator=(TCHAR*)(_bstr_t)m_pRecord—>GetCollect(”m_name”); ﻩm_list.InsertItem(100,m_operator,imageindex);ﻩﻩif(imageindex〈imagecount-1) ﻩimageindex+=1; ﻩm_pRecord->MoveNext(); }}处理“登录”按钮的单击事件,程序首先检查用户名和密码是否为空,如果为空,进行提示,并退出操作。否则以用户名和密码为条件从数据表中查询数据,有数据返回,证明用户名和密码正确,否则认为用户名和密码不正确。voidCLogin::OnConfirm(){ CStringc_password; m_password.GetWindowText(c_password); if(m_username.IsEmpty()||c_password.IsEmpty())ﻩ{ ﻩMessageBox(”用户名或密码不能为空","提示”,64); ﻩreturn; }ﻩCStringsql="select*fromtb_loginwherem_name=?andm_password=?"; dataManage.p_Com->ActiveConnection=dataManage.p_Con。GetInterfacePtr();dataManage。p_Com—〉CommandText=(_bstr_t)sql;ﻩ_ParameterPtrm_param1,m_param2;m_param1=dataManage.p_Com-〉CreateParameter("a”,adVarChar,adParamInput,30);ﻩm_param1-〉Value=(_bstr_t)m_username;dataManage.p_Com->Parameters->Append(m_param1);ﻩm_param2=dataManage。p_Com-〉CreateParameter(”b",adVarChar,adParamInput,30);ﻩm_param2-〉Value=(_bstr_t)c_password; dataManage.p_Com—>Parameters->Append(m_param2); try { ﻩ dataManage.p_Record=dataManage.p_Com->Execute(0,NULL,adCmdText); ﻩif(dataManage.p_Record-〉BOF&&dataManage.p_Record—〉ADOEOF)ﻩ {ﻩﻩﻩMessageBox(”用户名或密码不正确");ﻩ } ﻩelse {ﻩﻩﻩAnimateWindow(m_hWnd,2500,AW_SLIDE|AW_HIDE|AW_BLEND);ﻩ ::FreeLibrary(h_prohandle); ﻩﻩEndDialog(0); }ﻩ}ﻩcatch(_com_error&e)ﻩ{ﻩ MessageBox(e.Description()); }ﻩdataManage.p_Com—>Parameters->Delete("a”);ﻩdataManage.p_Com—〉Parameters—〉Delete("b");ﻩ}4.4视频采集1.实现目标视频采集用于在程序中显示摄像头捕捉的信息。本系统采用Microsoft提供的VFW数字视频软件包。VFW提供了VBX和AVICap窗口类的高级编程工具,使程序员能够通过发送消息和设置属性来捕获、播放和编辑影视剪辑,运行效果如图10所示。图10视频采集2。设计步骤(1)本系统对视频的控制是通过CCapture_Main类实现的,用户在使用时可以将该类的头文件和源文件添加到工程中.将“Capture_Process.h"和“Capture_Process.cpp”文件添加到当前工程中。(2)在框架类中定义CCapture_Main类变量m_display。(3)在框架创建时调用m_display的Initialize方法进行初始化。(4)调用m_display的EnablePreviewVideo方法进行视频采集。3.代码分析在框架类中定义OnSetdisPlay方法用于视频采集,关键部分是调用m_display对象的EnablePreviewVideo方法,该方法具有5个参数,第一个参数为窗口句柄,其他4个参数表示显示区域的坐标。详细代码如下:voidCMainFrame::OnSetdisPlay(){ﻩm_showed=true;ﻩCRectm_rect,m_rectview;ﻩthis—>GetClientRect(m_rect);ﻩCWnd*tempview=m_splitter。GetPane(0,0); tempview->GetClientRect(m_rectview);m_display.EnablePreviewVideo(m_hWnd,m_rectview.right+10,m_rect.top+60,m_rect.right,m_rect。bottom);ﻩ}4.5视频录像1.实现目标视频录像用于将摄像头捕捉到的信息以AVI格式保存到磁盘中。AVI文件格式是一种RIFF指定的应用程序,用来对音频/视频流进行捕捉。视频录像运行效果如图11所示.图11视频录像2.设计步骤(1)在框架类中按<Ctrl〉+<W>键打开类向导,如图12所示。图12类向导(2)选择“MessageMaps"选项卡,在“ObjectIDs"列表框中选择“IDCAPTURE”资源ID,在“Messages"列表框中双击“COMMAND”消息,编写消息处理函数。3。代码分析视频录像是通过自定义函数OnCapture实现的。该函数主要通过m_display对象的CaptureAVI方法进行录像,CaptureAVI方法具有4个参数,第1个参数是AVI文件名称,第2个参数用于设置每秒帧数,第3个参数设置录像时间,第4个参数设置品质。voidCMainFrame::OnCapture(){ CStringFilter; CStringFilename;ﻩCRectRect;ﻩFilter="AVIFiles(*。avi)|*.avi||";ﻩCFileDialogFileDlg(FALSE,"avi",NULL,ﻩ ﻩﻩﻩOFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, ﻩﻩ Filter, ﻩ ﻩ ﻩthis);ﻩif(FileDlg.DoModal()==IDOK)ﻩ{ Filename=FileDlg。GetPathName();ﻩﻩm_display.CaptureAVI(Filenam
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人借款合同样本宝典
- 房屋买卖合同中当事人死亡的处理方法
- 电子产品购买合同案例
- 廉洁合同的签订展望
- 仓储配送业务合作合同
- 幼儿园物资选购合同
- 经济实惠外包服务合同
- 会议广告合作协议
- 家电采买协议
- 个人借款合同简单版样式示例
- 园林设施维护方案
- 特种设备使用单位日管控、周排查、月调度示范表
- 供应链成本控制与降本增效
- 大锁孙天宇小品《时间都去哪了》台词剧本完整版-一年一度喜剧大赛
- 2024年云南开放大学《多媒体技术基础》形成性考核参考试题库(含答案)
- 220kV~750kV油浸式电力变压器使用技术条件
- MOOC 生物化学与分子生物学-中国药科大学 中国大学慕课答案
- 金属屋面工程防水技术规程
- 北京市平谷区2023-2024学年九年级上学期期末考试英语试卷
- 人工智能增强战略规划
- 特种设备使用单位变更登记表
评论
0/150
提交评论