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在屏幕上显示一张图片。 首先,理解DirectDraw的基础概念至关重要。DirectDraw的主要目标是提高2D图形的渲染速度,它通过直接与硬件交互来实现这一目标,从而避免了...
在提供的压缩包文件中,"directDraw"可能包含了关于DirectDraw的教程文档、示例代码和可能的源代码项目。通过学习这些材料,你可以深入了解如何使用DirectDraw进行2D图形编程,以及如何利用其特性来优化应用程序的...
接下来,代码可能涉及创建一个DirectDraw窗口。这包括设置窗口类,创建窗口,并调用`IDirectDraw7::SetCooperativeLevel`来指定应用程序与桌面如何共享资源。此外,还需要设置显示模式,可能通过`IDirectDraw7::...
在提供的DEMO源代码中,"快视"是一个典型的DirectDraw应用示例,它可能展示了如何快速地在屏幕上显示图像或视频流。快视可能利用DirectDraw的双缓冲技术来避免闪烁,通过交换主表面和后台表面来实现平滑的画面更新。...
本教程将深入讲解如何在窗口模式下使用DirectDraw实现动画。 首先,我们从“DirectDraw窗口模式”开始。窗口模式与全屏模式相对,它允许应用程序在标准的Windows窗口中运行,与其他应用程序并行。在窗口模式下使用...
`A10.CPP`是C++源代码文件,其中包含了游戏的主要实现代码。`DDUTIL.CPP`可能包含DirectDraw相关的辅助函数,如初始化、绘制、刷新屏幕等操作。`A10.DSP`和`A10.DSW`是Visual Studio项目文件,用于构建和管理工程。`...
这个压缩包中的"directxtest"可能包含源代码、编译后的可执行文件、相关资源文件等,供学习者分析和调试。通过研究这些代码,开发者可以学习如何利用DirectDraw进行副显卡的图形输出,以及如何在双显示器环境下进行...
DirectDraw是一种在Windows平台上进行高性能图形和视频处理的API(应用程序接口)。...通过这个项目,你可以学习到如何利用DirectDraw实现高效的2D视频播放,这对于游戏开发和多媒体应用的优化具有重要的价值。
这个"direct draw 绘图Demo 源码"很可能是为了教学或演示Direct Draw的基本用法而编写的代码样本。 在Direct Draw中,以下是一些核心概念和知识点: 1. **初始化Direct Draw**:使用`DirectDrawCreate`函数创建一...
在压缩包文件“gcl1219”中,可能包含了游戏Demo的源代码、资源文件或编译后的可执行程序。分析这些文件可以帮助我们更好地理解开发者的实现方法,学习如何在实际项目中应用DirectDraw和DirectInput。如果你打算深入...
标题"FHCam.rar_Renderer_directdraw"表明这是一个与DirectDraw渲染器相关的源代码包。DirectDraw是微软Windows API的一部分,主要用于2D图形加速,特别是在游戏和视频播放领域。它提供了低级别的硬件访问,允许...
DirectDraw是Microsoft...总的来说,"demo6_3.rar_directdraw"提供了一个学习DirectDraw基本操作的机会,通过阅读和分析"demo6_3.cpp"的源代码,开发者可以深入理解DirectDraw如何在实际应用中工作,提升2D图形的效率。
这个压缩包中的"Text"文件可能是游戏源代码的一部分,包括了上述DirectDraw应用的实现细节。初学者可以通过阅读和理解代码来学习如何在实际项目中运用DirectDraw技术。不过,由于DirectDraw已经过时,学习Direct3D...
- `smart_directdraw_src.zip`可能包含Smart DirectDraw Classes的完整源代码,通过阅读和学习这些源码,开发者可以更好地理解类库的工作原理,并根据需要进行定制。 - 示例代码通常包含初始化、创建表面、交换...
在描述中提到的"directDraw_BMP_YUV显示rgb,yuv",可能是指程序实现了从BMP文件加载RGB数据,通过DirectDraw进行YUV转换,并在屏幕上以这两种颜色空间的形式显示图像。这个过程通常涉及以下几个步骤: 1. 加载BMP...
1. **Primary Surface**:这是DirectDraw的核心组成部分,它是屏幕上的默认绘图表面,直接与显示器关联。创建Primary Surface时,通常会映射到屏幕分辨率,并且是系统显示内容的基础。我们可以通过调用`IDirectDraw:...
这个示例代码提供了一个基本的框架,但实际的`DrawYV12`函数会更复杂,因为它需要处理图像数据的加载、内存分配、DirectDraw接口的初始化以及错误处理等细节。此外,对于性能考虑,可能还需要优化内存管理、减少不必...
在这个"DIRECTDRAW源码"中,我们可以通过VC(Visual C++)源代码来学习如何利用DirectDraw进行编程。 DirectDraw的主要功能包括: 1. **双缓冲技术**:这是避免屏幕闪烁和图像撕裂的关键。通过在内存中创建一个...
在本压缩包文件"DirectDraw动画VC源代码"中,我们找到了一个使用VC++编程语言实现的DirectDraw示例,该示例展示了如何通过DirectDraw创建7张图片的循环播放动画效果。 首先,了解DirectDraw的基本概念是非常重要的...
源代码项目可能包含了如何初始化DirectDraw,创建和管理Surface,以及执行Blitting操作的示例。通常,这会涉及以下步骤: 1. 初始化DirectDraw:首先,你需要创建一个DirectDraw对象,这是通过调用`...