l

成都手游码农一枚
随笔 - 32, 文章 - 0, 评论 - 117, 引用 - 0
数据加载中……

一个简单的截屏工具的实现。

 

这两天闲着没事做,就想试试写个类似QQ的截图工具,最终实现了一个小小的简单的版本,绘图效率不是很高,
也懒得优化了,整体移动选区时可能有点延迟,其它的还勉强能接受。

基本效果如图:



实现原理也比较简单:
1.创建一个无边框顶层对话框,大小为屏幕大小,并获取桌面截图并保存为两份,一份灰色,一份正常,并用灰色的作为对话框背景。
获取截图的过程:
通过GetDesktopWindow()获取桌面句柄再获取DC,然后保存到HBITMAP,再保存到文件。

2.处理鼠标消息进行选取的调整,并使用正常的截图重绘选区,得到高亮效果。

3.将指定选取的位图保存到文件。这个可以在网上找到代码,MSDN也有。

开发工具:VS2005 + WTL + C++
下载地址:http://www.cppblog.com/Files/shly/PrintScreen.rar

posted on 2011-10-07 18:01 l1989 阅读(6053) 评论(8)  编辑 收藏 引用

评论

# re: 一个简单的截屏工具的实现。  回复  更多评论   

看上去挺不错的,下下来看看
2011-10-07 23:16 | LoveBeyond

# re: 一个简单的截屏工具的实现。  回复  更多评论   

不知道可不可以直接绘制在桌面DC上,而不用创建一个桌面那么大的对话框?
2011-10-08 17:57 | Kevin Lynx

# re: 一个简单的截屏工具的实现。  回复  更多评论   

@Kevin Lynx
那样不是很好处理鼠标事件,因为你点击某个位置可能会使得该处的窗口获取焦点,会严重的影响你绘制选区的过程。
2011-10-08 18:20 | azl

# re: 一个简单的截屏工具的实现。  回复  更多评论   

赞一个!学习学习
2011-10-09 14:03 | coreBugZJ

# re: 一个简单的截屏工具的实现。  回复  更多评论   

感觉大家对屏幕截图进入了一个误区,
真正的思路应该是创建一个屏幕大小的层窗口,设置一个适当的Alpha使得能
半透明的看到屏幕上的内容,然后绘制那个选区框,进行调整,点击确定的时候才真正的截取屏幕上的内容。
2011-10-16 21:27 | bukebushuo

# re: 一个简单的截屏工具的实现。  回复  更多评论   

@bukebushuo
恩,的确那样更好些,但是那样过后你在获取的截图似乎很难,
因为当前窗口已经被你的窗口覆盖,所以只有在弹出自己的窗口前获取截图,
就像QQ的,一开起截图后屏幕就成静态的了,看不到任何动画效果。
2011-10-16 23:08 | azl

# re: 一个简单的截屏工具的实现。[未登录]  回复  更多评论   

@bukebushuo
无聊回顾了下自己的博客,看到了自己当初的回复,可能当时没认知看你的回复,现在看到都不知道自己当初想表达啥。

层窗口+透明效果可以实现,没技术问题,但有个小问题就是,截图应该是捕获的某个时刻的静态屏幕,如果是透明的话就违背了这个原则,因为桌面内容可能随时在改变,比如动画,这样效果应该不是很好。仅仅是个人理解。
2012-09-20 15:17 | azl

# re: 一个简单的截屏工具的实现。  回复  更多评论   

这个代码很棒!谢谢分享
2014-02-21 16:10 | yinX

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理