<Win32_9>有意思的程序——抓取屏幕
Win32学了一段时间了,跟着杨老师的脚步,准备学习MFC,因此最近几天在复习C++,于是发现有将近一周没写博文了……
今天来写一个较为简单、但是比较有意思的东西
不知大家在理发店理发的时候注意到一个奇观没:
理发店一般都有两面对立的镜子,你仔细一看会发现,两面镜子里面的成像逐渐缩小,并且居中排列,很有意思
盗梦空间中也有一个类似的场景,我截了一个图:
yes,今天就来做一个这样的效果,只不过是抓的屏幕
好吧,先来看看程序运行效果,来对比一下:
下面进入主题,剖析实现细节,主要分两大步:
(1)要对屏幕"工作",在Win32中必须获取屏幕的hdc。有两种主要的方式:
1)GetDC(HWND), 传递参数NULL——GetDC(NULL)
2)CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
(2)贴图
获取环境hdc后,在hdc中会保存屏幕的状态——相当于屏幕的截图,只是用bmp保存的
今天贴图用一个更好的函数StretchBlt,它有一个很好的功能——可以按比例缩放bmp位图,然后显示:
BOOL StretchBlt(
HDC hdcDest, // handle to destination DC
int nXOriginDest, // x-coord of destination upper-left corner
int nYOriginDest, // y-coord of destination upper-left corner
int nWidthDest, // width of destination rectangle
int nHeightDest, // height of destination rectangle
HDC hdcSrc, // handle to source DC
int nXOriginSrc, // x-coord of source upper-left corner
int nYOriginSrc, // y-coord of source upper-left corner
int nWidthSrc, // width of source rectangle
int nHeightSrc, // height of source rectangle
DWORD dwRop // raster operation code
);使用方法和BitBlt很类似,应该不用赘述了……
具体核心实现代码如下:
int cxScreen, cyScreen;//全局变量——屏幕的长宽,用于窗口居中和缩放显示bmp
hdcCli = BeginPaint(hwnd, &ps); hdcScr = GetDC(NULL); //循环3次 i = 0;
while(i<3)
{
//按比例显示桌面截图
StretchBlt(hdcCli, 0, 0, cxClient, cyClient, hdcScr, 0, 0, cxScreen, cyScreen, SRCCOPY);
i++;
} DeleteDC(hdcScr);
EndPaint(hwnd, &ps);
这种方式很简单,当然我肯定不会简单用一下这个函数就了事了,这个没什么大不了的,下面我在介绍一种使用GDI映射模式+BitBlt来贴bmp位图,实现效果和上面说的完全一样
BitBlt函数没有缩放功能,我就用映射模式来实现缩放功能,缩放的具体实现代码如下:
hdcCli = BeginPaint(hwnd, &ps); hdcScr = GetDC(NULL); SetMapMode(hdcCli, MM_ANISOTROPIC);//设定x、y方向异性模式,就是说x、y方向可以不同
SetWindowExtEx(hdcCli, cxScreen, cyScreen, NULL);//设定窗口范围
SetViewportExtEx(hdcCli, cxClient, cyClient, NULL);//设定视口范围
//这样就能将cxScreen * cyScreen的大小缩放为cxClient * cyClient的大小,就是将屏幕大小缩小为客户区大小
//循环3次
i = 0;
while(i<3)
{
//由于已经在内存中缩放了屏幕bmp位图,这里就可直接贴图
BitBlt(hdcCli, 0, 0, cxScreen, cyScreen, hdcScr, 0, 0, SRCCOPY);//直接显示
i++;
} DeleteDC(hdcScr);
EndPaint(hwnd, &ps);
这两种方式实现的效果完全一样,多一种方式,多一种思路,这样才能提高能力……
源代码待会儿上传……
<Win32_9>有意思的程序——抓取屏幕的更多相关文章
- PowerShell定时抓取屏幕图像
		
昨天的博文写了定时记录操作系统行为,其实说白了就是抓取了击键的记录和对应窗口的标题栏,而很多应用程序标题栏又包含当时记录的文件路径和文件名,用这种方式可以大致记录操作了哪些程序,打开了哪些文 ...
 - 跟我一起玩Win32开发(22):抓取屏幕
		
关于如何拷贝屏幕并保存,这里已经有现成的例子,我也不必去Copy人家了,我一向不喜欢Copy.这里有一个完整的例子,可以看看. http://msdn.microsoft.com/EN-US/libr ...
 - 最近买了个kindle,为了方便阅读,写了个程序抓取网页内容发送到Kindle
		
主要觉得往kindle里加书籍太麻烦了,要下载下来,还要通过邮件发送,特别一些网页文字版的书籍没办法放到kindle里,所以想着还不如自己动手丰衣足食,写一个程序直接抓取网页内容,制作成书籍,然后自动 ...
 - Java小程序--抓取emai
		
一.实现思路 1.使用Java.net.URL对象,绑定网络上某一个网页的地址 2.通过java.net.URL对象的openConnection()方法获得一个HttpConnection对象 3. ...
 - 抓取屏幕并压缩生成HBITMAP
		
HBITMAP GetScreenBmp() { HWND hwnd = ::GetDesktopWindow(); HDC hsrc = ::GetDC(hwnd); HDC hmemdc = :: ...
 - php远程抓取网站图片并保存
		
以前看到网上别人说写程序抓取网页图片的,感觉挺神奇,心想什么时候我自己也写一个抓取图片的方法! 刚好这两天没什么事,就参考了网上一个php抓取图片代码,重点借鉴了 匹配img标签和其src属性正则的写 ...
 - 抓取“矢量”的实时交通流量数据
		
1. 引言 最近老师有一个需求,就是想要抓取实时的矢量交通流量数据来做分析,类似于百度地图,高德地图的"实时路况"那种.平时的网络抓取工作一般是抓取网页上现成的数据,但是交通流量数 ...
 - Python 爬虫抓取代理IP,并检测联通性
		
帮朋友抓了一些代理IP,并根据测试联的通性,放在了不通的文件夹下.特将源码分享 注意: 1,环境Python3.5 2,安装BeautifulSoup4 requests 代码如下: 1 2 3 4 ...
 - python3+beautifulSoup4.6抓取某网站小说(四)多线程抓取
		
上一篇多文章,是二级目录,根目录"小说",二级目录"作品名称",之后就是小说文件. 本篇改造了部分代码,将目录设置为根目录->作者目录->作品目录- ...
 
随机推荐
- linux开关机命令
			
1.reboot重启 2.shutdown -r now 立即重启 root用户使用,与reboot命令相同 3.shutdown -r 10 过10分钟后重启root用户使用 4.shutdown ...
 - centos5.5上apache快速安装H264流媒体支持MP4-H264边下边播
			
2013年的某一天,客户反馈北京同事做的广告视频下载速度好慢,几MB的视频在手机上要下载接近一分钟才能开始播放. 我分析后发现两点:1)托管的服务器没支持流媒体:2)广告视频MP4并非流媒体格式. 对 ...
 - ListControl一细节处理
			
做VC ListControl的时候发现一个问题,右击菜单的时候,在没有列表数据的空白处也会出现菜单,这可够纠结的,于是用了点方法解决了,希望分享同样不爽的朋友们.代码如下: void CXXXDlg ...
 - 用CALayer实现聚光灯效果
			
效果图: 代码部分: #import "ViewController.h" @interface ViewController () @property (nonatomic, s ...
 - Java中实现线程的方法
			
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? 第一种:继承Thread类 new Thread(){}.start();这表示调 ...
 - 标准SQL语言的用法
			
原文链接:http://www.ifyao.com/2015/05/18/%E6%A0%87%E5%87%86%E7%9A%84sql%E8%AF%AD%E8%A8%80%E4%BD%BF%E7%94 ...
 - 利用谷歌 kaptcha 进行验证码生成
			
package main.com.smart.controller; import com.google.code.kaptcha.Producer; import main.com.smart.ut ...
 - JQUERY1.9学习笔记 之基本过滤器(四) 首元素选择器
			
首元素选择器:jQuery( ":first" ) <!DOCTYPE html><html lang="zh-cn"><head ...
 - phpcms v9开源开发框架基础mvc解读
			
根据对mvc的了解 简要写个mvc框架 也谈不上框架 希望对新手有帮助 简单的解析下mvc 你可以这样了解 m模型也就是数据库操作 v视图 c控制器 通过url来判断调用m和v来完成请求,本身没数 ...
 - PHPCMS v9修改栏目或者单页没有权限
			
问题: 普通管理员没有权限修改栏目,只有超级管理员才有权限修改,凡是非超级管理员,设置栏目权限后只能添加栏目,不能对栏目进行修改和删除操作,提示您没有权限操作该项这使系统的一个BUG. 一.对于普 ...