<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一区二区三区四区| 成人无遮挡毛片免费看| 亚洲中文字幕无码mv| 在线免费观看a级片| 看免费毛片天天看| 免费国产人做人视频在线观看| 美女被免费网站在线视频免费| 四虎影视免费永久在线观看| 国产亚洲综合精品一区二区三区| 国产乱人免费视频| 国产免费内射又粗又爽密桃视频| 亚洲色欲色欲www在线丝| 人人揉揉香蕉大免费不卡| 亚洲免费人成视频观看| 黑人粗长大战亚洲女2021国产精品成人免费视频| 亚洲中文字幕乱码熟女在线| 国产在线a不卡免费视频| aa毛片免费全部播放完整| 亚洲天天做日日做天天欢毛片| 1000部禁片黄的免费看| 亚洲一区二区三区写真| mm1313亚洲国产精品美女| 国产精品免费高清在线观看| 亚洲日韩乱码中文无码蜜桃臀| 噜噜嘿在线视频免费观看| 中文字幕乱码系列免费| 亚洲高清不卡视频| 精品国产免费一区二区| 不卡视频免费在线观看| 亚洲欧洲日产国产最新| 亚洲精品国产电影| 69天堂人成无码麻豆免费视频| 久久亚洲精品11p| 久久久久久久亚洲Av无码| jizzjizz亚洲| 国产精品视频免费观看| eeuss草民免费| 亚洲一区二区三区91|