2590|0

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于截图不能成功 [复制链接]

//拷贝截图到文件,lpRect 代表选定区域
HBITMAP CIECaptureDlg::CopyScreenToBitmap(LPRECT lpRect,BOOL bSave)
{
         HDC       hScrDC, hMemDC;      
        // 屏幕和内存设备描述表
        HBITMAP   hBitmap, hOldBitmap;   
        // 位图句柄
        int       nX, nY, nX2, nY2;      
        // 选定区域坐标
        int       nWidth, nHeight;
        //the pointer will save all pixel point's color value
         BYTE  *lpBitmapBits = NULL;

         // 确保选定区域不为空矩形
        if ( IsRectEmpty( lpRect ) )
        {
                return NULL;
        }
        //为屏幕创建设备描述表
        hScrDC = CreateDC( _T( "DISPLAY" ), NULL, NULL, NULL );
        //为屏幕设备描述表创建兼容的内存设备描述表
        hMemDC = CreateCompatibleDC( hScrDC );
       
        // 获得选定区域坐标
        nX  = lpRect->left;
        nY  = lpRect->top;
        nX2 = lpRect->right;
        nY2 = lpRect->bottom;

        //确保选定区域是可见的
        if ( nX < 0 )
        {
                nX = 0;
        }
        if ( nY < 0 )
        {
                nY = 0;
        }
        if ( nX2 > m_xScreen )
        {
                nX2 = m_xScreen;
        }
        if ( nY2 > m_yScreen )
        {
                nY2 = m_yScreen;
        }
        nWidth  = nX2 - nX;
        nHeight = nY2 - nY;
    //initialize the struct BITMAPINFO for the bitmap infomation,
    //in order to use the function CreateDIBSection
    //on wince os, each pixel stored by 24 bits(biBitCount=24)
    //and no compressing(biCompression=0)
    BITMAPINFO RGB24BitsBITMAPINFO;
    memset( &RGB24BitsBITMAPINFO, 0, sizeof(BITMAPINFO) );
    RGB24BitsBITMAPINFO.bmiHeader.biSize     = sizeof(BITMAPINFOHEADER);
    RGB24BitsBITMAPINFO.bmiHeader.biWidth    = nWidth;
    RGB24BitsBITMAPINFO.bmiHeader.biHeight   = nHeight;
    RGB24BitsBITMAPINFO.bmiHeader.biPlanes   = 1;
    RGB24BitsBITMAPINFO.bmiHeader.biBitCount = 24;
   
    //use the function CreateDIBSection and SelectObject
    //in order to get the bitmap pointer : lpBitmapBits
    hBitmap = CreateDIBSection( hMemDC, (BITMAPINFO*)&RGB24BitsBITMAPINFO,
                      DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0 );
   // 把新位图选到内存设备描述表中
   hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
       
   // 把屏幕设备描述表拷贝到内存设备描述表中
   if(bSave)
   {
        //创建兼容DC,当bSave为真时把开始保存的全屏位图,按截取矩形大小保存
        CDC dcCompatible;
        dcCompatible.CreateCompatibleDC( CDC::FromHandle( hMemDC ) );
        dcCompatible.SelectObject( m_pBitmap );
        
        BitBlt( hMemDC, 0, 0, nWidth, nHeight, dcCompatible, nX, nY, SRCCOPY );

        //bimap file header in order to write bmp file
        BITMAPFILEHEADER bmBITMAPFILEHEADER;
        memset(&bmBITMAPFILEHEADER, 0, sizeof(BITMAPFILEHEADER));
        bmBITMAPFILEHEADER.bfType    = 0x4d42;  //bmp  
        bmBITMAPFILEHEADER.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
        bmBITMAPFILEHEADER.bfSize    = bmBITMAPFILEHEADER.bfOffBits + ((nWidth*nHeight)*3); ///3=(24 / 8)
               
         //保存文件名及路径
         int filecount = 0;
        CString name;
        name.Format( _T( "picture%d.bmp" ), filecount++ );
               
        CFile file;
        if( file.Open(name, CFile::modeCreate|CFile::modeWrite) )
        {
            file.Write( &bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER) );
            file.Write( &(RGB24BitsBITMAPINFO.bmiHeader), sizeof(BITMAPINFOHEADER) );
            file.Write( lpBitmapBits, 3*nWidth*nHeight );
            file.Close();
        }
   }
   else
   {
        BitBlt( hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY,   SRCCOPY );
    }
       
    //得到屏幕位图的句柄
    hBitmap = (HBITMAP)SelectObject( hMemDC, hOldBitmap );
       
    //清除
    DeleteDC( hScrDC );
    DeleteDC( hMemDC );
               
    // 返回位图句柄
    return hBitmap;
}
这是我的截图图像并保存到本地的一个函数
但是在截图的时候,保存到本地后,打开BMP图像显示“绘图失败”,但有时打开BMP图像显示的是截取到的图片。
有达人指点下
看这个函数有什么问题?
谢谢
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表