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

[简介]
常用网名: 猪头三
出生日期: 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最合适.

[函数截图]



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章