<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    1.1.0-學習Opencv與MFC混合編程之---全屏截圖,保存為BMP圖像(并增加快捷鍵)

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

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

    Ø  添加全屏截圖菜單項,菜單項的屬性如下;

    RFID設備管理軟件

    Ø  為該菜單項建立類向導。

    編輯消息處理函數如下

    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


    Ø  目前的快捷鍵為:

    RFID設備管理軟件

    Ø  添加新的快捷鍵,在最后一行的虛線處,點擊鼠標右鍵添加:屬性如下

    RFID設備管理軟件

    Ø  添加之后的資源界面為:

     

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

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全