利用MFC截取对话框图像或者截取全屏图像

来源:互联网 发布:海关进出口数据查询 编辑:程序博客网 时间:2024/05/12 16:15

可能用到的库:

#include <afxwin.h>#include <windows.h>


在下面的程序里,我构造一个CDialog对话框,点击它的OK按钮之后,程序进行截取保存工作。全屏图像保存到test2.bmp文件里。而对话框图像保存在test.bmp中(注释掉的部分)。
代码:

void CScreenShotDlg::OnBnClickedOk(){// TODO: 在此添加控件通知处理程序代码//CClientDC dc(this);//只截对话框,用这句HWND hwnd = ::GetDesktopWindow();//截整个屏幕,用从这往下4句HDC hdc = ::GetDC(hwnd);CDC dc;dc.Attach(hdc);CRect rc;//GetClientRect(&rc);//只截对话框,用这句rc.SetRect(0,0, GetSystemMetrics(   SM_CXSCREEN   ), GetSystemMetrics(   SM_CYSCREEN   ));//截整个屏幕,用这句int iBitPerPixel = dc.GetDeviceCaps(BITSPIXEL);int iWidth = rc.Width();int iHeight = rc.Height();CDC memDC;memDC.CreateCompatibleDC(&dc);CBitmap memBitmap, *oldBitmap;memBitmap.CreateCompatibleBitmap(&dc, iWidth, iHeight);oldBitmap = memDC.SelectObject(&memBitmap);memDC.BitBlt(0,0,iWidth, iHeight, &dc, 0,0,SRCCOPY);BITMAP bmp;memBitmap.GetBitmap(&bmp);FILE *fp = fopen("test2.bmp", "wb");BITMAPINFOHEADER bih;memset(&bih, 0, sizeof(bih));bih.biBitCount = bmp.bmBitsPixel;bih.biCompression = BI_RGB;//表示不压缩bih.biHeight = bmp.bmHeight;bih.biPlanes = 1;//位平面数,必须为1bih.biSize = sizeof(BITMAPINFOHEADER);bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;bih.biWidth = bmp.bmWidth;BITMAPFILEHEADER bfh;memset(&bfh, 0, sizeof(bfh));bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;bfh.bfType = (WORD)0x4d42;//必须表示"BM"fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);fwrite(&bih, 1, sizeof(bih), fp);byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];GetDIBits(memDC.m_hDC, (HBITMAP)memBitmap.m_hObject, 0, iHeight, p, (LPBITMAPINFO)&bih, DIB_RGB_COLORS);fwrite(p, 1, bmp.bmWidthBytes * bmp.bmHeight, fp);delete [] p;fclose(fp);memDC.SelectObject(oldBitmap);}

效果:

全屏截取:



只截取对话框:


0 0
原创粉丝点击