码迷,mamicode.com
首页 > 编程语言 > 详细

MFC 屏幕截图方法

时间:2015-07-16 18:16:28      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

//获取当前屏幕的并且保存图片
LRESULT CFeetScanView::SaveViewBMP(WPARAM wParam, LPARAM lParam)
{
    CRect rect;
    this->GetClientRect(&rect);
    rect.left = 20;
    rect.top = 80;
    CBitmap m_bitmap;
    m_bitmap.m_hObject = CopyScreenToBitmap(rect);

    char szFileName[_MAX_PATH];
    char szPath[_MAX_PATH];
    GetConfigMgr()->GetModuleDirectory( szPath);
    sprintf( szFileName, "%s\\image.png", szPath);
    SaveBitmapToFile(m_bitmap,szFileName);
    return 0;
}


HBITMAP CFeetScanView::CopyScreenToBitmap(LPRECT lpRect) 
{ 
   // 屏幕和内存设备描述表 
    HDC hScrDC=0, hMemDC; 
    // 位图句柄 
    HBITMAP hBitmap, hOldBitmap; 
    // 选定区域坐标 
    int nX, nY, nX2, nY2; 
    // 位图宽度和高度 
    int nWidth, nHeight; 
    // 屏幕分辨率 
    int xScrn, yScrn;     
    // 确保选定区域不为空矩形 
    // if (IsRectEmpty(lpRect)) 
    // return NULL; 
    //为屏幕创建设备描述表 
    hScrDC = CreateDC( "DISPLAY", NULL, NULL, NULL); 
    //
    int ok=1; 
    if(hScrDC==NULL)  //如果创建失败
    {    
        ok=0;
    }
    //为屏幕设备描述表创建兼容的内存设备描述表 
    hMemDC = CreateCompatibleDC(hScrDC);     
    // 获得选定区域坐标 
    nX = lpRect-> left; 
    nY = lpRect-> top; 
    nX2 = lpRect-> right; 
    nY2 = lpRect-> bottom; 
    // 获得屏幕分辨率 
    xScrn = GetDeviceCaps(hScrDC, HORZRES); 
    yScrn = GetDeviceCaps(hScrDC, VERTRES); 
    //确保选定区域是可见的 
    if (nX <0) 
        nX = 0; 
    if (nY < 0) 
        nY = 0; 
    if (nX2 > xScrn) 
        nX2 = xScrn; 
    if (nY2 > yScrn) 
        nY2 = yScrn; 
    nWidth = nX2 - nX; 
    nHeight = nY2 - nY; 
    
    // 创建一个与屏幕设备描述表兼容的位图 
    hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight); 
    
    // 把新位图选到内存设备描述表中 
    hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); 
    
    // 把屏幕设备描述表拷贝到内存设备描述表中 
    BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY); 
    
    //得到屏幕位图的句柄 
    hBitmap =(HBITMAP)SelectObject(hMemDC, hOldBitmap); 
    
    //清除 
    DeleteDC(hScrDC); 
    DeleteDC(hMemDC); 
    
    // 返回位图句柄 
    return hBitmap; 
}

BOOL CFeetScanView::SaveBitmapToFile(HBITMAP hBitmap, LPCTSTR lpFileName ) 
{ 
    HDC hDC; //设备描述表 
    int iBits; //当前显示分辨率下每个像素所占字节数 
    WORD wBitCount; //位图中每个像素所占字节数 
    DWORD dwPaletteSize=0, //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 
        dwBmBitsSize, 
        dwDIBSize, dwWritten; 
    BITMAP Bitmap; //位图属性结构 
    BITMAPFILEHEADER bmfHdr; //位图文件头结构 
    BITMAPINFOHEADER bi; //位图信息头结构 
    LPBITMAPINFOHEADER lpbi; //指向位图信息头结构 

    HANDLE fh, hDib, hPal,hOldPal=NULL; //定义文件,分配内存句柄,调色板句柄 

    //计算位图文件每个像素所占字节数 
    HDC hWndDC = CreateDC("DISPLAY",NULL,NULL,NULL); 
    hDC = ::CreateCompatibleDC( hWndDC ) ; 
    iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); 
    DeleteDC(hDC); 

    if (iBits <= 1) 
        wBitCount = 1; 
    else if (iBits <= 4) 
        wBitCount = 4; 
    else if (iBits <= 8) 
        wBitCount = 8; 
    else if (iBits <= 24) 
        wBitCount = 24; 
    else 
        wBitCount = 24 ; 

    //计算调色板大小 
    if (wBitCount <= 8) 
        dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD); 

    //设置位图信息头结构 
    GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap); 
    bi.biSize = sizeof(BITMAPINFOHEADER); 
    bi.biWidth = Bitmap.bmWidth; 
    bi.biHeight = Bitmap.bmHeight; 
    bi.biPlanes = 1; 
    bi.biBitCount = wBitCount; 
    bi.biCompression = BI_RGB; 
    bi.biSizeImage = 0; 
    bi.biXPelsPerMeter = 0; 
    bi.biYPelsPerMeter = 0; 
    bi.biClrUsed = 0; 
    bi.biClrImportant = 0; 

    dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32) * 4 * Bitmap.bmHeight ; 

    //为位图内容分配内存 
    hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER)); 
    lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); 
    *lpbi = bi; 

    // 处理调色板 
    hPal = GetStockObject(DEFAULT_PALETTE); 
    if (hPal) 
    { 
        hDC = ::GetDC(NULL); 
        hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); 
        RealizePalette(hDC); 
    } 

    // 获取该调色板下新的像素值 
    GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, 
        (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) 
        +dwPaletteSize, 
        (LPBITMAPINFO ) 
        lpbi, DIB_RGB_COLORS); 

    //恢复调色板 
    if (hOldPal) 
    { 
        SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); 
        RealizePalette(hDC); 
        ::ReleaseDC(NULL, hDC); 
    } 

    //创建位图文件 
    fh = CreateFile(lpFileName, GENERIC_WRITE, 
        0, NULL, CREATE_ALWAYS, 
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); 

    if (fh == INVALID_HANDLE_VALUE) 
        return FALSE; 

    // 设置位图文件头 
    bmfHdr.bfType = 0x4D42; // "BM" 
    dwDIBSize = sizeof(BITMAPFILEHEADER) 
        + sizeof(BITMAPINFOHEADER) 
        + dwPaletteSize + dwBmBitsSize; 
    bmfHdr.bfSize = dwDIBSize; 
    bmfHdr.bfReserved1 = 0; 
    bmfHdr.bfReserved2 = 0; 
    bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) 
        + (DWORD)sizeof(BITMAPINFOHEADER) 
        + dwPaletteSize; 

    // 写入位图文件头 
    WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); 

    // 写入位图文件其余内容 
    WriteFile(fh, (LPSTR)lpbi, dwDIBSize, 
        &dwWritten, NULL); 

    //清除 
    GlobalUnlock(hDib); 
    GlobalFree(hDib); 
    CloseHandle(fh); 

    return TRUE; 

}

//将当前的图片进行90度显示出来
    CDC* pDC1 = m_left_pic.GetDC();
    Graphics graph(pDC1->GetSafeHdc());
    CRect rect;
    m_left_pic.GetClientRect(rect);

    char szFileName[_MAX_PATH];
    char szPath[_MAX_PATH];
    GetConfigMgr()->GetModuleDirectory( szPath);
    sprintf( szFileName, "%s\\image.png", szPath);
    WCHAR wszWideString[_MAX_PATH];
    wcscpy(wszWideString, CT2CW(szFileName));
    Image image(wszWideString);

    REAL width  = (REAL)image.GetWidth();
    REAL height = (REAL)image.GetHeight();
    int nX = 0;
    int nY = 0;
    Point point90[] = {
        Point(nX + height,nY),
        Point(nX + height,nY+width),
        Point(nX,nY)
    };

    graph.DrawImage(&image, point90,3);
    ReleaseDC(pDC1);

 

MFC 屏幕截图方法

标签:

原文地址:http://www.cnblogs.com/Travis990/p/4651467.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!