DirectDraw实现屏幕截图的原代码
HBITMAP CDialogcapDlg::CopyScreenToBitmapDX(LPRECT lpRect)
{
HBITMAP hBitmap;
HDC hDC=NULL;
int height,width,bitsize,palettebit;
HRESULT hres;
height = lpRect->bottom - lpRect->top;
width = lpRect->right - lpRect->left;
InitDirectX(); //初始化DirectDraw环境,使lpDDSPrimay为主页面,lpDDSBack为页面在内存的备份。具体代码可在论坛其它文章了找到。
hres=lpDDSBack->BltFast(lpRect->left,lpRect->top,lpDDSPrimay,lpRect,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT);
lpDDSBack->GetDC(&hDC);
hBitmap=CreateCompatibleBitmap(hDC,width,height);
DeleteDC(hDC);
DDSURFACEDESC desc;
ZeroMemory(&desc,sizeof(desc));
desc.dwSize=sizeof(desc);
lpDDSBack->Lock(lpRect,&desc,DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL);
bitsize=((desc.dwWidth*desc.ddpfPixelFormat.dwRGBBitCount+31)/32)*4*desc.dwHeight;
palettebit=0;
if (desc.ddpfPixelFormat.dwRGBBitCount <=
palettebit = (1 << desc.ddpfPixelFormat.dwRGBBitCount) * sizeof(RGBQUAD);
LPBITMAPINFOHEADER lpbi;
LPBYTE lpbit;
lpbi=(LPBITMAPINFOHEADER)GlobalLock(hBitmap);
lpbi->biSize=sizeof(BITMAPINFOHEADER);
lpbi->biWidth=desc.dwWidth;
lpbi->biHeight=desc.dwHeight;
lpbi->biPlanes=1;
lpbi->biBitCount=desc.ddpfPixelFormat.dwRGBBitCount;
lpbi->biCompression=BI_BITFIELDS;
lpbi->biSizeImage=bitsize;
lpbi->biXPelsPerMeter=0;
lpbi->biYPelsPerMeter=0;
lpbi->biClrImportant=0;
lpbi->biClrImportant=0;
lpbit=(LPBYTE)(lpbi+1)+palettebit;
memcpy(lpbit,desc.lpSurface,bitsize);
lpDDSBack->Unlock(NULL);
return hBitmap;
}
回复人: wuliangge2001(就这么回事儿) ( ) 信誉:100 2004-3-2 10:50:46 得分:25
我也发一个从视频流界图的吧
CString strFilter = "BMP File (*.bmp)|*.bmp|";
CFileDialog dlgOpen(FALSE, ".bmp", NULL, OFN_HIDEREADONLY, strFilter, NULL);
if (IDOK == dlgOpen.DoModal())
{
CString chFilePath;
chFilePath = dlgOpen.GetFileName();
if (pBV)
{
long bitmapSize = 0;
if (SUCCEEDED(pBV->GetCurrentImage(&bitmapSize, 0)))
{
bool pass = false;
//unsigned char * buffer = new unsigned char[bitmapSize];
if (SUCCEEDED(pBV->GetCurrentImage(&bitmapSize, (long *)bmpbuffer)))
{
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;
lpbi = (LPBITMAPINFOHEADER)bmpbuffer;
int nColors = 1 << lpbi->biBitCount;
if (nColors > 256)
nColors = 0;
hdr.bfType = ((WORD) (''M'' <<
| ''B''); //always is "BM"
hdr.bfSize = bitmapSize + sizeof( hdr );
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD) (sizeof(BITMAPFILEHEADER) + lpbi->biSize +
nColors * sizeof(RGBQUAD));
FILE * file;
file = fopen(chFilePath,"a""b");
fwrite(&hdr,sizeof(BITMAPFILEHEADER),1,file);
fwrite(bmpbuffer, 1,bitmapSize, file);
fclose(file);
}
// delete [] buffer;
}
}
Top
回复人: GodSpeed513(GodSpeed513) ( ) 信誉:97 2004-3-3 1:27:47 得分:0
这些都没有用到DirectX技术,不能够扑捉到视屏图象!
分享到:
相关推荐
采用DirectDraw的H264解压缩源代码和YUV视频播放源代码 从FFMPEG中摘录出来并且调试通过的H264解码的源代码(c文件),没使用FFMPEG编译出来的lib和dll库,可以直接在VS2010环境下单步调试以跟踪解压缩的所用过程细节,...
Qt+DirectDraw实现 参考链接: http://blog.csdn.net/ajaxhe/article/details/7532273
VC DirectDraw在屏幕显示一张图片示例~
DirectDraw下旋转图片的Demo和源代码
深入讲解了Direct Draw的原理及使用(附源代码)。
禁用和开启DirectDraw加速,Direct3D 加速,AGP纹理加速批处理 在使用本程序前,请先确认你已经安装最新的显卡驱动程序 使用说明: 解压缩,XP系统用户直接运行BAT文件,WIN7系统用户,请右键以管理员身份运行,否则...
本资源包含DirectDraw中文手册;DirectDraw PPT中详细介绍DirectDraw的基础——COM,及其应用;DEMO源代码介绍DirectDraw应用实例——快视。
简单DIRECTDRAW源码 win32
C#使用DirectDraw读取并显示图像的实例代码,开发工具为vs2008,得到窗口边界大小,按照新的边界大小显示图片。
win7禁用和开启DirectDraw加速批处理,适用于win7 32位
windows程序设计D2D游戏开发新手学习参考用,自己以前写的一个练手游戏类似魔域实战型的12300行代码,一次传不完其他资源QQ2216908086
directdraw device dll
DirectDraw中文手册 用于音视频开发
用VC实现DirectDraw编程.caj,用CAJview读书器打开
两个小时学会DirectDraw编程, 两个小时学会DirectDraw编程, 两个小时学会DirectDraw编程, 两个小时学会DirectDraw编程,
初学DirectDraw的必备东西....不会让你后悔的.
DirectDraw DDI DirectDraw DDI DirectDraw DDI
direct draw 详细的中文手册。
Direct3D教程+例子源代码.zip
DirectDraw原理与API参考