知识大全 一个实用的Delphi屏幕拷贝程序的设计

Posted

篇首语:你不好好奋斗,拿什么显摆的自己的成功,对于背后的人看不起。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 一个实用的Delphi屏幕拷贝程序的设计相关的知识,希望对你有一定的参考价值。

一个实用的Delphi屏幕拷贝程序的设计  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Borland 公 司( 现 改 名 为INPRISE 公 司) 的DELPHI 是 当 前 最 为 方 便 的Windows 程 序 设计 工 具 之 一 许 多 人 以 为DELPHI 是 作 为 数 据 库 开 发 工 具 出 现 的 其 实 用DELPHI可 以 以 极 快 的 速 度 开 发 出 高 效 的Windows 程 序

  现 在 我 们 就 用DELPHI 来 编 写 一 个 实 用 的 屏 幕 拷 贝 程 序

  Borland 公 司 的 天 才 设 计 师 们 用 画 布(Tcanvas) 对 象 封 装 了Windows 的 大 部 分 图 形输 出 功 能 这 使 得 我 们 可 以 通 过 他 以 更 直 观 的 方 式 和Windows 的 屏 幕 打 交 道 而 不 必 关 心 令 人 头 疼 的Windows API 函 数 下 面 的 一 小 段 程 序 就 可 以 实 现 整 个屏 幕 的 图 象 拷 贝 了

  var //变量声明

  Fullscreen:Tbitmap;

  FullscreenCanvas:TCanvas;

  dc:HDC;

  DC := GetDC ( ); //取得屏幕的 DC 参数 指的是屏幕

  FullscreenCanvas := TCanvas Create; //创建一个CANVAS对象

  FullscreenCanvas Handle := DC; //将屏幕的DC赋给HANDLE

  Fullscreen Canvas CopyRect (Rect ( screen Width screen Height)

  fullscreenCanvas Rect ( Screen Width Screen Height));

  //把整个屏幕复制到BITMAP中

  FullscreenCanvas Free; //释放CANVAS对象

  ReleaseDC ( DC); //释放DC

  //SCREEN对象是DELPHI预先定义的屏幕对象 直接使用就行了

  看 了 以 上 代 码 你 就 会 发 现 用DELPHI 写 屏 幕 拷 贝 程 序 的 确 很 简 单 当 然 要 写 一 个 实 用 的 屏 幕 拷 贝 程 序 光 靠 上 述 代 码 是 不 够 的 下 面 讲 一下 主 要 的 编 程 思 路

   全 屏 幕 拷 贝 的 实 现

  首 先 隐 藏 拷 屏 程 序 延 长 一 定 时 间 后 利 用 上 述 的 程 序 即 可 实 现 屏 幕 的拷 贝

   区 域 拷 贝 的 实 现

  要 实 现 区 域 拷 贝 要 用 个 小 技 巧 首 先 调 用 全 屏 幕 拷 贝 程 序 把 整 个 屏 幕 拷贝 下 来 然 后 把 拷 贝 下 来 的 图 象 显 示 在 屏 幕 上 之 后 就 可 以 让 用 户 在 上 面选 择 需 要 的 区 域 最 后 才 将 用 户 选 定 的 区 域 复 制 下 来

  编 程 实 现

   首 先 用DELPHI 开 一 个 工 程

   在FORM 上 放 置 一 个TPANEL 元 件 设 置ALIGN=ALTOP 再 选 部 件 条ADDITIONAL 上的TSCROLLBOX 放 到FORM 上 设 置ALIGN=ALCLIENT 然 后 在SCROLLBOX 上 放 置 一 个TIMAGE 对 象

   在PANEL 上 放 置 个 按 钮 分 别 为FULL SCREEN REGIN SAVE EXIT

   容 易 干 的 先 干 在EXIT 按 钮 的CLICK 事 件 里 写 下 代 码

  procedure TForm ExitClick(Sender: TObject);

  begin

  close;

  end;

   接 著 是 实 现 全 屏 幕 拷 贝 了 在FROM 上 放 置 一 个 记 时 器TTIMER ENABLED 设 为FALSE INTERVAL 设 为 也 就 是 半 秒 钟 激 活 一 次 双 击TIMER 部 件 写 上 如 下 的代 码

  procedure TForm Timer Timer(Sender: TObject);

  var

  Fullscreen:Tbitmap;

  FullscreenCanvas:TCanvas;

  dc:HDC;

  begin

  timer Enabled:=false; //取消时钟

  Fullscreen := TBitmap Create; //创建一个BITMAP来存放图象

  Fullscreen Width := screen width;

  Fullscreen Height := screen Height;

  DC := GetDC ( ); //取得屏幕的 DC 参数 指的是屏幕

  FullscreenCanvas := TCanvas Create; //创建一个CANVAS对象

  FullscreenCanvas Handle := DC;

  Fullscreen Canvas CopyRect (Rect ( screen Width screen Height) fullscreenCanvas Rect ( Screen Width Screen Height));

  //把整个屏幕复制到BITMAP中

  FullscreenCanvas Free; //释放CANVAS对象

  ReleaseDC ( DC); //释放DC

  image picture Bitmap:=fullscreen;//拷贝下的图象赋给IMAGE对象

  image Width:=fullscreen Width;

  image Height:=fullscreen Height;

  fullscreen free; //释放bitmap

  form WindowState:=wsNormal; //复原窗口状态

  form show; //显示窗口

  messagebeep( ); //BEEP叫一声 报告图象已经截取好了

  end;

   接 下 去FULLSCREEN 按 钮 上 的 代 码 就 很 简 单 了

  procedure TForm FullscreenClick(Sender: TObject);

  begin

  form WindowState:=wsMinimized; //最小化程序窗口

  form hide; //把程序藏起来

  timer enabled:=true; //打开记时器

  end;

   拷 贝 到 了 图 象 当 然 要 存 起 来 了 SAVE 按 钮 就 有 了 用 武 之 地 我 们 写 下 如下 代 码

  procedure TForm Save Click(Sender: TObject);

  begin

  if savedialog Execute then

  begin

  form Image Picture SaveToFile(savedialog filename)

  end;

  end;

   下 面 是 区 域 拷 贝 的 实 现 再New 一 个FORM BorderStype 设 为 bsNone 这 样 能 够 显 示为 全 屏 幕 上 面 放 置 一 个TIMAGE 部 件 ALIGN 设 为ALCLIENT 另 外 放 置 一 个TTIMER部 件 TIMER 部 件 的 程 序 跟 上 面 的 很 象 因 为 它 首 先 要 实 现 的 是 全 屏 幕 的 拷贝

  procedure TForm Timer Timer(Sender: TObject);

  var

  Fullscreen:Tbitmap;

  FullscreenCanvas:TCanvas;

  dc:HDC;

  begin

  timer Enabled:=false;

  Fullscreen := TBitmap Create;

  Fullscreen Width := screen width;

  Fullscreen Height := screen Height;

  DC := GetDC ( );

  FullscreenCanvas := TCanvas Create;

  FullscreenCanvas Handle := DC;

  Fullscreen Canvas CopyRect (Rect ( screen Width screen Height) fullscreenCanvas Rect ( Screen Width Screen Height));

  FullscreenCanvas Free;

  ReleaseDC ( DC);

  image picture Bitmap:=fullscreen;

  image Width:=fullscreen Width;

  image Height:=fullscreen Height;

  fullscreen free;

  form WindowState:=wsMaximized;

  form show;

  messagebeep( );

  foldx:= ;

  foldy:= ;

  image Canvas Pen mode:=pmnot; //笔的模式为取反

  image canvas pen color:=clblack; //笔为黑色

  image canvas brush Style:=bsclear; //空白刷子

  flag:=true;

  end;

   TIMAGE 部 件 上 有 两 个 事 件 的 程 序 需 要 编 写 一 个 是ONMOUSEDOWN 另 一 个是ONMOUSEMOVE

   可 以 回 头 看 看 区 域 拷 贝 的 思 路 此 时 需 要 作 区 域 拷 贝 的 屏 幕 我 们 已 经得 到 也 显 示 在 屏 幕 上 了 按 下 鼠 标 左 键 是 区 域 的 原 点 此 后 移 动 鼠 标 将有 一 个 矩 形 在 原 点 和 鼠 标 之 间 它 会 随 著 鼠 标 的 移 动 而 变 化 再 次 按 下 鼠标 的 左 键 此 时 矩 形 所 包 含 的 区 域 就 是 我 们 要 得 到 的 图 象 了

   所 以MOUSEDOWN 有 两 次 响 应 的 处 理 见 以 下 程 序

  procedure TForm Image MouseDown

  (Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X Y: Integer);

  var

  width height:integer;

  newbitmap:Tbitmap;

  begin

  if (trace=false) then // TRACE表示是否在追踪鼠标

  begin //首次点击鼠标左键 开始追踪鼠标

  flag:=false;

  with image canvas do

  begin

  moveTo(foldx );

  LineTo(foldx screen height);

  moveto( foldy);

  lineto(screen width foldy);

  end;

  x :=x;

  y :=y;

  oldx:=x;

  oldy:=y;

  trace:=true;

  image Canvas Pen mode:=pmnot; //笔的模式为取反

  //这样再在原处画一遍矩形 相当于擦除矩形

  image canvas pen color:=clblack; //笔为黑色

  image canvas brush Style:=bsclear;//空白刷子

  end

  else

  begin //第二次点击 表示已经得到矩形了

  //把它拷贝到FORM 中的IMAGE部件上

  x :=x;

  y :=y;

  trace:=false;

  image canvas rectangle(x y oldx oldy);

  width:=abs(x x );

  height:=abs(y y );

  form image Width:=Width;

  form image Height:=Height;

  newbitmap:=Tbitmap create;

  newbitmap width:=width;

  newbitmap height:=height;

  newbitmap Canvas CopyRect

  (Rect ( width Height) form image canvas

  Rect (x y x y )); //拷贝

  form image picture bitmap:=newbitmap; //放到FORM的IMAGE上

  newbitmap free;

  form hide;

  form show;

  end;

  end;

   MOUSEMOVE 的 处 理 就 是 在 原 点 和 鼠 标 当 前 位 置 之 间 不 断 地 画 矩 形 和 擦除 矩 形

  procedure TForm Image MouseMove

  (Sender: TObject; Shift: TShiftState; X

  Y: Integer);

  begin

  if trace=true then //是否在追踪鼠标?

  begin //是 擦除旧的矩形并画上新的矩形

  with image canvas do

  begin

  rectangle(x y oldx oldy);

  Rectangle(x y x y);

  oldx:=x;

  oldy:=y;

  end;

  end

  else if flag=true then //在鼠标所在的位置上画十字

  begin

  with image canvas do

  begin

  moveTo(foldx ); //擦除旧的十字

  LineTo(foldx screen height);

  moveto( foldy);

  lineto(screen width foldy);

  moveTo(x ); //画上新的十字

  LineTo(x screen height);

  moveto( y);

  lineto(screen width y);

  foldx:=x;

  foldy:=y;

  end;

  end;

  end;

   好 了 让 我 们 回 过 头 来 编 写REGION 按 钮 的 代 码

  procedure TForm RegionClick(Sender: TObject);

  begin

  form Hide;

  form hide;

  form Timer Enabled:=true;

  end;

cha138/Article/program/Delphi/201311/8540

相关参考

知识大全 用delphi制作抖动窗体

  以下程序将教你如何制作一个窗体窗体一旦运行将在屏幕上不断抖动cha138/Article/program/Delphi/201311/8406

知识大全 用Delphi设计循环播放声音文件程序

用Delphi设计循环播放声音文件程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &

知识大全 如何使用Delphi设计强大的服务器程序

如何使用Delphi设计强大的服务器程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!现在网络的流

知识大全 如何使用Delphi设计强大的服务器程序[1]

如何使用Delphi设计强大的服务器程序[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  现

知识大全 如何使用Delphi设计强大的服务器程序[2]

如何使用Delphi设计强大的服务器程序[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  大

知识大全 delphi 缓冲画图(内存画图)解决画图闪烁问题[1]

  很多朋友在做绘图程序的时候往往出现屏幕不停刷新产生闪烁的问题这里就告诉大家一个解决办法缓冲绘图如果有人是用取反画图解决这个问题那么在画直线的时候容易出现斑点效果不是很好如果是图片很大那么缓冲画图是

在WINDOWS操作系统中,屏幕保护程序的主要作用是

在WINDOWS操作系统中,屏幕保护程序的主要作用是_____。A、保护显示器B、保护硬盘C、保护用户视力D、减低能耗答案:A解析:屏幕保护是为了保护显示器而设计的一种专门的程序,是为了防止电脑因无人

知识大全 Delphi编写你的第一个COM程序

Delphi编写你的第一个COM程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!DELPHI菜单

知识大全 如何用Delphi写一个聊天辅助程序

如何用Delphi写一个聊天辅助程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!procedur

知识大全 Delphi屏幕抓图技术的实现

Delphi屏幕抓图技术的实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!摘要本文以Delphi