`
zgymm2008
  • 浏览: 12133 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

DirectDraw实现屏幕截图的原代码

 
阅读更多
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技术,不能够扑捉到视屏图象!
分享到:
评论

相关推荐

    VC DirectDraw在屏幕显示一张图片示例

    在这个示例中,我们将深入探讨如何使用DirectDraw在屏幕上显示一张图片。 首先,理解DirectDraw的基础概念至关重要。DirectDraw的主要目标是提高2D图形的渲染速度,它通过直接与硬件交互来实现这一目标,从而避免了...

    directDraw

    在提供的压缩包文件中,"directDraw"可能包含了关于DirectDraw的教程文档、示例代码和可能的源代码项目。通过学习这些材料,你可以深入了解如何使用DirectDraw进行2D图形编程,以及如何利用其特性来优化应用程序的...

    简单DIRECTDRAW源码

    接下来,代码可能涉及创建一个DirectDraw窗口。这包括设置窗口类,创建窗口,并调用`IDirectDraw7::SetCooperativeLevel`来指定应用程序与桌面如何共享资源。此外,还需要设置显示模式,可能通过`IDirectDraw7::...

    DirectX组件之DirectDraw

    在提供的DEMO源代码中,"快视"是一个典型的DirectDraw应用示例,它可能展示了如何快速地在屏幕上显示图像或视频流。快视可能利用DirectDraw的双缓冲技术来避免闪烁,通过交换主表面和后台表面来实现平滑的画面更新。...

    DirectDraw窗口模式下的动画

    本教程将深入讲解如何在窗口模式下使用DirectDraw实现动画。 首先,我们从“DirectDraw窗口模式”开始。窗口模式与全屏模式相对,它允许应用程序在标准的Windows窗口中运行,与其他应用程序并行。在窗口模式下使用...

    DirectDraw飞机小游戏源码

    `A10.CPP`是C++源代码文件,其中包含了游戏的主要实现代码。`DDUTIL.CPP`可能包含DirectDraw相关的辅助函数,如初始化、绘制、刷新屏幕等操作。`A10.DSP`和`A10.DSW`是Visual Studio项目文件,用于构建和管理工程。`...

    directdraw副显卡输出

    这个压缩包中的"directxtest"可能包含源代码、编译后的可执行文件、相关资源文件等,供学习者分析和调试。通过研究这些代码,开发者可以学习如何利用DirectDraw进行副显卡的图形输出,以及如何在双显示器环境下进行...

    DirectDraw绘制YUV数据

    DirectDraw是一种在Windows平台上进行高性能图形和视频处理的API(应用程序接口)。...通过这个项目,你可以学习到如何利用DirectDraw实现高效的2D视频播放,这对于游戏开发和多媒体应用的优化具有重要的价值。

    direct draw 绘图Demo 源码

    这个"direct draw 绘图Demo 源码"很可能是为了教学或演示Direct Draw的基本用法而编写的代码样本。 在Direct Draw中,以下是一些核心概念和知识点: 1. **初始化Direct Draw**:使用`DirectDrawCreate`函数创建一...

    directdraw做的坦克的游戏demo,用到directinput

    在压缩包文件“gcl1219”中,可能包含了游戏Demo的源代码、资源文件或编译后的可执行程序。分析这些文件可以帮助我们更好地理解开发者的实现方法,学习如何在实际项目中应用DirectDraw和DirectInput。如果你打算深入...

    FHCam.rar_Renderer_directdraw

    标题"FHCam.rar_Renderer_directdraw"表明这是一个与DirectDraw渲染器相关的源代码包。DirectDraw是微软Windows API的一部分,主要用于2D图形加速,特别是在游戏和视频播放领域。它提供了低级别的硬件访问,允许...

    demo6_3.rar_directdraw

    DirectDraw是Microsoft...总的来说,"demo6_3.rar_directdraw"提供了一个学习DirectDraw基本操作的机会,通过阅读和分析"demo6_3.cpp"的源代码,开发者可以深入理解DirectDraw如何在实际应用中工作,提升2D图形的效率。

    DirectDraw 的应用

    这个压缩包中的"Text"文件可能是游戏源代码的一部分,包括了上述DirectDraw应用的实现细节。初学者可以通过阅读和理解代码来学习如何在实际项目中运用DirectDraw技术。不过,由于DirectDraw已经过时,学习Direct3D...

    Smart DirectDraw ClassesDirectDraw类

    - `smart_directdraw_src.zip`可能包含Smart DirectDraw Classes的完整源代码,通过阅读和学习这些源码,开发者可以更好地理解类库的工作原理,并根据需要进行定制。 - 示例代码通常包含初始化、创建表面、交换...

    directDraw BMP YUV

    在描述中提到的"directDraw_BMP_YUV显示rgb,yuv",可能是指程序实现了从BMP文件加载RGB数据,通过DirectDraw进行YUV转换,并在屏幕上以这两种颜色空间的形式显示图像。这个过程通常涉及以下几个步骤: 1. 加载BMP...

    DirectDraw-tutorial.zip_directdraw_surface

    1. **Primary Surface**:这是DirectDraw的核心组成部分,它是屏幕上的默认绘图表面,直接与显示器关联。创建Primary Surface时,通常会映射到屏幕分辨率,并且是系统显示内容的基础。我们可以通过调用`IDirectDraw:...

    用DirectDraw显示YV12图像.pdf

    这个示例代码提供了一个基本的框架,但实际的`DrawYV12`函数会更复杂,因为它需要处理图像数据的加载、内存分配、DirectDraw接口的初始化以及错误处理等细节。此外,对于性能考虑,可能还需要优化内存管理、减少不必...

    DIRECTDRAW源码

    在这个"DIRECTDRAW源码"中,我们可以通过VC(Visual C++)源代码来学习如何利用DirectDraw进行编程。 DirectDraw的主要功能包括: 1. **双缓冲技术**:这是避免屏幕闪烁和图像撕裂的关键。通过在内存中创建一个...

    DirectDraw动画VC源代码

    在本压缩包文件"DirectDraw动画VC源代码"中,我们找到了一个使用VC++编程语言实现的DirectDraw示例,该示例展示了如何通过DirectDraw创建7张图片的循环播放动画效果。 首先,了解DirectDraw的基本概念是非常重要的...

    Introduction to DirectDraw and Surface Blitting

    源代码项目可能包含了如何初始化DirectDraw,创建和管理Surface,以及执行Blitting操作的示例。通常,这会涉及以下步骤: 1. 初始化DirectDraw:首先,你需要创建一个DirectDraw对象,这是通过调用`...

Global site tag (gtag.js) - Google Analytics