通过使用GDI+和CImage类配合实现针对目标窗体的子控件进行截图

原创 2016年01月16日 16:16:26
[简介]
常用网名: 猪头三
出生日期: 1981.XX.XX
个人网站: http://www.x86asm.com
QQ交流: 643439947
编程生涯: 2001年~至今[共15年]
职业生涯: 13年
开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
开发工具: Visual Studio、Delphi、XCode、Eclipse
技能种类: 逆向 驱动 磁盘 文件
研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测

[序言]
由于项目的需求, 需要开发一个针对目标窗体的子控件区域进行截图. 这个功能, 在几年前我一直都很感兴趣, 曾经想尝试去做, 但看到网络资料没有现成而且很零散, 我也就不做了. 这次是真正的需求, 必须要实现. 结果没想到是那么的复杂. 前后一直花费了8个小时才能搞定. 为什么需要这么久? 原因很简单:
1> 网络分享的代码是过时的
2> 网络资料介绍是不全的
3> 网络的描述是不正确的

[遇到一个很白痴的问题, 这个问题才是我写这篇文章的原因, 时刻提醒自己的无知]
本来代码写对了, 但我习惯性在系统分区根目录创建测试文件, 结果总是无法成功. 也没有返回错误信息, 也不抛出异常.  为了解决这个创建文件的问题, 我折腾了3个小时, 换了不下十几次的不同写法来处理, 还是告终失败, 差点想放弃. 如果是用CreateFile()还好说, 我可以调用GetLastError()进行查看失败原因. 但是问题不是这样. 真是操蛋. 反正我就是不甘心, 不停的FUCK代码, 思路也不停在变化, 但没有跳出一个误区: 总是以为自己的代码错误. 后来实在恼火了, 测试在其他分区根目录下创建看看, 结果成功了. 这让我恍然大悟: windows 8版本以上的操作系统如果要在系统分区根目录创建文件需要管理员权限. 我彻底晕死, 好想把电脑砸烂~~

[昨晚花费4个小时搞定图像保存, 今早花费3个小时搞定子控件截图]
昨晚的白痴问题搞定之后, 今早就起来继续开发, GDI+不熟悉, 网络大部分都是GDI+配合C#, 而没有完整的C++代码, 都是零零散散. 哪怎么办? 只能一边看MSDN文档, 然后看C#的代码, 然后理解思路之后把C#的代码转换为C++, 幸亏GID+的封装很牛B, 因为很多函数名和参数可以直接套进C++, 但这也花费了不少时间. 主要解决3个问题:
1> GDI+和CImage图片信息相互切换
2> 使用GID+进行图片区域的裁剪
3> 子控件相对于父控件的坐标

第1个问题真是非常的复杂, 网络资料根本就没有现成代码, 全靠自己看MSDN开发文档, 但结果最终实现只用5行代码, 真是无语. 然后第2个问题C#版本的很多, 一下就可以解决了. 第3个问题就扯淡了, 这个是非常古老的问题, 结果网络竟然没有现成代码, 很多人都在问这个东西, 其实这个技术很实用.问是问了, 可回答的人真是莫名奇妙, 完全不正确. 后来我还是自己写了, 也不难, 只要了解屏幕坐标的原理就可以一下转换出来, 转换公式写成代码也就是3行.

[前后一共花费了8个小时, 源码不开源但有偿提供]
为了实现这个技术, 前后花费了8个小时, 我写的“通过使用GDI+和CImage类配合实现针对目标窗体的子控件进行截图”这个功能, 封装成1个函数, 大约也就是60行代码, 支持png, jgp, bmp, gif等主流图片文件保存. 就算有其他子控件被其他外部的窗体遮挡, 一样可以截图. 而且目前网络上是没有完整且简单易懂, 可读性强的源码案例. 当然我这里就不免费开源了.如果谁对这份源码感兴趣, 可以考虑购买, QQ联系: 643439947 [备注: 这里的截图不是对游戏界面截图, 没有针对游戏进行针对性开发.]

[开发感悟]
我已经有5~6年不用MFC来开发项目了, 大多数情况都是用DELPHI和C#, 但是这个项目必须要用C/C++, 所以在Windows平台下首选的是MFC, 一股浓浓怀旧的味道. 通过这8个小时的开发, 特别感悟出, MFC还是那么的强大而且改进了不少, 做偏底层的还是MFC最合适.

[函数截图]



C#学习笔记:GDI图形高级编程(1)——如何将图形画到控件上

之前学习OpenGL是用C语言写的程序,开发个界面,既繁琐又不美观,还一大堆BUG。现在学了C#,可以很轻易地进行界面开发,我就寻思着,怎么样把OpenGL搬到C#中。查了很多资料,得出了这样一个结论...

winform gdi+重绘窗体 控件

  • 2014年01月13日 13:11
  • 7.85MB
  • 下载

过年回家,走之前留一个用GDI+实现的略缩图控件

这是一个加载文件夹图片略缩图的控件,支持多种图片格式~~用法也比较简单 (1)、源代码 //头文件ListImageCtrl.h  #pragma once #incl...

C# GDI+实现截图功能源码

代码内容来自于 “我不是圣人” 博客。地址:点击打开链接 他的原理及实现细节都讲得非常详细。我把他的源码优化了下,贴出来给GDI+新手学习。 在读此代码前,必须先读他的博客,这一点切记。 截屏窗...

使用GDI+屏幕截图内存中压缩为jpg

原文:http://hi.baidu.com/ypxmaomao/blog/item/9b68c0b771c3a9fe30add133.html 1.下载(GDI+ for VC6.0 SDK)...

【VS开发】GDI+ 用CImage类来显示PNG、JPG等图片

系统环境:Windows 7 软件环境:Visual Studio 2008 SP1 本次目的:实现VC单文档、对话框程序显示图片效果       CImage 是VC.NET中定义的一种M...

VC++玩转炫酷悬浮窗3---GDI+完美实现不规则窗体

目标上一篇不规则窗体虽然实现了,但是图形有锯齿,给人以上世纪的老古董感觉,跟酷炫不搭边。今天就要用高级一些的技术做出完美的光滑的无锯齿的不规则窗体。计划&方案PNG图片本身就是带透明效果的,把此图片作...

使用GDI+和CImage类加载png图片

本文的方法可以加载bmp、jpg、png等多种格式的图片,但由于大多软件都使用可带透明色的png图片,所以以加载png图片为研究切入点,找到对应的加载办法。本文结合TrueLink代码的使用情况,分别...

MFC界面编程1:GDI+实现不规则窗体

先来看一下实现的效果,下图中那个娃娃就是我们要实现的不规则窗体啦~ 1. GDI+配置及初始化(VS2013)VS2013上已经有了GDI+支持,不用单独下载安装包了。现在只需项目中引入gdiplu...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过使用GDI+和CImage类配合实现针对目标窗体的子控件进行截图
举报原因:
原因补充:

(最多只允许输入30个字)