MFC截图程序的实现(一)
最近,想自己写个独立的截图程序,网上看了很多资料,大致都一般无二,实现起来也有不少不足之处。最后,还是写了一些实验性的程序,现在贴出来:
以下是我的几点理解:
1、截图,顾名思义,即是将屏幕的某一部分或全部内容截取下来保存成文件。截取整个屏幕我就不说了,下面讲讲如何实现截取某个窗口和自定义范围的截取。
2、截取某个窗口,意思是对某个窗口内的内容进行截图操作,截取的图片以窗口的边界为边界。另外,这里所说的“窗口”包括各种控件窗口,例如对话框上的按钮,输入框等,也包括诸如浏览器地址栏,资源管理器侧边栏等等。
3、截取某个窗口,只要获得它的DC(设备上下文),在“复制”一份就可以了,可是我们要的结果是最终能够存成文件的图片,显然还需要许多后续的操作。
4、如果,仅仅是将某个窗口的图像复制到剪切板会容易得多,先不管如何确定截图窗口的问题,考虑将截图程序的主窗口图像复制到剪切板。
5、介绍第一个函数:功能是将某个窗口的图像复制到剪切板。
void CopyBitmapToClipboard(CWnd *wnd, BOOL FullWnd)
{CDC *dc;if(FullWnd){ /* 抓取整个窗口*/dc = new CWindowDC(wnd);} else{ /* 仅抓取客户区时*/dc = new CClientDC(wnd);} CDC memDC;memDC.CreateCompatibleDC(dc);CBitmap bm;CRect r;if(FullWnd)wnd->GetWindowRect(&r);elsewnd->GetClientRect(&r);CString s;wnd->GetWindowText(s);CSize sz(r.Width(), r.Height());bm.CreateCompatibleBitmap(dc, sz.cx, sz.cy);CBitmap * oldbm = memDC.SelectObject(&bm);memDC.BitBlt(0, 0, sz.cx, sz.cy, dc, 0, 0, SRCCOPY);//直接调用OpenClipboard(),而不用wnd->GetParent()->OpenClipboard();wnd->OpenClipboard();::EmptyClipboard();::SetClipboardData(CF_BITMAP, bm.m_hObject);CloseClipboard();//恢复原始环境memDC.SelectObject(oldbm);bm.Detach(); delete dc;
}
6、函数示例:vc6.0下新建基于基本对话框的MFC工程,工程名123
添加一个按钮,双击为其添加响应函数:
程序片段:
void CMy123Dlg::CopyBitmapToClipboard(CWnd *wnd, BOOL FullWnd)
{CDC *dc;if(FullWnd){ /* 抓取整个窗口*/dc = new CWindowDC(wnd);} else{ /* 仅抓取客户区时*/dc = new CClientDC(wnd);} CDC memDC;memDC.CreateCompatibleDC(dc);CBitmap bm;CRect r;if(FullWnd)wnd->GetWindowRect(&r);elsewnd->GetClientRect(&r);CString s;wnd->GetWindowText(s);CSize sz(r.Width(), r.Height());bm.CreateCompatibleBitmap(dc, sz.cx, sz.cy);CBitmap * oldbm = memDC.SelectObject(&bm);memDC.BitBlt(0, 0, sz.cx, sz.cy, dc, 0, 0, SRCCOPY);//直接调用OpenClipboard(),而不用wnd->GetParent()->OpenClipboard();wnd->OpenClipboard();::EmptyClipboard();::SetClipboardData(CF_BITMAP, bm.m_hObject);CloseClipboard();//恢复原始环境memDC.SelectObject(oldbm);bm.Detach(); delete dc;// 加一句提示MessageBox(_T("复制完成"));
}// 按钮的响应函数
void CMy123Dlg::OnButton1()
{// TODO: Add your control notification handler code hereCWnd * wnd = FromHandle(GetSafeHwnd()); // 将当前窗口的句柄转化为CWndCopyBitmapToClipboard(wnd, FALSE); // 调用复制函数
}
运行结果:
新建一个Word文档,按Ctrl + V,查看结果:
将函数的第2个参数改为TRUE:
显然,函数功能实现了,如果不要求存成文件,那么剩下的问题就是如何确定函数的第一个参数的问题了。
MFC截图程序的实现(一)相关推荐
- MFC截图程序的实现(五)
上篇所讲的程序,造成截图不正确的原因显然是CopyBitmapToClipboard这个函数.关于这个函数这里就先不提了, 后面会具体讲. 现在的问题是:如果要使用许多截图,必须一一将截图先存成文件. ...
- MFC截图程序的实现(四)
前面几篇文章介绍了如何进行窗口截图并保存至剪切板,现在将完整的代码贴出来: 主要是两个文件:( 完整源代码:http://download.csdn.net/detail/wwkaven/748791 ...
- MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应...
MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文: http://blog.csdn.net/supermanking/article/detail ...
- vc++/mfc截图 保存和显示
## 1. 实现截图程序的api接口 ## HBITMAP CaptureScreen(LPRECT lpRect)//lpRect为NULL时表示全屏幕截图 {HDC hdc, hdcMem ;HB ...
- MFC应用程序中添加控制台窗口
在MFC程序中输出调试信息的方法有两种,一种是使用TRACE宏,可以向Output窗口输出调试信息:另一种是用MessageBox,弹出消息框来输出调试信息,但会影响程序的运行. 其实有一种方法可以更 ...
- 使用VC++6.0创建MFC对话框程序
使用VC++6.0创建MFC对话框程序
- 基于VTK的MFC应用程序开发(3)
基于VTK的MFC应用程序开发(3) 分类: VTK应用示例 2013-05-17 13:37 3307人阅读 评论(23) 收藏 举报 目录(?)[+] 之前介绍了基于VTK的单文档应用程序开发,并 ...
- 基于VTK的MFC应用程序开发(2)
基于VTK的MFC应用程序开发(2) 分类: VTK应用示例 2013-03-29 13:03 6647人阅读 评论(18) 收藏 举报 MFCVTK图像重采样 目录(?)[+] 现在基于VTK的MF ...
- 基于VTK的MFC应用程序开发(1)
基于VTK的MFC应用程序开发(1) 分类: VTK应用示例 2013-03-24 22:35 4195人阅读 评论(28) 收藏 举报 CMakeVTKMFC 目录(?)[+] 提到MFC一般都不陌 ...
最新文章
- OpenCV计算时刻calculate moments的实例(附完整代码)
- 项目整合一级缓存和二级缓存
- jasmine.spy对象的and.returnValue方法单步调试
- tidevice.exceptions.MuxServiceError: Could not start service: com.apple.testmanagerd.lockdown.secure
- JS模拟的Ping程序 (Web Ping)
- 公路交通安全设施设计细则_转让江苏公路交通工程(公路安全设施分项)二级资质(包安许)...
- Tomcat 项目代码上线步骤详解
- 涨到5倍!从“缺芯”到“芯贵” 芯片涨价影响至啤酒、肥皂行业
- mongodb 默认端口号_你的爬虫数据储存在哪?MongoDB入门篇
- 6 redis 编译失败_Redis6 Windows 版本编译
- 三校生高考计算机专业试题,三校生高考计算机试卷1
- 搜索引擎duckduckgo
- python 字符串转字典的几种方法
- 计算机课有平时成绩吗,大学计算机基础课程平时成绩评定方法探究.doc
- 软件架构 - 架构风格总结
- Mogrt是什么?如何在PR中安装.Mogrt文件并使用 Premiere基本图形MOGRT文件
- 记录DBeaver报SQL 错误 [1064] [42000]: #42000的一个坑
- 网络安全,非对称加密,对称加密和非对称加密的区别
- HTML网页设计期末课程大作业~动漫樱桃小丸子5页表格div+css学生网页设计作业源码...
- 小红书店铺需不需要开?具体怎么操作?