<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    weidagang2046的專欄

    物格而后知致
    隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
    數據加載中……

    用VC進行屏幕截取編程

    ---- 屏幕截取是令人比較感興趣的事情.雖然現在有不少應用程序如HYPERSNAP等可以用來截取你所喜歡的屏幕畫面,但是如果能把這個功能加到自己的程序中,就更能利用它強大的作用.

    ---- 下面用VC來逐步介紹在Windows95下的實現過程.首先我們要確定屏幕截取的區域,用LPRECT結構來定義.可以截取一個窗口,或整個屏幕.以下代碼把選定的屏幕區域拷貝到位圖中.

    HBITMAP CopyScreenToBitmap(LPRECT lpRect)
    //lpRect 代表選定區域
    {
    HDC???????hScrDC, 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);
    ???//為屏幕設備描述表創建兼容的內存設備描述表
    ???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 = SelectObject(hMemDC, hBitmap);
    ???// 把屏幕設備描述表拷貝到內存設備描述表中
    BitBlt(hMemDC, 0, 0, nWidth, nHeight,
    hScrDC, nX, nY, SRCCOPY);
    ???//得到屏幕位圖的句柄
    ???hBitmap = SelectObject(hMemDC, hOldBitmap);
    ???//清除
    ???DeleteDC(hScrDC);
    ???DeleteDC(hMemDC);
    ???// 返回位圖句柄
    ???return hBitmap;
    }
    ???
    得到屏幕位圖句柄以后,我們
    可以把屏幕內容粘貼到剪貼板上.
    ????if (OpenClipboard(hWnd))
    ?????//hWnd為程序窗口句柄
    ??????{
    ????????//清空剪貼板
    ????????EmptyClipboard();
    ????????//把屏幕內容粘貼到剪貼板上,
    ????????hBitmap 為剛才的屏幕位圖句柄
    ????????SetClipboardData(CF_BITMAP, hBitmap);
    ????????//關閉剪貼板
    ????????CloseClipboard();
    ??????}
    ???我們也可以把屏幕內容以位圖格式存到磁盤文件上.
    ??????
    int SaveBitmapToFile(HBITMAP hBitmap ,
    LPSTR lpFileName) //hBitmap 為剛才的屏幕位圖句柄
    {???? ?//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 = 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;
    ???//計算調色板大小
    ???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, hPal, FALSE);
    ??????RealizePalette(hDC);
    ???}
    ???// 獲取該調色板下新的像素值
    ???GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,
    ?(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
    ????+dwPaletteSize,
    ?(BITMAPINFOHEADER *)
    ????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);
    ???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);
    }

    from: http://www.cnsdn.com.cn/inc/show.asp?id=3472

    posted on 2006-10-01 23:36 weidagang2046 閱讀(265) 評論(0)  編輯  收藏 所屬分類: Windows

    主站蜘蛛池模板: 久久久久久曰本AV免费免费| baoyu777永久免费视频| 蜜桃AV无码免费看永久| 亚洲av日韩av不卡在线观看| 久久一区二区三区免费| 亚洲一区精品无码| 永久在线观看免费视频 | 免费A级毛片无码视频| 亚洲第一AAAAA片| 久久w5ww成w人免费| 亚洲另类小说图片| 在线免费观看一区二区三区| 亚洲日韩国产二区无码| 国产无遮挡吃胸膜奶免费看| 麻豆安全免费网址入口| 国产成人亚洲精品影院| 毛片在线播放免费观看| 亚洲成A∨人片在线观看无码| 青春禁区视频在线观看直播免费| 亚洲中文字幕久久精品无码A| 免费一级毛片不卡在线播放| 一级毛片不卡免费看老司机| 国产亚洲精品岁国产微拍精品| 美丽姑娘免费观看在线观看中文版| 亚洲成a人片在线网站| 在线A级毛片无码免费真人| 极品美女一级毛片免费| 亚洲AV永久青草无码精品| 国内精自视频品线六区免费| 亚洲精品人成网线在线播放va| 亚洲区不卡顿区在线观看| 性无码免费一区二区三区在线| 亚洲中文字幕无码一去台湾| 国产精品免费小视频| 日本三级在线观看免费| 久久精品国产亚洲AV忘忧草18| 亚洲国产精品无码久久九九 | 国产在线观看麻豆91精品免费| 国产亚洲中文日本不卡二区| 亚洲成a人一区二区三区| 免费人成在线观看网站品爱网|