當前位置:首頁 » 操作系統 » vc截圖源碼

vc截圖源碼

發布時間: 2022-05-07 00:33:37

1. VC++截圖編程:如何能完整地截圖要求是能夠截取層級窗口的方法。

BitBlt 的最後一個參數,通常我們用SRCCOPY,對吧?
改成 SRCCOPY | CAPTUREBLT
原因和細節請參看MSDN

2. VC++截圖方法

HBITMAP CopyDCToBitmap(HDC hScrDC, LPRECT lpRect)
{
HDC hMemDC;
// 屏幕和內存設備描述表
HBITMAP hBitmap,hOldBitmap;
// 點陣圖句柄
int nX, nY, nX2, nY2;
// 選定區域坐標
int nWidth, nHeight;
// 點陣圖寬度和高度
// 確保選定區域不為空矩形
if (IsRectEmpty(lpRect))
return NULL;

// 獲得選定區域坐標
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
//為指定設備描述表創建兼容的內存設備描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 創建一個與指定設備描述表兼容的點陣圖
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
// 把新點陣圖選到內存設備描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
// 把屏幕設備描述表拷貝到內存設備描述表中
StretchBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,nWidth,nHeight,SRCCOPY);
//BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY);
//得到屏幕點陣圖的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
//清除

DeleteDC(hMemDC);
DeleteObject(hOldBitmap);
// 返回點陣圖句柄
return hBitmap;
}
//把HBITMAP保存成點陣圖
BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{
HDC hDC;
//當前解析度下每象素所佔位元組數
int iBits;
//點陣圖中每象素所佔位元組數
WORD wBitCount;
//定義調色板大小, 點陣圖中像素位元組大小 ,點陣圖文件大小 , 寫入文件位元組數
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
//點陣圖屬性結構
BITMAP Bitmap;
//點陣圖文件頭結構
BITMAPFILEHEADER bmfHdr;
//點陣圖信息頭結構
BITMAPINFOHEADER bi;
//指向點陣圖信息頭結構
LPBITMAPINFOHEADER lpbi;
//定義文件,分配內存句柄,調色板句柄
HANDLE fh, hDib, hPal,hOldPal=NULL;

3. VC++編程,做BMP圖片的截圖!!

調用API
1)OpenClipboard
2)EmptyClipBoard
3) SetClipBoardData

剛剛幫你找的。不知道這些對你有用沒?

4. 求VC++屏幕錄象並附帶截圖的源代碼

你要求和你的付出,好像不是很成正比呀。

這個項目要做的話可以,恐怕要出錢的。

5. VC++優化截屏如何實現

兩種方法。
第二種:參考一位網友的。
MFC中就有截取屏幕的相關函數:
ScrDC.CreateDC("DISPLAY", NULL, NULL, NULL);

具體函數如下:

//存儲背景圖片(成員變數)
CBitmap* m_pBackBitmap;

/*******************************
* 拷貝屏幕固定區域
* 參數:
* xStartPt - 拷貝屏幕的起始點X坐標
* yStartPt - 拷貝屏幕的起始點Y坐標
* width - 拷貝寬度
* height - 拷貝高度
* xToCopy - 拷貝目的地的起始點X坐標
* yToCopy - 拷貝目的地的起始點Y坐標
*******************************/
void CMyFun::CopyScreenToBitmap(xStartPt, yStartPt, width, height, xToCopy, yToCopy)
{
//NEW資源(調用一次重新拷貝一次)
if (m_pBackBitmap != NULL)
{
delete m_pBackBitmap;
m_pBackBitmap = NULL;
}

m_pBackBitmap = new CBitmap();

CDC ScrDC,MemDC;

ScrDC.CreateDC("DISPLAY", NULL, NULL, NULL);
MemDC.CreateCompatibleDC(&ScrDC);

m_pBackBitmap->CreateCompatibleBitmap(&ScrDC,width,height);
MemDC.SelectObject(m_pBackBitmap);

//開始拷貝
MemDC.BitBlt(xStartPt, yStartPt, width, height,&ScrDC,xToCopy,yToCopy,SRCCOPY);

ScrDC.DeleteDC();
MemDC.DeleteDC();
}
調用函數,實現截取全屏:

//取的屏幕解析度
int width = ::GetSystemMetrics(SM_CXSCREEN);
int height = ::GetSystemMetrics(SM_CYSCREEN);

this->CopyScreenToBitmap(0,0,width,height,0,0);

//這時m_pBackBitmap指向的CBitmap對象就存著全屏的圖象了

第一種:先截取屏幕保存為BMP格式文件,然後在VC資源中導入該點陣圖。
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1為導入點陣圖的ID。
CDC dc;
dc.CreateCompatibleDC(pDC); //創建兼容DC
dc.SelectObject(&bitmap); //選進設備表

BITMAP bmp;
bitmap.GetBitmap(&bmp);

CRect rect;
GetClientRect(&rect);

pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY); //注意參數SRCCOPY

6. 求一個用VC6.0寫的截圖程序

CRect rect(m_StartPoint.x,m_StartPoint.y,m_EndPoint.x,m_EndPoint.y);
//ClientToScreen(rect);
m_leftdown =0;
Invalidate(FALSE);//更新界面
CClientDC dc(this);

/* HBITMAP bitmap =CreateCompatibleBitmap(dc.m_hDC,rect.Width(),rect.Height());*/
//復制矩形內容
CDC bmemDC;
bmemDC.CreateCompatibleDC(GetDC());
CBitmap bmprect;
bmprect.CreateCompatibleBitmap(GetDC(),rect.Width(),rect.Height());
bmemDC.SelectObject(&bmprect);

/////////////////////////////////////////////////////////////////////////////////////////
BITMAP mbitmap;
//將點陣圖信息填充到一個緩沖區內
bmprect.GetBitmap(&mbitmap);
bmemDC.BitBlt(0,0,mbitmap.bmWidth,mbitmap.bmHeight,GetDC(),m_StartPoint.x,m_StartPoint.y,SRCCOPY);
BITMAPINFOHEADER bih = {0};//點陣圖信息頭
bih.biBitCount = mbitmap.bmBitsPixel;//每個像素位元組大小
bih.biCompression = BI_RGB;
bih.biHeight = mbitmap.bmHeight;//高度
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = mbitmap.bmWidthBytes * mbitmap.bmHeight;//圖像數據大小
bih.biWidth = mbitmap.bmWidth;//寬度

BITMAPFILEHEADER bfh = {0};//點陣圖文件頭
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到點陣圖數據的偏移量
bfh.bfSize = bfh.bfOffBits + mbitmap.bmWidthBytes * mbitmap.bmHeight;//文件總的大小
bfh.bfType = (WORD)0x4d42;
byte * p = new byte[mbitmap.bmWidthBytes * mbitmap.bmHeight];//申請內存保存點陣圖數據
GetDIBits(bmemDC.m_hDC, (HBITMAP) bmprect.m_hObject, 0, rect.Height(), p,
(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//獲取點陣圖數據
////////////////////////////////////////////////////////////////////////////////////////
FILE *fp = fopen("bitfile.bmp", "w+b");
fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);//寫入點陣圖文件頭
fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);//寫入點陣圖信息頭
fwrite(p, 1, mbitmap.bmWidthBytes * mbitmap.bmHeight, fp);//寫入點陣圖數據
fclose(fp);

7. 已有一個基於vc的用本機攝像頭錄像,截圖的代碼,如何加工成一個類似c/s模式的。

用socket來做網路功能,實現相互能發收數據,圖片也是數據,把圖片的參數信息(如尺寸等)發送到伺服器端,然後把圖片的數據發送到伺服器端,伺服器端收到後根據參數和數據將圖像繪制在界面上,考慮到傳輸效率,還可以對圖像進行編碼(圖片壓縮方式如jpg,gif等)後再傳輸,伺服器端當然就要相應的做解碼工作了。
要做成這個東西,兩個方面的知識要掌握好:1.視頻採集,圖像,圖像顯示原理,2.socket網路編程。
網上可以找到視頻傳輸的代碼,自己可以下回來研究研究。

8. 怎麼用VC 實現屏幕截圖

http://blog.csdn.net/zhoujielunmi/article/details/8140887
改成MFC版本即可。

9. 用VC++6.0做一個小型屏幕截圖程序

很多軟體有這種功能,如qq、抓圖工具,不過這種源代碼很稀少哦,一般不會外泄的。
而且這么有難度的問題居然一點懸賞分都不給。

10. 怎麼用VC++實現屏幕截圖

可以,而且不是非常復雜,但是,我建議你學習一下基本的Windows API程序設計。不然以後會碰到無窮無盡的問題,沒有這個基礎,是不行的。代碼給你隨便貼一段吧:HBITMAP CopyDCToBitmap(HDC hScrDC, LPRECT lpRect)
{
HDC hMemDC;
// 屏幕和內存設備描述表
HBITMAP hBitmap,hOldBitmap;
// 點陣圖句柄
int nX, nY, nX2, nY2;
// 選定區域坐標
int nWidth, nHeight;
// 點陣圖寬度和高度
// 確保選定區域不為空矩形
if (IsRectEmpty(lpRect))
return NULL;

// 獲得選定區域坐標
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
//為指定設備描述表創建兼容的內存設備描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 創建一個與指定設備描述表兼容的點陣圖
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
// 把新點陣圖選到內存設備描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
// 把屏幕設備描述表拷貝到內存設備描述表中
StretchBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,nWidth,nHeight,SRCCOPY);
//BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY);
//得到屏幕點陣圖的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
//清除

DeleteDC(hMemDC);
DeleteObject(hOldBitmap);
// 返回點陣圖句柄
return hBitmap;
}
//把HBITMAP保存成點陣圖
BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{
HDC hDC;
//當前解析度下每象素所佔位元組數
int iBits;
//點陣圖中每象素所佔位元組數
WORD wBitCount;
//定義調色板大小, 點陣圖中像素位元組大小 ,點陣圖文件大小 , 寫入文件位元組數
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
//點陣圖屬性結構
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 wBitCount = 24;

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.biClrImportant = 0;
bi.biClrUsed = 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, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);

//恢復調色板
if (hOldPal)
{
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}
//創建點陣圖文件
fh = CreateFile(FileName, 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;
}

熱點內容
創建實例在linux 發布:2024-10-07 18:03:16 瀏覽:485
黑客學c語言 發布:2024-10-07 17:37:39 瀏覽:941
ftp比較文件 發布:2024-10-07 17:04:56 瀏覽:39
如何配置幼兒園園內的玩具 發布:2024-10-07 17:04:23 瀏覽:863
干支日演算法 發布:2024-10-07 16:47:17 瀏覽:502
sqlin語句用法 發布:2024-10-07 16:45:05 瀏覽:640
直出伺服器怎麼樣 發布:2024-10-07 15:41:36 瀏覽:477
比亞迪唐dmi哪個配置性價比 發布:2024-10-07 15:19:28 瀏覽:903
編譯器按變數 發布:2024-10-07 15:07:03 瀏覽:775
怎麼忘記電腦wifi密碼怎麼辦 發布:2024-10-07 15:02:18 瀏覽:426