• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
用VC进行屏幕截取编程的方法
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
用VC进行屏幕截取编程的方法
软件发布 用VC进行屏幕截取编程的方法
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 编程技术 >> VC教程 >> 用VC进行屏幕截取编程的方法

用VC进行屏幕截取编程的方法

添加时间: 2006-2-12 2:57:20  作者: VC教程  阅读次数:109   来源: http://d9soft.com

        下面用vc来逐步介绍在windows95下的实现过程.首先我们要确定屏幕截取的区域,用lprect结构来定义.可以截取一个窗口,或整个屏幕.以下代码把选定的屏幕区域拷贝到位图中.

hbitmap copyscreentobitmap(lprect lprect)
//lprect 代表选定区域
{
hdc hscrdc, hmemdc;
// 屏幕和内存设备描述表
hbitmap hbitmap, holdbitmap;
// 位图句柄
int nx, ny, nx2, ny2;
// 选定区域坐标
int nwidth, nheight;
// 位图宽度和高度
int xscrn, yscrn;
// 屏幕分辨率

// 确保选定区域不为空矩形
if (isrectempty(lprect))
return null;
//为屏幕创建设备描述表
hscrdc = createdc("display", null, null, null);
//为屏幕设备描述表创建兼容的内存设备描述表
hmemdc = createcompatibledc(hscrdc);
// 获得选定区域坐标
nx = lprect- >left;
ny = lprect- >top;
nx2 = lprect- >right;
ny2 = lprect- >bottom;
// 获得屏幕分辨率
xscrn = getdevicecaps(hscrdc, horzres);
yscrn = getdevicecaps(hscrdc, vertres);
//确保选定区域是可见的
if (nx 〈0)
nx = 0;
if (ny 〈 0)
ny = 0;
if (nx2 > xscrn)
nx2 = xscrn;
if (ny2 > yscrn)
ny2 = yscrn;
nwidth = nx2 - nx;
nheight = ny2 - ny;
// 创建一个与屏幕设备描述表兼容的位图
hbitmap = createcompatiblebitmap
(hscrdc, nwidth, nheight);
// 把新位图选到内存设备描述表中
holdbitmap = selectobject(hmemdc, hbitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
bitblt(hmemdc, 0, 0, nwidth, nheight,
hscrdc, nx, ny, srccopy);
//得到屏幕位图的句柄
hbitmap = selectobject(hmemdc, holdbitmap);
//清除
deletedc(hscrdc);
deletedc(hmemdc);
// 返回位图句柄
return hbitmap;
}

得到屏幕位图句柄以后,我们
可以把屏幕内容粘贴到剪贴板上.
if (openclipboard(hwnd))
//hwnd为程序窗口句柄
{
//清空剪贴板
emptyclipboard();
//把屏幕内容粘贴到剪贴板上,
hbitmap 为刚才的屏幕位图句柄
setclipboarddata(cf_bitmap, hbitmap);
//关闭剪贴板
closeclipboard();
}
我们也可以把屏幕内容以位图格式存到磁盘文件上.

int savebitmaptofile(hbitmap hbitmap ,
lpstr lpfilename) //hbitmap 为刚才的屏幕位图句柄
{ //lpfilename 为位图文件名
hdc hdc;
//设备描述表
int ibits;
//当前显示分辨率下每个像素所占字节数
word wbitcount;
//位图中每个像素所占字节数
//定义调色板大小, 位图中像素字节大小 ,
位图文件大小 , 写入文件字节数
dword dwpalettesize=0,
dwbmbitssize,
dwdibsize, dwwritten;
bitmap bitmap;
//位图属性结构
bitmapfileheader bmfhdr;
//位图文件头结构
bitmapinfoheader bi;
//位图信息头结构
lpbitmapinfoheader lpbi;
//指向位图信息头结构
handle fh, hdib, hpal,holdpal=null;
//定义文件,分配内存句柄,调色板句柄

//计算位图文件每个像素所占字节数
hdc = createdc("display",null,null,null);
ibits = getdevicecaps(hdc, bitspixel) *
getdevicecaps(hdc, planes);
deletedc(hdc);
if (ibits 〈 = 1)
wbitcount = 1;
else if (ibits 〈 = 4)
wbitcount = 4;
else if (ibits 〈 = 8)
wbitcount = 8;
else if (ibits 〈 = 24)
wbitcount = 24;
//计算调色板大小
if (wbitcount 〈 = 8)
dwpalettesize = (1 〈 〈 wbitcount) *
sizeof(rgbquad);

//设置位图信息头结构
getobject(hbitmap, sizeof(bitmap), (lpstr)&bitmap);
bi.bisize = sizeof(bitmapinfoheader);
bi.biwidth = bitmap.bmwidth;
bi.biheight = bitmap.bmheight;
bi.biplanes = 1;
bi.bibitcount = wbitcount;
bi.bicompression = bi_rgb;
bi.bisizeimage = 0;
bi.bixpelspermeter = 0;
bi.biypelspermeter = 0;
bi.biclrused = 0;
bi.biclrimportant = 0;

dwbmbitssize = ((bitmap.bmwidth *
wbitcount+31)/32)* 4
*bitmap.bmheight ;
//为位图内容分配内存
hdib = globalalloc(ghnd,dwbmbitssize+
dwpalettesize+sizeof(bitmapinfoheader));
lpbi = (lpbitmapinfoheader)globallock(hdib);
*lpbi = bi;
// 处理调色板
hpal = getstockobject(default_palette);
if (hpal)
{
hdc = getdc(null);
holdpal = selectpalette(hdc, hpal, false);
realizepalette(hdc);
}
// 获取该调色板下新的像素值
getdibits(hdc, hbitmap, 0, (uint) bitmap.bmheight,
(lpstr)lpbi + sizeof(bitmapinfoheader)
+dwpalettesize,
(bitmapinfoheader *)
lpbi, dib_rgb_colors);
//恢复调色板
if (holdpal)
{
selectpalette(hdc, holdpal, true);
realizepalette(hdc);
releasedc(null, hdc);
}
//创建位图文件
fh = createfile(lpfilename, generic_write,
0, null, create_always,
file_attribute_normal   file_
flag_sequential_scan, null);
if (fh == invalid_handle_value)
return false;
// 设置位图文件头
bmfhdr.bftype = 0x4d42; // "bm"
dwdibsize = sizeof(bitmapfileheader)
+ sizeof(bitmapinfoheader)
+ dwpalettesize + dwbmbitssize;
bmfhdr.bfsize = dwdibsize;
bmfhdr.bfreserved1 = 0;
bmfhdr.bfreserved2 = 0;
bmfhdr.bfoffbits = (dword)sizeof
(bitmapfileheader)
+ (dword)sizeof(bitmapinfoheader)
+ dwpalettesize;
// 写入位图文件头
writefile(fh, (lpstr)&bmfhdr, sizeof
(bitmapfileheader), &dwwritten, null);
// 写入位图文件其余内容
writefile(fh, (lpstr)lpbi, dwdibsize,
&dwwritten, null);
//清除
globalunlock(hdib);
globalfree(hdib);
closehandle(fh);
}

 

上下文章:

 

上一篇文章: Visual C++中位图按钮的新颖设计 下一篇文章: TCP/IP Winsock网络编程综述

相关文章:

  • 400多网站融资难 促进行业洗牌
  • 赛门铁克削减员工开支预算 将在全球进行裁员
  • SQL索引优化方法(实例代码)
  • QQ邮箱在线浏览Office文档的方法
  • 将Windows操作系统无毒进行到底

相关软件:

  • 屏幕间谍 2008 16.15
  • 屏幕画笔 2.73
  • 电脑屏幕监视 V4.4
  • 屏幕录像专家 7.5 Build 20080925
  • LD电脑屏幕监控软件 1.0
  • 鱼羊网智能网页截取工具

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • VC++之Button控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Scroll Bar
  • VC++之Scroll Bar
  • VC++之List Box/Check List Box控...
  • VC++ Combo Box/Combo Box Ex控件
  • VC++ List Ctrl控件

VC教程阅读排行

  • VC++之List Box/Check List Box控...
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • VC++之Button控件
  • VC++之Tab Ctrl控件
  • VC++之Edit Box控件
  • VC++之Edit Box控件
  • VC遍历整个目录树查找文件
  • VC++之Scroll Bar
  • VC使用ActiveX控件常见问题

编程技术阅读总排行

  • VB入门教程之一
  • Java连接数据库实例
  • VC++之List Box/Check List Box控...
  • 第二章 PowerBuilder 入门之创建新...
  • VC++ List Ctrl控件
  • 第一章 什么是PowerBuilder
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有