<Win32_9>有意思的程序——抓取屏幕
2013-08-05 19:00
211 查看
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位图,然后显示:
使用方法和BitBlt很类似,应该不用赘述了……
具体核心实现代码如下:
这种方式很简单,当然我肯定不会简单用一下这个函数就了事了,这个没什么大不了的,下面我在介绍一种使用GDI映射模式+BitBlt来贴bmp位图,实现效果和上面说的完全一样
BitBlt函数没有缩放功能,我就用映射模式来实现缩放功能,缩放的具体实现代码如下:
这两种方式实现的效果完全一样,多一种方式,多一种思路,这样才能提高能力……
源代码待会儿上传……
今天来写一个较为简单、但是比较有意思的东西
不知大家在理发店理发的时候注意到一个奇观没:
理发店一般都有两面对立的镜子,你仔细一看会发现,两面镜子里面的成像逐渐缩小,并且居中排列,很有意思
盗梦空间中也有一个类似的场景,我截了一个图:
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_8>有意思的程序——抓取屏幕
- win32汇编 屏幕截图保存BMP 学习笔记<第三篇>之odbg调试
- windows游戏编程<七> 创建WIN32一个HelloWOrld程序
- win32汇编 屏幕截图保存BMP 学习笔记<第四篇>之生成BMP文件
- 【Virtual C++ 3D游戏开发】前置知识 三 <Win32窗口程序剖析>
- win32汇编 屏幕截图保存BMP 学习笔记<第一篇>之资料搜集
- win32汇编 屏幕截图保存BMP 学习笔记<第二篇>之东拼西凑
- <<深入浅出MFC>>笔记1——Win32基本程序观念
- Android屏幕适配记录<一>
- 1220学习笔记<程序基本循环>
- Java传递音频给PC端C#程序<二>
- .Net Core中使用ref和Span<T>提高程序性能
- C#如何在程序里定时启动任务 <转>
- Windows核心编程<读书笔记十七>Applnst程序详解
- 定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
- html5开发<video>视频字幕的程序
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<SQL_Server_常用查询>(二十二)
- ASP.NET小收集<9>:HTML解析
- <为知更新>Android下一个apk安装多个程序入口图标
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<JDBC>(二十四)