MFC截图程序的实现(十)

来源:互联网 发布:cs 1.6 for mac 10.13 编辑:程序博客网 时间:2024/06/05 23:44

      前面的九篇文章介绍的都是如何实现 “窗口截图”,即对某个窗口进行整体的截图,这样截出来的图显然缺乏灵活性,而且由于窗口的样式不同,截取效果并不好,截图范围不好把握。

    从这篇文章开始,介绍如何进行“自定义截图”,即实现类似Win7自带的截图软件的功能。用户通过自定义截图范围来截取需要的图像。

    因为前面的程序函数和关系已经比较多了,这里介绍的自定义截图功能就不再追加到前面的“窗口截图”的工程中了,而是新建一个工程,这样显得比较清楚。当然,最后如果有必要,会将介绍的所有功能合到一起的。

    下面开始正式介绍如何实现自定义截图:

1、自定义截图只是在确定截图范围的时候由用户指定,确定了截图的矩形范围后,接下去的复制、保存工作都是和前面介绍的窗口截图程序一样的。

2、所以,要实现自定义截图的关键是如何让用户确定截图范围。参考Win7自带截图软件和现在大部分截图软件的做法,就是让用户画矩形。

3、所谓的画矩形,即使在用户使用截图功能时,响应鼠标左键的按下和弹起消息,在鼠标按下时和鼠标弹起时分别保存光标的坐标信息。从而确定用户需要的截图范围。

4、但是这里有一个问题,那就是上述实现方法只有在用户鼠标左键弹起之后才能画出用户选择的矩形范围,这样的效果显然并不好,我们需要的是及时地将矩形框显示出来。换一种说法,也就是说:当鼠标左键按下时,就要开始画矩形,随着光标的移动,不断重绘矩形。

5、我们知道确定矩形只要两个坐标就行了,即矩形左上角的坐标和矩形右下角的坐标。为了说明方便将这两个坐标称为startPoint和endPoint。根据前文所述,startPoint即为鼠标左键按下时的光标位置,而endPoint则是变化的:在鼠标左键按下至弹起的这段时间内的光标位置都是endPoint的值。

6、这样做之后虽然能够实现动态的画矩形,但是也会产生另一个问题,那就是在鼠标左键按下到弹起的过程中会画很多的矩形,而这些矩形都会显示在屏幕上,也就是说,随着光标的移动,画出新矩形的同时旧的矩形并没有消失。

7、新旧矩形在一起显得很乱,这显然不是我们想要的结果。

8、这里介绍一种方法解决这个问题:我们每画一个矩形时,可以记录它的位置,当画新的矩形时,用矩形所在窗口的原本颜色再画一个矩形将其覆盖。(这样讲起来可能有些难以理解,看后面的代码就比较好理解了)。

9、动态画矩形的问题基本解决了,接下来还有一个问题,就是响应鼠标左键按下和弹起消息的问题,因为通过ClassWizard添加的WM_LBUTTONDOWN和WM_LBUTTONUP消息只是针对本程序的,也就是说这两个消息并不能响应截图程序之外的鼠标消息。而我们需要截图的地方显然不可能是截图程序本身的窗口,当我们的关闭点击在截图程序的窗口之外后,截图程序就丢失了焦点,也就响应不了上述两个消息了。

10、解决的方法不难想到,有两个思路:一是截取系统范围内的鼠标消息,二是将窗口最大化显示并设置透明。

大致的介绍就这么多,具体实现下一篇再讲,吃饭去了。

0 0