MFC学习笔记--截屏

来源:互联网 发布:模拟城市未来之城 mac 编辑:程序博客网 时间:2024/06/08 02:03

一、获取电脑屏幕的HDC
1、HDC GetDC(HWND hWnd),参数为NULL,将获得屏幕的HDC;
FromHandle(HANDLE)可以获取句柄的封装类http://baike.baidu.com/view/3503940.htm
2、CreateDC(_T(“DISPLAY”), NULL, NULL, NULL);
第一个参数为”DISPLAY”可以获取屏幕的HDC,此时其他参数都为NULL
3、HWND GetDesktopWindow(VOID),该函数返回桌面窗口的句柄,通过GetDC可以获取HDC
附:
1、 对象和句柄的区别
对象CDC封装了句柄HDC
转换方法:
CDC->HDC:
pDC->GetSafeHdc()
pDC->m_hDC;
HDC->CDC:
1、CDC dc;(设备结束时,会销毁hDC)
dc.Attach(hDC);
2、CDC *pDC = CDC::FromHandle(hDC);
CBitmap *pBitmap = CBitmap::FromHandle(hBitmap);
注: 设备结束时,不会销毁hDC,hBitmap,但pDC,pBitmap 会在程序空闲时删除。
FromHandle(HANDLE) 先查找由用户定义的内核对象的封装类,如果找到直接返回,没有找到构造一个临时对
像返回。
参考:http://blog.csdn.net/silenough/article/details/6591423
2、 类CWND、CDC的区别
所有跟窗口相关的操作都被封装在CWnd类中;
所有跟绘图相关的操作都被封装在CDC类中。
3、 句柄HWND、HDC区别
HWND句柄是是窗口句柄,描述一个窗口的形状、位置、大小、是否显示、它的父窗口、兄弟窗口、等等的一组数据结
构;
HDC句柄是一个实实在在的用于具体表现这个窗口时,需要对这个窗口有个场合来实现的地方。
转换方法(HWND->HDC):
HWND ->HDC:HDC GetDC( HWND )
二、获取屏幕的长宽值
1、GetSystemMetrics(SM_CXSCREEN); 得到以像素(分辨率)为单位计算的屏幕尺寸。
GetSystemMetrics(SM_CYSCREEN);
2、HWND hwnd=GetDesktopWindow();得到以像素(分辨率)为单位计算的屏幕尺寸。
RECT rect;
GetClientRect(hwnd,&rect);
3、pDC = CDC::FromHandle(GetDC(GetDesktopWindow()));
pDC->GetDeviceCaps(HORZRES);得到以像素(分辨率)为单位计算的屏幕尺寸。
pDC->GetDeviceCaps(VERTRES);
pDC->GetDeviceCaps(BITSPIXEL);获得颜色模式
三、创建内存DC(将会选入屏幕图像的数据)
CDC mDC;
mDC.CreateCompatibleDC(NULL);
此时的CDC内可以储存显示的图像是1*1像素的
CBitmap mBitmap;
mBitmap.CreateCompatibleBitmap(pDC, Width, Height);
建立和屏幕DC兼容的bitmap,长宽是屏幕的长宽值
mDC.SelectObject(&mBitmap);
选入后DC可显示的图像就是Width*Height像素了
四、将屏幕的DC复制到mDC
mDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY);
五、获取屏幕图像的位图数据
这里有两种方法:CBitmap::GetBitmapBits和GetDIBits
1、GetBitmapBits
直接从已复制屏幕图像的mDC获取位图的数据:
BITMAP bitmap;
mBitmap.GetBitmap(&bitmap)
BYTE lpbuffer = new BYTE[bitmap.bmWidthBytes * bitmap.bmHeight];
mBitmap.GetBitmapBits(bitmap.bmWidthBytes * bitmap.bmHeight, lpbuffer);
注:如果从lpbuffer的数据直接显示的位图是上下颠倒的,需要对lpbuffer数据处理。
2、GetDIBits
获取图像信息:
BITMAP bitmap;
mBitmap.GetBitmap(&bitmap)
需要先设置信息头:
BITMAPINFOHEADER bInfo = {0};//位图信息头
bInfo.biBitCount = bmp.bmBitsPixel;//每个像素字节大小
bInfo.biCompression = BI_RGB;
bInfo.biHeight = bmp.bmHeight;//高度
bInfo.biPlanes = 1;
bInfo.biSize = sizeof(BITMAPINFOHEADER);
bInfo.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;//图像数据大小
bInfo.biWidth = bmp.bmWidth;//宽度
分配内存空间:
BYTE lpbuffer = new BYTE[bitmap.bmWidthBytes * bitmap.bmHeight];
获取数据:
GetDIBits(mDC.m_hDC, (HBITMAP) mBitmap.m_hObject, 0, Height, lpbuffer,
(LPBITMAPINFO) &bInfo, DIB_RGB_COLORS);//获取位图数据
**注:**GetDIBits获得的数据和BMP文件的数据顺序相同,不需要再处理
6、保存为BMP图片
设置信息头和文件头:
文件头:
BITMAPFILEHEADERbFile= {0};//位图文件头
bFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bFile.bfSize = bFile.bfOffBits + bitmap.bmWidthBytes *bitmap.bmHeight;//文件总的大小
bFile.bfType = (WORD)0x4d42;
写入文件:
FILE *fp = fopen(“F:\m.bmp”, “w+b”);
fwrite(&bInfo, 1, sizeof(BITMAPFILEHEADER), fp);//写入位图文件头
fwrite(&bFile, 1, sizeof(BITMAPINFOHEADER), fp);//写入位图信息头
fwrite(p, 1,bitmap.bmWidthBytes * bitmap.bmHeight, fp);//写入位图数据
delete []lpbuffer;
fclose(fp);

0 0
原创粉丝点击