• 1.1.0-学习Opencv与MFC混合编程之---全屏截图,保存为BMP图像(并增加快捷键)


    源代码:http://download.csdn.net/detail/nuptboyzhb/3961677

    Ø  添加全屏截图菜单项,菜单项的属性如下;


    Ø  为该菜单项建立类向导。

    编辑消息处理函数如下

    voidCCVMFCView::OnPrintscreen()

    {

            

             CRect rect;

             //HBITMAP hMap;

             rect.left = 0;

             rect.top = 0;

             rect.right =GetSystemMetrics(SM_CXSCREEN);

             rect.bottom =GetSystemMetrics(SM_CYSCREEN);

             //-------------------------------------------

             HDC hScrDC, hMemDC;     

             // 屏幕和内存设备描述表

             HBITMAP hBitmap,hOldBitmap;  

             // 位图句柄

             int       nX, nY, nX2, nY2;     

             // 选定区域坐标

             int       nWidth, nHeight;     

             // 位图宽度和高度

             int       xScrn, yScrn;        

             // 屏幕分辨率

             // 确保选定区域不为空矩形

             //为屏幕创建设备描述表

             hScrDC = CreateDC("DISPLAY",NULL, NULL, NULL);

             //为屏幕设备描述表创建兼容的内存设备描述表

             hMemDC = CreateCompatibleDC(hScrDC);

             // 获得选定区域坐标

             nX = rect.left;

             nY = rect.top;

             nX2 =rect.right;

             nY2 =rect.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);

            

             CFileDialogdlg(false,"*.bmp","Test.bmp",OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,"保存文本(*.bmp)|*.bmp|所有文件(*.*)|*.*||");

             CString strPath("");

             if(dlg.DoModal() == IDOK)

             {

                       strPath=dlg.GetPathName();

                       //----------------以下为保存图像句柄为hBitmap,路径为lpFileName的图像

                LPSTR lpFileName=(LPTSTR)(LPCTSTR)strPath;

                       HDC  hDC;   //设备描述表   

                       int iBits;  //当前显示分辨率下每个像素所占字节数   

                       WORD    wBitCount;  //位图中每个像素所占字节数

                       //定义调色板大小, 位图中像素字节大小 ,  位图文件大小 , 写入文件字节数

                       DWORD          dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;

                       BITMAP          Bitmap;     //位图属性结构

                       BITMAPFILEHEADER   bmfHdr; //位图文件头结构

                       BITMAPINFOHEADER   bi;     //位图信息头结构

                       LPBITMAPINFOHEADER lpbi;          //指向位图信息头结构

                       HANDLE       fh, hDib, hPal;

                       HPALETTE     hOldPal=NULL;

                       //定义文件,分配内存句柄,调色板句柄

                      

                       //计算位图文件每个像素所占字节数

                       hDC =CreateDC("DISPLAY",NULL,NULL,NULL);

                       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 = 32;

                      

                       //计算调色板大小

                       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;

                       //为位图内容分配内存

                       /*xxxxxxxx计算位图大小分解一下(解释一下上面的语句)xxxxxxxxxxxxxxxxxxxx

                       //每个扫描行所占的字节数应该为4的整数倍,具体算法为:

                       int biWidth =(Bitmap.bmWidth*wBitCount) / 32;

                       if((Bitmap.bmWidth*wBitCount)% 32)

                       biWidth++; //不是整数倍的加1

                       biWidth *= 4;//到这里,计算得到的为每个扫描行的字节数。

                       dwBmBitsSize = biWidth *Bitmap.bmHeight;//得到大小

                       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/

                       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,(BITMAPINFO *)lpbi,DIB_RGB_COLORS);

                       //恢复调色板  

                       if (hOldPal)

                       {

                                SelectPalette(hDC,hOldPal, TRUE);

                                RealizePalette(hDC);

                                ::ReleaseDC(NULL,hDC);

                       }

                       //创建位图文件   

                       fh=CreateFile(lpFileName,GENERIC_WRITE,0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL);

                       // 设置位图文件头

                       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,sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize , &dwWritten, NULL);

                       //清除  

                       GlobalUnlock(hDib);

                       GlobalFree(hDib);

                       CloseHandle(fh);

            MessageBox("已完成保存!");

             }

    }





    Ø  “全屏截图”菜单项的资源ID是ID_PRINTSCREEN

    Ø  打开资源:Accelerator


    Ø  目前的快捷键为:


    Ø  添加新的快捷键,在最后一行的虚线处,点击鼠标右键添加:属性如下


    Ø  添加之后的资源界面为:

     

    from:http://blog.csdn.net/nupt123456789/article/details/7100134

  • 相关阅读:
    10月15日模拟赛题解
    NOIp初赛题目整理
    【meet in the mid】【qbxt2019csp刷题班day1C】birthday
    【字符串】 manacher算法
    【border树】【P2375】动物园
    【border相关】【P3426】 [POI2005]SZA-Template
    【字符串】 Z-algorithm
    【字符串】KMP
    【神奇性质】【P5523】D [yLOI2019] 珍珠
    【线段树】【P5522】[yLOI2019] 棠梨煎雪
  • 原文地址:https://www.cnblogs.com/lidabo/p/3501309.html
Copyright © 2020-2023  润新知