MFC屏幕录制程序编写

源代码:http://download.csdn.net/detail/nuptboyzhb/4136686

新增头文件及全局变量:

#include<math.h>//数学函数库的头文件

#include<Vfw.h>//增加AVI视频处理函数的头文件

#pragma comment(lib,"Vfw32.lib")//连接库Vfw32.lib

#pragma comment(lib,"Winmm.lib")//链接库

//定义AVI视频处理函数所需的结构体变量

AVISTREAMINFO strhdr;

PAVIFILE pfile;

PAVISTREAM ps;

PAVISTREAM pComStream;

AVICOMPRESSOPTIONS pCompressOption;

AVICOMPRESSOPTIONS FAR * opts[1] = {&pCompressOption};

HRESULT hr;

int nFrames = 0; //定义视频中帧的个数

BOOL m_timer=TRUE;//定时器运行状态标志

UINT timer_num=0;//标记定时器的名称

BOOL m_IsPause=FALSE;//是否暂停标志

增加OnTimer定时器消息

// TODO: Add your message handler code here and/or call default

if(m_timer)//如果上一次的定时器程序已经运行完,才执行下面的代码

{

m_timer=FALSE;//本次定时,正在运行,未结束前,不得进行下次运行

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;//屏幕图像的总像素数

BYTE* lpData = new BYTE[size];//申请一个大小为size的BYTE型数组,用于存放桌面图像的数据

int panelsize = 0; //记录调色板大小

if(bitmap.bmBitsPixel<16)//判断是否为真彩色位图

panelsize = (int)pow(2,bitmap.bmBitsPixel*sizeof(RGBQUAD));

BITMAPINFOHEADER *pBInfo = new BITMAPINFOHEADER;//定义位图信息头结构体

//初始化位图信息头

pBInfo->biBitCount = bitmap.bmBitsPixel;

pBInfo->biClrImportant = 0;

pBInfo->biCompression = 0;

pBInfo->biHeight = bitmap.bmHeight;

pBInfo->biPlanes = bitmap.bmPlanes;

pBInfo->biSize = sizeof(BITMAPINFOHEADER);

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);

//将图像数据保存到pdata

if(nFrames == 0)//如果是第一帧

{

CString rate="3";//3帧

CString filename="111.avi";//文件名

AVIFileOpen(&pfile,filename,OF_WRITE | OF_CREATE,NULL);//打开或创建AVI文件

memset(&strhdr, 0, sizeof(strhdr));//初始化信息头为0

//初始化AVI视频流信息结构体

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);//创建AVI文件流

opts[0]->fccType = streamtypeVIDEO;

opts[0]->fccHandler = mmioStringToFOURCC("MSVC", 0);

opts[0]->dwQuality = 7500;

opts[0]->dwBytesPerSecond = 0;

opts[0]->dwFlags = AVICOMPRESSF_VALID || AVICOMPRESSF_KEYFRAMES;

opts[0]->lpFormat = 0;

opts[0]->cbFormat = 0;

opts[0]->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 ; //释放内存

m_timer=TRUE;//定时器程序可以继续响应

}

增加录制按钮

timer_num=SetTimer(1,100,0);//启动定时器

m_timer=TRUE;//设置定时器可用

AVIFileInit(); //初始化AVI文件

增加停止按钮

if (timer_num)

{

KillTimer(timer_num);

}

m_timer=FALSE;

if (pComStream)

{

AVIStreamClose(pComStream);

}

if (ps)

{

AVIStreamClose(ps);

}

if(pfile != NULL)

AVIFileRelease(pfile);

AVIFileExit();

nFrames =0;

增加暂停按钮

if(m_IsPause ==FALSE)

{

m_IsPause = !m_IsPause;

if (timer_num)

{

KillTimer(timer_num);

}

}

else

{

m_IsPause = !m_IsPause;

timer_num=SetTimer(1,100,NULL);

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值