编程沉思-做一款小巧而好用的截图软件

效果图,为了减少图片大小,比例进行了相应的缩减。
第一节:介绍一下我的作品
图片左上角的exe就是我的截图软件,双击打开软件。
1.等待两秒,截图软件启动的时候首先隐藏自己并截取完整的屏幕,2秒后替代当前屏幕。
2.左键单击开始选取截图区域,再次单击结束截图区域,会有一个从起点到终点的矩形提示选取的区域。
3.对当前选取区域不满意可以ALT+A重新选取截图区域,方法同2.
4.截图完成后弹出操作菜单,依照用途选择标记类型,共支持矩形、椭圆、直线三种标记,在操作菜单上点选按钮。
5.在选取截图区域内单击开始标记,再次单击结束标记,见效果图。
6.做完这些操作用户可以选择如何保存截图以及推出,共支持三种方式:什么都不做的直接退出方式;保存至剪贴板并退出;保存至剪贴板和bmp文件并退出。
第二节:作品回顾
----这里只介绍分析过程,代码给出链接,文中不再贴代码。
准备工作:频繁的画线和贴图,如何避免屏幕闪烁,当然要用双缓冲咯,选定截取区域以前在整个对话框的背景上画线,选取截图区域以后仅仅在截图区域上画线。
朋友们,刚刚掌握双缓冲就迫不及待的开始了,我真的太天真了。
实战第一步:该如何启动我的软件?
这是我遇到的第一个问题,截图软件不能像一般软件那样启动,会导致覆盖一部分屏幕的,在反复启动关闭我使用的截图软件以及找博客学习后得出结论:截屏软件是一个没有标题栏、按钮和边框的对话框,刚启动的时候是隐藏的,启动一段时间后用自己覆盖了桌面。
实战第二步:动手做全屏对话框的朋友才会懂,windows并没有提供现成的应用程序全屏函数,只能自己定义对话框的宽、高、起点,问题随之而来:宽=屏幕像素宽且高=屏幕像素高且起点为(0,0)时对话框展现在屏幕上会有边框,浅浅的但绝对可以认出来的边框,Oh fuck,想破头皮才想来了灵机一动,对话框设计的比屏幕大一些,大概4-6个像素,并且偏移量从(-1,-1)开始,嗯,完美了,边框仍然存在但是存在屏幕外的,Who care!
实战第三步:启动的时候隐藏对话框,2秒后显示对话框,这个没啥难度,一个定时器就解决掉。
实战第四步:截取屏幕并显示到当前对话框上,这个过程做起来挺难,回味起来真没意思,创建一个显示器的DC,这就是所有的技术关键了,剩下的工作就是GDI的基础应用,从源DCBitBlt位图到源DC关联的位图。这里我选择创建一张基础图片作为背景,背景图片作为以后位图操作的源图片但本身不做任何修改。
实战第五步:消息响应与截取,当我们的截图软件到最前端以后是不希望指定按键和鼠标操作影响我们截图的,在消息预处理中截取消息,仅放过我们指定的鼠标操作以及快捷键,我采用鼠标左键点击开始截图和结束截图,全局快捷键重新开始截图。
实战第六步:截图操作处理,鼠标点击一下,开始截图,会有一个矩形框连接起始点和鼠标当前位置,当截图完成后该矩形框固定。我的准备工作发挥光和热了,背景图片画到缓冲画布上,同时在缓冲画布上画上矩形,完成绘画后将缓冲图形贴到对话框上。
实战第七步:做一个按钮菜单,我用了一排简陋的按钮来替代菜单功能:获取截图区域的右下角坐标,进行相应调整,确保一整排按钮都可以显示在桌面上。
实战第八步:保存到剪贴板和位图文件,这其实是两个功能啦,挤挤放一起吧,剪贴板就是一系列API的调用:获取剪贴板,清空剪贴板,粘贴到剪贴板,关闭剪贴板。啥?没了!真没了。保存到位图相对复杂点,尤其是第一次做的同学们,可能对要保存的各种结构体很头大,做吧,有不少文章介绍的。
实战第九步:用户打标记:使用截图软件的重头戏就是在截取的图片上做一些高亮显示的框框、圆形、直线,这是必须有的,仍然要采用双缓冲来贴图。用户提意见了:我们要求回退功能,哪次打标记失误,我们要求回退操作。笑一笑,这个也有,我采用一种比较笨拙的方式实现的回退,定义一个包含4张位图的数组,每次操作记录在数组里相应的位图上,要回退时就废弃掉现在的图片并把之前的图片贴回来,这样实现的效果是最多支持3次完整回退,第4次回退就会把用户所有的标记都撤销了。后来学到了一种技巧,还没有应用,有兴趣的同学试一试,定义一个记录操作的结构体,每次操作都记录在结构体里并追加到记录链表,在撤销操作的时候取屏幕相反颜色的画笔再次执行标记动作就可以还原画笔的痕迹。
第三节:小小的感想
越简单的软件容错率和差异度都要求更高的精度,做一个让人满意的小软件需要用心去做,完工以后还要多加打磨。
编程的积淀容不得任何水分,初学时候我就读了C++primer,读了C专家,读了C和指针,读了C++程序设计语言......到头来还是笨手笨脚,那时敢与人斗辩,现在只想把这孤独的路途走的快一点,要学的要想的要做的,莫张皇、莫求人、边学边记,做出点东西拿与大家点评。
做的不好的地方请大家多批评。
原文地址:https://www.cnblogs.com/learn-my-life/p/3436743.html