MFC提供CWindowDC类,专门处理Window;
问题:如何获取屏幕截图?
解决办法:先获取屏幕区域,创建兼容缓冲区,转化图片;
代码:
CDC memDC;
CBitmap memBitmap,*pOldBitmap;
CWindowDC dc(GetDesktopWindow());
memDC.CreateCompatibleDC(&dc);
int nWidth,nHeight;
CRect rect;
GetDesktopWindow()->GetWindowRect(rect);
ClientToScreen(&rect);
nWidth=rect.Width();
nHeight=rect.Height();
memBitmap.CreateCompatibleBitmap(&dc,nWidth,nHeight);
pOldBitmap=memDC.SelectObject(&memBitmap);
memDC.BitBlt(0,0,nWidth,nHeight,&dc,0,0,SRCCOPY);
BITMAPFILEHEADER BMFhead;
BITMAPINFOHEADER BMIhead;
BMFhead.bfReserved1=0;
BMFhead.bfReserved2=0;
BMFhead.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
BMFhead.bfSize=BMFhead.bfOffBits+nWidth*nHeight*4;
BMFhead.bfType=0x4d42;
BMIhead.biBitCount=32;
BMIhead.biClrImportant=0;
BMIhead.biClrUsed=0;
BMIhead.biSizeImage=0;
BMIhead.biXPelsPerMeter=0;
BMIhead.biYPelsPerMeter=0;
BMIhead.biCompression=BI_RGB;
BMIhead.biHeight=nHeight;
BMIhead.biPlanes=1;
BMIhead.biSize=sizeof(BITMAPINFOHEADER);
BMIhead.biWidth=nWidth;
DWORD dwSize=nWidth*nHeight*4;
int size = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwSize;
DWORD *pData=new DWORD[dwSize/4];
GetDIBits(memDC.m_hDC,(HBITMAP)memBitmap.m_hObject,0,nHeight,(BYTE*)pData,(LPBITMAPINFO)&BMIhead,DIB_RGB_COLORS);
这时候,我们已经获取了当前屏幕的位图数据,存储在pData里面;
如果我想马上显示,或者通过网络发送到别人的电脑上,直接显示;我们可以对数据进行处理,然后进行发送;
#define SETH2
#define SETW SETH
DWORD *mydata = new DWORD[dwSize/4];
CBitmap *b = new CBitmap;
DWORD i,j;
/* 数据转化处理 */
for(i=0; i<nHeight/SETH; i++)
for(j=0; j<nWidth/SETW; j++)
mydata[(nHeight/SETH-1-i)*nWidth/SETW+j] = pData[i*SETH*nWidth+j*SETW];
b->CreateBitmap(BMIhead.biWidth/SETW,BMIhead.biHeight/SETH,BMIhead.biPlanes,BMIhead.biBitCount,mydata);
这里我对图片进行压缩处理,因为我不想要那么大的图片;并且如果不处理的话,显示出来的图片是倒置的;
这是没有经过转化的效果,因为在截图的时候,他的扫描时从左下角开始的(从左往右,从下往上);所以我需要对它进行处理下,然后再加载到Cbitmap里面;
经过转换后就变的正常了!
如果你想把他作为一个文件保存起来,那么就不需要转化了,因为图片的刷新也是从左下角开始的;
CFile file;
file.Open("test.bmp",CFile::modeCreate | CFile::modeWrite);
file.Write(&BMFhead,sizeof(BITMAPFILEHEADER));
file.Write(&BMIhead,sizeof(BITMAPINFOHEADER));
file.Write(pData,dwSize);
file.Close();
这样就存储完成了!你可以直接打开看看;
最后记住,一定要对你new的内存进行delete;
b->DeleteObject();
delete b;
delete mydata;
delete pData;
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
This all!希望大家多多指点!