最近,想自己写个独立的截图程序,网上看了很多资料,大致都一般无二,实现起来也有不少不足之处。最后,还是写了一些实验性的程序,现在贴出来:

以下是我的几点理解:

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截图程序的实现(一)相关推荐

  1. MFC截图程序的实现(五)

    上篇所讲的程序,造成截图不正确的原因显然是CopyBitmapToClipboard这个函数.关于这个函数这里就先不提了, 后面会具体讲. 现在的问题是:如果要使用许多截图,必须一一将截图先存成文件. ...

  2. MFC截图程序的实现(四)

    前面几篇文章介绍了如何进行窗口截图并保存至剪切板,现在将完整的代码贴出来: 主要是两个文件:( 完整源代码:http://download.csdn.net/detail/wwkaven/748791 ...

  3. MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应...

    MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/detail ...

  4. vc++/mfc截图 保存和显示

    ## 1. 实现截图程序的api接口 ## HBITMAP CaptureScreen(LPRECT lpRect)//lpRect为NULL时表示全屏幕截图 {HDC hdc, hdcMem ;HB ...

  5. MFC应用程序中添加控制台窗口

    在MFC程序中输出调试信息的方法有两种,一种是使用TRACE宏,可以向Output窗口输出调试信息:另一种是用MessageBox,弹出消息框来输出调试信息,但会影响程序的运行. 其实有一种方法可以更 ...

  6. 使用VC++6.0创建MFC对话框程序

    使用VC++6.0创建MFC对话框程序

  7. 基于VTK的MFC应用程序开发(3)

    基于VTK的MFC应用程序开发(3) 分类: VTK应用示例 2013-05-17 13:37 3307人阅读 评论(23) 收藏 举报 目录(?)[+] 之前介绍了基于VTK的单文档应用程序开发,并 ...

  8. 基于VTK的MFC应用程序开发(2)

    基于VTK的MFC应用程序开发(2) 分类: VTK应用示例 2013-03-29 13:03 6647人阅读 评论(18) 收藏 举报 MFCVTK图像重采样 目录(?)[+] 现在基于VTK的MF ...

  9. 基于VTK的MFC应用程序开发(1)

    基于VTK的MFC应用程序开发(1) 分类: VTK应用示例 2013-03-24 22:35 4195人阅读 评论(28) 收藏 举报 CMakeVTKMFC 目录(?)[+] 提到MFC一般都不陌 ...

最新文章

  1. OpenCV计算时刻calculate moments的实例(附完整代码)
  2. 项目整合一级缓存和二级缓存
  3. jasmine.spy对象的and.returnValue方法单步调试
  4. tidevice.exceptions.MuxServiceError: Could not start service: com.apple.testmanagerd.lockdown.secure
  5. JS模拟的Ping程序 (Web Ping)
  6. 公路交通安全设施设计细则_转让江苏公路交通工程(公路安全设施分项)二级资质(包安许)...
  7. Tomcat 项目代码上线步骤详解
  8. 涨到5倍!从“缺芯”到“芯贵” 芯片涨价影响至啤酒、肥皂行业
  9. mongodb 默认端口号_你的爬虫数据储存在哪?MongoDB入门篇
  10. 6 redis 编译失败_Redis6 Windows 版本编译
  11. 三校生高考计算机专业试题,三校生高考计算机试卷1
  12. 搜索引擎duckduckgo
  13. python 字符串转字典的几种方法
  14. 计算机课有平时成绩吗,大学计算机基础课程平时成绩评定方法探究.doc
  15. 软件架构 - 架构风格总结
  16. Mogrt是什么?如何在PR中安装.Mogrt文件并使用 Premiere基本图形MOGRT文件
  17. 记录DBeaver报SQL 错误 [1064] [42000]: #42000的一个坑
  18. 网络安全,非对称加密,对称加密和非对称加密的区别
  19. HTML网页设计期末课程大作业~动漫樱桃小丸子5页表格div+css学生网页设计作业源码...
  20. 小红书店铺需不需要开?具体怎么操作?

热门文章

  1. Python - 文件操作 - 笔记整理
  2. 微信公众号图文编辑志愿岗位申请
  3. 掌握查询利器 深入理解PostgreSQL索引原理与优化
  4. C# 坦克游戏大战中学习相关类(Bitmap)
  5. 4. 功耗是如何影响计算机性能的?
  6. 园中有金不在金——大数据的价值
  7. Section 1.快速排序
  8. Kotlin Flow响应式编程,操作符函数进阶
  9. VS2010WriteString函数不能输出汉字
  10. 飞天特效视频用特效行者怎么制作?最火的特效软件手机版教程