




免费预览已结束,剩余34页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
41VC典型模块屏幕录像模块第8章 实例位置: 光盘mr8随着计算机的广泛使用,越来越多的人开始接触计算机,许多用户都是通过视频教程进行学习,不但不用交售昂贵的学费,而且学习起来非常方便,这就使得视频教程的需求量不断增加,为了制作一个好的视频教程,首先要选择一个屏幕录像软件,本模块就通过AVI文件函数进行屏幕录像。通过本章的学习,读者能够学到: 屏幕抓图 抓取鼠标 获得文件属性 根据运行状态显示托盘图标 动态生成录像文件名 获得磁盘剩余空间8.1 屏幕录像模块概述8.1.1 模块概述用户可以使用屏幕录像模块将当前屏幕中的操作过程录制下来,并生成AVI文件,用户可以根据需要选择是否录制鼠标,并设置每秒录制的帧数,还可以对已经录制完成的AVI文件进行截取和合成操作,以方便用户裁剪录制过程中的错误。8.1.2 功能结构屏幕录像模块的功能结构如图8.1所示。图8.1 屏幕录像模块的功能结构图8.2 关键技术8.2.1 屏幕抓图在屏幕录像模块中,可以进行屏幕抓图,屏幕抓图时需要先建立一个屏幕的设备上下文,然后根据屏幕的设备上下文创建一个内存位图,最后将内存位图数据写入到文件中就实现了屏幕抓图操作。实现屏幕抓图功能的代码如下:if(!m_IsPath)MessageBox(请选择文件存储位置);return;CDC* pDeskDC = GetDesktopWindow()-GetDC();/获取桌面画布对象CRect rc;GetDesktopWindow()-GetClientRect(rc);/获取屏幕的客户区域CDC memDC;/定义一个内存画布memDC.CreateCompatibleDC(pDeskDC);/创建一个兼容的画布CBitmap bmp;bmp.CreateCompatibleBitmap(pDeskDC,rc.Width(),rc.Height();/创建兼容位图memDC.SelectObject(&bmp);/选中位图对象BITMAP bitmap;bmp.GetBitmap(&bitmap);/获得位图信息memDC.BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,pDeskDC,0,0,SRCCOPY);/绘制位图DWORD size=bitmap.bmWidthBytes*bitmap.bmHeight;/获得位图数据大小LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);int panelsize = 0;/记录调色板大小if(bitmap.bmBitsPixelbiBitCount = bitmap.bmBitsPixel;/位图像素pBInfo-biClrImportant = 0;pBInfo-biCompression = 0;pBInfo-biHeight = bitmap.bmHeight;/位图高pBInfo-biPlanes = bitmap.bmPlanes;pBInfo-biSize = sizeof(BITMAPINFO);pBInfo-biSizeImage = bitmap.bmWidthBytes*bitmap.bmHeight;/数据pBInfo-biWidth = bitmap.bmWidth;/位图宽pBInfo-biXPelsPerMeter = 0;pBInfo-biYPelsPerMeter = 0;GetDIBits(memDC.m_hDC,bmp,0,pBInfo-biHeight,lpData,(BITMAPINFO*)pBInfo,DIB_RGB_COLORS);CString path,name,m_number;m_Path.GetWindowText(path);/存储路径CTime time = CTime:GetCurrentTime();/抓图时间name = path+time.Format(%Y%m%d%H%M%S)+.bmp;/设置文件名及路径BITMAPFILEHEADER bfh;/位图文件头bfh.bfReserved1 = bfh.bfReserved2 = 0;bfh.bfType = (WORD)(MGetDC();/获取桌面画布对象CRect rc;GetDesktopWindow()-GetClientRect(rc);/获取屏幕的客户区域CDC memDC;/定义一个内存画布memDC.CreateCompatibleDC(pDeskDC);/创建一个兼容的画布CBitmap bmp;bmp.CreateCompatibleBitmap(pDeskDC,rc.Width(),rc.Height();/创建兼容位图memDC.SelectObject(&bmp);/选中位图对象BITMAP bitmap;bmp.GetBitmap(&bitmap);/获得位图信息memDC.BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,pDeskDC,0,0,SRCCOPY);/绘制位图if(m_Cursor.GetCheck()/如果抓取鼠标CPoint point;GetCursorPos(&point);/获得鼠标位置HICON hicon = (HICON)GetCursor();/获得鼠标图标句柄memDC.DrawIcon(point,hicon);/绘制鼠标DWORD size=bitmap.bmWidthBytes*bitmap.bmHeight;BYTE* lpData = new BYTEsize;int panelsize = 0;/记录调色板大小if(bitmap.bmBitsPixelbiBitCount = bitmap.bmBitsPixel;/位图像素pBInfo-biClrImportant = 0;pBInfo-biCompression = 0;pBInfo-biHeight = bitmap.bmHeight;/位图高pBInfo-biPlanes = bitmap.bmPlanes;pBInfo-biSize = sizeof(BITMAPINFO);pBInfo-biSizeImage = bitmap.bmWidthBytes*bitmap.bmHeight;/数据pBInfo-biWidth = bitmap.bmWidth;/位图宽pBInfo-biXPelsPerMeter = 0;pBInfo-biYPelsPerMeter = 0;BITMAPINFO bInfo;bInfo.bmiHeader = *pBInfo;GetDIBits(memDC.m_hDC,bmp,0,pBInfo-biHeight,lpData,&bInfo,DIB_RGB_COLORS);if(nFrames = 0)/第一次写入数据前CString rate,name,path;m_Name.GetWindowText(name);/获得文件名m_Path.GetWindowText(path);/文件存储路径m_Rate.GetWindowText(rate);/每秒帧数AVIFileOpen(&pfile,path+name+.avi,OF_WRITE | OF_CREATE,NULL);/打开文件memset(&strhdr, 0, sizeof(strhdr);strhdr.fccType = streamtypeVIDEO;/视频录制strhdr.fccHandler = 0;/句柄strhdr.dwScale = 1;strhdr.dwRate = atoi(rate);/设置帧数strhdr.dwSuggestedBufferSize = pBInfo-biSizeImage;SetRect(&strhdr.rcFrame,0,0,pBInfo-biWidth,pBInfo-biHeight);hr = AVIFileCreateStream(pfile,&ps,&strhdr); /创建数据流opts0-fccType = streamtypeVIDEO;/视频模式opts0-fccHandler = mmioStringToFOURCC(MSVC, 0);/压缩编码opts0-dwQuality = 7500;opts0-dwBytesPerSecond = 0;opts0-dwFlags = AVICOMPRESSF_VALID | AVICOMPRESSF_KEYFRAMES;opts0-lpFormat = 0;opts0-cbFormat = 0;opts0-dwInterleaveEvery = 0;AVIMakeCompressedStream(&pComStream,ps,&pCompressOption,NULL); /创建压缩数据流AVIStreamSetFormat(pComStream,0,pBInfo,sizeof(BITMAPINFOHEADER);/设置流格式hr = AVIStreamWrite(pComStream,nFrames ,1,(LPBYTE)lpData,pBInfo-biSizeImage,AVIIF_KEYFRAME,NULL,NULL);/写入数据nFrames+;delete lpData;delete pBInfo ;8.2.4 将AVI文件转换成位图数据在屏幕录像模块的主窗体中,当用户选择了一个录像文件以后,程序会将当前选择的录像文件的第一帧数据以图片的方式显示出来。首先要AVIFileInit函数初始化AVIFile函数库,然后调用AVIFileOpen函数打开AVI文件,通过AVIFileInfo函数获得AVI文件信息,通过AVIFileGetStream函数获得视频流信息,通过AVIStreamStart函数获得起始帧数,通过AVIStreamLength函数获得视频流长度,通过AVIStreamGetFrameOpen函数在视频流中打开帧,通过AVIStreamGetFrame函数解压当前帧,CreateDIBitmap函数生成位图对象,调用AVIStreamGetFrameClose函数释放资源,通过图片控件的SetBitmap方法显示位图,通过AVIFileRelease函数关闭AVI文件,通过AVIFileExit函数退出AVIFile函数库。将AVI文件转换成位图数据的实现代码如下:int pos = m_List.GetSelectionMark();/获得当前选中列表项索引CString name = m_List.GetItemText(pos,0);/获得文件名name += .avi;CString path,oname;m_Path.GetWindowText(path);/获得存储位置oname = path + + name;AVIFileInit();/初始化AVIFile函数库HRESULT hRet;/定义结果变量hRet = AVIFileOpen(&pfile,oname,OF_READ, NULL);/打开源文件if (hRet != 0)/判断文件是否打开成功MessageBox(打开源文件错误,提示);/弹出错误提示return;AVIFILEINFO pfinfo;AVIFileInfo(pfile,&pfinfo,sizeof(AVIFILEINFO); AVIFileGetStream(pfile, &ps, streamtypeVIDEO, 0 );/获取视频流long StartFrame = AVIStreamStart(ps);/获取流的起始帧m_FrameNum = AVIStreamLength(ps);/获取流的帧长度AVIFILEINFO pfinfo;AVIFileInfo(pfile,&pfinfo,sizeof(AVIFILEINFO);/获得AVI文件信息PGETFRAME pFrame;/定义帧接口对象pFrame=AVIStreamGetFrameOpen(ps,NULL);/在流中打开帧LPBITMAPINFOHEADER bih;bih = (LPBITMAPINFOHEADER) AVIStreamGetFrame(pFrame, StartFrame); /解压当前帧BITMAPINFO Header;/设置位图信息头memset(&Header,0,sizeof(BITMAPINFOHEADER); Header.bmiHeader.biBitCount=bih-biBitCount ; Header.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); Header.bmiHeader.biWidth = pfinfo.dwWidth; Header.bmiHeader.biHeight = pfinfo.dwHeight; Header.bmiHeader.biPlanes =bih-biPlanes; Header.bmiHeader.biCompression =BI_RGB; Header.bmiHeader.biXPelsPerMeter = 0; Header.bmiHeader.biYPelsPerMeter = 0;BITMAPFILEHEADER stFileHdr;stFileHdr.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);stFileHdr.bfSize=sizeof(BITMAPFILEHEADER);stFileHdr.bfType= (WORD)(MLoadIcon(IDR_MAINFRAME);m_Icon2 = AfxGetApp()-LoadIcon(IDI_ICONSTART);m_Icon3 = AfxGetApp()-LoadIcon(IDI_ICONPAUSE);(4)添加CreateTray方法,该方法用于创建系统托盘,并根据状态修改托盘图标。void CKinescopeDlg:CreateTray(int state)/添加系统托盘char lpszTip256;strcpy(lpszTip,屏幕录像);/托盘提示字符NOTIFYICONDATA data;data.cbSize = sizeof(NOTIFYICONDATA); /结构的大小data.hWnd = m_hWnd; /接收消息窗口句柄lstrcpyn(data.szTip,lpszTip,sizeof(lpszTip); /提示信息data.uCallbackMessage = WM_ONTRAY; /消息响应函数data.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; /设置结构成员有效data.uID = IDR_MAINFRAME;/图标标识if(state = 1)/普通状态if(m_Once)/创建托盘图标data.hIcon = m_Icon1;/图标句柄Shell_NotifyIcon(NIM_ADD,&data);/添加系统托盘m_Once = FALSE;else/修改托盘图标data.hIcon = m_Icon1;/图标句柄Shell_NotifyIcon(NIM_MODIFY,&data); /修改系统托盘else if(state = 2)/录像状态data.hIcon = m_Icon2;/图标句柄Shell_NotifyIcon(NIM_MODIFY,&data); /修改系统托盘else if(state = 3)/暂停状态data.hIcon = m_Icon3;/图标句柄Shell_NotifyIcon(NIM_MODIFY,&data); /修改系统托盘(5)声明自定义消息响应函数OnTray。afx_msg void OnTray(WPARAM wParam, LPARAM lParam);(6)添加消息映射。ON_MESSAGE(WM_ONTRAY,OnTray)(7)添加消息响应函数的实现代码。void CKinescopeDlg:OnTray(WPARAM wParam, LPARAM lParam)if(lParam = WM_LBUTTONDBLCLK) /双击鼠标ShowWindow(SW_RESTORE);/恢复窗口的显示(8)处理窗体的WM_CLOSE事件,在窗体关闭时删除系统托盘图标。void CKinescopeDlg:OnClose() /删除系统托盘NOTIFYICONDATA data;data.cbSize = sizeof(NOTIFYICONDATA);/结构的大小data.hWnd = m_hWnd; /接收消息窗口句柄data.hIcon = m_Icon1; /图标句柄Shell_NotifyIcon(NIM_DELETE,&data);/删除托盘图标CDialog:OnClose();8.2.7 获得磁盘的剩余空间在使用屏幕录像模块时,首先要选择录像的存储位置,由于录像文件比较大,所以在选择存储位置时,程序会判断当前磁盘的剩余空间,如果剩余空间低于300M,则提示用户空间不足。可以使用GetDiskFreeSpaceEx函数获得磁盘的剩余空间信息。语法如下:BOOL GetDiskFreeSpaceEx( LPCTSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailableToCaller, PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes );参数说明:lpDirectoryName:不包括卷名的磁盘根路径名。lpFreeBytesAvailableToCaller:磁盘可用字节数。lpTotalNumberOfBytes:磁盘空间总大小。lpTotalNumberOfFreeBytes:可用磁盘空间大小。获得磁盘剩余空间的实现代码如下:ULARGE_INTEGER totalsize;ULARGE_INTEGER freesize;ULARGE_INTEGER availablesize;CString str,temp,path;m_Path.GetWindowText(path);/获得编辑框中磁盘路径str = path.Left(3);/获得盘符:GetDiskFreeSpaceEx(str,&totalsize,&freesize,&availablesize);/获得磁盘空间temp.Format(%ldM,totalsize.QuadPart/1024/1024);/计算磁盘空间m_Place.SetWindowText(剩余空间:+temp);/显示剩余空间if(totalsize.QuadPart/1024/1024 300)MessageBox(剩余空间不足300M,请整理磁盘);8.2.8 动态生成录像文件名在屏幕录像模块中,用户选择了存储文件夹以后,程序自动搜索当前文件夹中的AVI文件,并将文件名添加到列表中,然后根据列表中的文件名自动生成当前录像文件用的文件名。动态生成录像文件名的实现过程如下:(1)添加自定义函数SetFileList,该函数用于将当前文件夹中的AVI文件的文件名插入到列表中。void CKinescopeDlg:SetFileList()CString path;m_Path.GetWindowText(path);/获得文件夹路径CFileFind file;if(path.Right(1) != )path +=*.avi;BOOL bf;bf = file.FindFile(path);/搜索AVI文件int i=0;while(bf)bf = file.FindNextFile();/搜索下一个文件CString fileName;fileName = file.GetFileName();/获得文件名m_List.InsertItem(i,fileName.Left(fileName.GetLength()-4);/插入到列表中i+;SetFileName();/设置录像文件名CString str;str.Format(%d,i);m_StatusBar.SetPaneText(1,当前文件数:+str);/设置面板文本(2)添加自定义函数SetFileName,该函数根据列表中的数据生成文件名,例如:当前文件夹下没有AVI文件,则生成的文件名为录像1,如果文件夹中有录像文件,则生成的文件名自动在录像文件数上加1。void CKinescopeDlg:SetFileName()int count = m_List.GetItemCount();/获得列表项数量int flag=0;CString strName;int i=1;while(1)strName.Format(录像%d,i);/设置录像名for(int j=0;jcount;j+)if(strName != m_List.GetItemText(j,0)/与列表项进行比较flag+;if(flag=count)goto end;i+;flag = 0;end:strName.Format(录像%d,i);/设置录像文件名m_Name.SetWindowText(strName);/显示录像文件名8.3 主窗体设计8.3.1 概述在屏幕录像模块的主窗体中,用户可以设置录像文件名和存储位置,并可以进行录像和抓图,还可以对已有录像文件进行播放、重命名、另存为、查看时间和删除等操作,屏幕录像模块的主窗体如图8.2所示。图8.2 屏幕录像8.3.2 界面设计屏幕录像模块主窗体的界面设计过程如下:(1)创建一个基于对话框的应用程序。(2)向工程中导入图标资源,修改位图ID。(3)向对话框中添加控件,包括两个群组控件、5个静态文本控件、3个编辑框控件、两个图片控件、一个复选框控件、一个列表视图控件和一个按钮控件,控件的属性设置如表8.1所示。表8.1 控件属性设置表控件ID控件属性关联变量IDC_FRAMEType:Frame、Color:BlackCStaticm_FrameIDC_PICTUREType:Bi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025入团积极分子培训考试题库含答案详解【突破训练】
- 2019年军队文职统一考试《专业科目》经济学类-会计学试题(解析)
- 2025年贵港市公安局招聘50名警务辅助人员的笔试模拟试题及答案详解1套
- 2025年度国务院国资委物资机关服务中心招聘(2人)考前自测高频考点模拟试题附答案详解(b卷)
- 2025山东济宁市兖州区事业单位招聘(教育类)9人考前自测高频考点模拟试题及答案详解一套
- 2025年大连市西岗区教育系统自主招聘应届毕业生(第三批)笔试备考试题含答案详解(满分必刷)
- 2025山东枣庄市皮肤病性病防治院招聘备案制人员4人考前自测高频考点模拟试题及答案详解1套
- 2025年长治市公安机关招聘警务辅助人员补聘考前自测高频考点模拟试题附答案详解
- 2025杭州桐庐县事业单位招聘高学历人员和工作人员36人模拟试卷及答案详解(新)
- 2025团校入团培训考试试卷题库【夺冠系列】附答案详解
- 2025年中铁水务集团有限公司招聘笔试参考题库含答案解析
- 蒸汽管道工程施工方案
- 云南省烟花爆竹经营单位主要负责人考试练习题1(100题)附答案
- 夏季预防空调病宣传
- 营养指导员技能实践考试题
- DB41T 1338-2016 石窟文物三维数字化技术规范
- psw零件提交保证书
- 2024年新华社招聘笔试参考题库附带答案详解
- 高级职业培训师(三级)职业资格鉴定考试题库(含答案)
- 赣州交通控股集团招聘笔试题库2024
- 计算机使用技能练兵竞赛参考答案
评论
0/150
提交评论