源代码: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);
}