MFC 截图(存储与显示)

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里面;

经过转换后就变的正常了!

MFC 截图(存储与显示)_第1张图片

如果你想把他作为一个文件保存起来,那么就不需要转化了,因为图片的刷新也是从左下角开始的;

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!希望大家多多指点!


你可能感兴趣的:(mfc截图)