zoukankan      html  css  js  c++  java
  • MFC 屏幕截图方法

    //获取当前屏幕的并且保存图片
    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);
  • 相关阅读:
    Scala-高阶函数
    Scala-高阶函数
    Fragment学习笔记
    android中progress进度条的使用
    spinner下拉列表
    GridView
    利用jsp和servlet,MySQL实现简易报表
    android中TimePicker和DatePicker的简单使用
    android适配器及监听点击和滚动在ListView中的使用
    android简易计算器
  • 原文地址:https://www.cnblogs.com/Travis990/p/4651467.html
Copyright © 2011-2022 走看看