改进版截图函数(主要解决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
原创粉丝点击