改进版截图函数(主要解决XP下保存对话框遮挡截图问题)
来源:互联网 发布:刘美麟因为爱情网络 编辑:程序博客网 时间:2024/06/07 01:59
本函数的用法很简单,只需要添加到相应的相应函数中去即可。
我做了个简单的测试程序,已经上传到CSDN共享,欢迎下载测试:http://download.csdn.net/detail/k616358281/7014243
下面是源代码:
(参考了网友们的代代码)
/************************************************************************//*本函数是在网上存在的截图程序的基础上进行了适当的改进。1.本函数集成了存储对话框的调用,可以直接放置到菜单栏的相应函数或者按钮的响应函数中去。2.本函数解决了原函数普遍存在的问题:对话框的遮挡问题,完美实现,不会出现闪屏现象。说明:本函数是在VC6.0环境下编写,系统为XP。由于使用的是静态链接,所以程序包会比较大这个是为了避免出现缺少.dll提示。有问题欢迎交流学习:461770984@qq.com*/// TODO: Add extra validation hereHWND hwnd=::FindWindow("#32770",_T("测试窗口"));//查找目标窗口并获取句柄//ASSERT(hwnd);CRect rect;CRect client_rect;::GetWindowRect(hwnd,&rect);ScreenToClient(&rect);::GetClientRect(hwnd,&client_rect);HDC hScrDC=::GetWindowDC(hwnd);ASSERT(hScrDC);HDC hMemDC=::CreateCompatibleDC(hScrDC);ASSERT(hMemDC);HBITMAP hBitmap=::CreateCompatibleBitmap(hScrDC,client_rect.Width(),client_rect.Height());//不截标题栏(菜单栏同理)//HBITMAP hBitmap=::CreateCompatibleBitmap(hScrDC,rect.Width(),rect.Height());//截标题栏(即非客户区域也截)ASSERT(hBitmap);HBITMAP holdBitmap=(HBITMAP)::SelectObject(hMemDC,hBitmap);// 下面两行与上面截标题栏和不截标题栏对应,默认注释掉了带标题栏的部分。::BitBlt(hMemDC,0,0,rect.Width(),client_rect.Height(),hScrDC,0,client_rect.top-rect.top,SRCCOPY);//::BitBlt(hMemDC,0,0,rect.Width(),rect.Height(),hScrDC,0,0,SRCCOPY);BITMAP bitmap={0};::GetObject(hBitmap,sizeof(BITMAP),&bitmap);BITMAPINFOHEADER bi={0};BITMAPFILEHEADER bf={0};bi.biSize=sizeof(BITMAPINFOHEADER);bi.biWidth=bitmap.bmWidth;bi.biHeight=bitmap.bmHeight;bi.biCompression=BI_RGB;bi.biPlanes=1;bi.biBitCount=24;DWORD dwSize=((bitmap.bmWidth * 24 + 31) / 32) * 4 * bitmap.bmHeight;//这个我也还不知道是为什么这样算,反正就是计算位图的大小(不包括头文件)LPBITMAPINFOHEADER lpbi=(LPBITMAPINFOHEADER)malloc(dwSize+sizeof(BITMAPINFOHEADER));*lpbi=bi;::GetDIBits(hMemDC,hBitmap,0,bitmap.bmHeight,(BYTE*)lpbi+sizeof(BITMAPINFOHEADER),(BITMAPINFO*)lpbi,DIB_RGB_COLORS);dwSize+=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);bf.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);bf.bfSize=dwSize;bf.bfType=0x4d42;//完成截图复制工作,下面就开始保存CFileDialog m_FileDlg(FALSE);m_FileDlg.m_ofn.lpstrFilter="图片(*.bmp)\0*.bmp\0\0";m_FileDlg.m_ofn.lpstrDefExt="bmp";if (IDOK==m_FileDlg.DoModal()){try{CFile file;file.Open(m_FileDlg.GetPathName(),CFile::modeCreate|CFile::modeWrite);file.Write((BYTE*)&bf,sizeof(BITMAPFILEHEADER));file.Write((BYTE*)lpbi,dwSize);file.Close();}catch (CException* e){e->ReportError();e->Delete();}}::free(lpbi);::SelectObject(hMemDC,holdBitmap);::DeleteObject(hBitmap);::DeleteDC(hMemDC);::ReleaseDC(hwnd,hScrDC);
下面是效果图:
0 0
- 改进版截图函数(主要解决XP下保存对话框遮挡截图问题)
- win7 下截图问题
- 问题得以解决 qq截图框下的工具栏模拟
- html2canvas.js网页截图功能(解决截图不全问题)
- html2canvas.js网页截图功能(解决截图不全问题)
- MFC下的OpenCV截图与API函数截图
- 截图预览对话框
- 截图保存格式问题-最好保存为png格式
- 截图和保存图
- 屏幕截图并保存
- Unity3d 截图保存
- 保存摄像头截图
- flex截图 java保存
- 截图和保存
- iOS学习,截图保存
- 截图保存相册功能
- 保存过高清截图
- qq截图如何保存
- SimpleTag_TFIDF++
- TCP
- 招聘之面试流程总结_针对具有一定研发经历的求职者
- hdu 4240 Route Redundancy(最大流)
- 写给想当程序员的朋友
- 改进版截图函数(主要解决XP下保存对话框遮挡截图问题)
- LIRE代码剖析2——Index和Search代码解析
- poj2387
- VC++ 求绝对值函数
- theme508 邮件里面的订单列表信息修改
- eclipse 移植cocos2d-x工程 报错: Program "bash" is not found in PATH
- object 知识总结(案例学习)
- 我的思维导图
- poj2421