亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

一個實用的Delphi屏幕拷貝程序的設計

2019-11-18 19:00:22
字體:
來源:轉載
供稿:網友
Borland 公 司( 現 改 名 為INPRISE 公 司) 的DELPHI 是 當 前 最 為 方 便 的Windows 程 序 設
計 工 具 之 一。 許 多 人 以 為DELPHI 是 作 為 數 據 庫 開 發 工 具 出 現 的, 其 實 用DELPHI
可 以 以 極 快 的 速 度 開 發 出 高 效 的Windows 程 序。

現 在 我 們 就 用DELPHI 來 編 寫 一 個 實 用 的 屏 幕 拷 貝 程 序。 瞧 瞧, 下 面 的 畫 面
就 是 所 編 程 序 運 行 后 進 行 區 域 屏 幕 拷 貝 的 例 子, 還 不 錯 吧 !

Borland 公 司 的 天 才 設 計 師 們 用 畫 布(Tcanvas) 對 象 封 裝 了Windows 的 大 部 分 圖 形
輸 出 功 能, 這 使 得 我 們 可 以 通 過 他 以 更 直 觀 的 方 式 和Windows 的 屏 幕 打 交 道,
而 不 必 關 心 令 人 頭 疼 的Windows API 函 數。 下 面 的 一 小 段 程 序 就 可 以 實 現 整 個
屏 幕 的 圖 象 拷 貝 了。

  var    //變量聲明
  Fullscreen:Tbitmap; 
  FullscreenCanvas:TCanvas;
  dc:HDC;
  //------------------------------------------------------------
  DC := GetDC (0);      //取得屏幕的 DC,參數0指的是屏幕
  FullscreenCanvas := TCanvas.Create;    //創建一個CANVAS對象
  FullscreenCanvas.Handle := DC;        //將屏幕的DC賦給HANDLE
  Fullscreen.Canvas.CopyRect
  (Rect (0, 0, screen.Width,screen.Height),
  fullscreenCanvas,
  Rect (0, 0, Screen.Width, Screen.Height));
                            //把整個屏幕復制到BITMAP中
  FullscreenCanvas.Free;          //釋放CANVAS對象
  ReleaseDC (0, DC);              //釋放DC
  //SCREEN對象是DELPHI預先定義的屏幕對象,直接使用就行了。


看 了 以 上 代 碼, 你 就 會 發 現 用DELPHI 寫 屏 幕 拷 貝 程 序 的 確 很 簡 單。

當 然 要 寫 一 個 實 用 的 屏 幕 拷 貝 程 序, 光 靠 上 述 代 碼 是 不 夠 的, 下 面 講 一
下 主 要 的 編 程 思 路:

1. 全 屏 幕 拷 貝 的 實 現

首 先 隱 藏 拷 屏 程 序, 延 長 一 定 時 間 后, 利 用 上 述 的 程 序 即 可 實 現 屏 幕 的
拷 貝。

2. 區 域 拷 貝 的 實 現

要 實 現 區 域 拷 貝 要 用 個 小 技 巧, 首 先 調 用 全 屏 幕 拷 貝 程 序 把 整 個 屏 幕 拷
貝 下 來, 然 后 把 拷 貝 下 來 的 圖 象 顯 示 在 屏 幕 上, 之 后 就 可 以 讓 用 戶 在 上 面
選 擇 需 要 的 區 域, 最 后 才 將 用 戶 選 定 的 區 域 復 制 下 來。

編 程 實 現:

1. 首 先 用DELPHI3 開 一 個 工 程。

2. 在FORM 上 放 置 一 個TPANEL 元 件, 設 置ALIGN=ALTOP, 再 選 部 件 條ADDITIONAL 上
的TSCROLLBOX, 放 到FORM 上, 設 置ALIGN=ALCLIENT, 然 后 在SCROLLBOX 上 放 置 一 個
TIMAGE 對 象。

3. 在PANEL 上 放 置4 個 按 鈕, 分 別 為FULL SCREEN,REGIN,SAVE,EXIT。

4. 容 易 干 的 先 干, 在EXIT 按 鈕 的CLICK 事 件 里 寫 下 代 碼

procedure TForm1.ExitClick(Sender: TObject);
begin
    close;
end;
5. 接 著 是 實 現 全 屏 幕 拷 貝 了, 在FROM 上 放 置 一 個 記 時 器TTIMER,ENABLED 設 為
FALSE,INTERVAL 設 為500, 也 就 是 半 秒 鐘 激 活 一 次。 雙 擊TIMER 部 件, 寫 上 如 下 的
代 碼。

procedure TForm1.Timer1Timer(Sender: TObject);
var
Fullscreen:Tbitmap;
FullscreenCanvas:TCanvas;
dc:HDC;
begin
    timer1.Enabled:=false;  //取消時鐘
    Fullscreen := TBitmap.Create;      //創建一個BITMAP來存放圖象
    Fullscreen.Width := screen.width;
    Fullscreen.Height := screen.Height;
    DC := GetDC (0);  //取得屏幕的 DC,參數0指的是屏幕
    FullscreenCanvas := TCanvas.Create; //創建一個CANVAS對象
    FullscreenCanvas.Handle := DC;

Fullscreen.Canvas.CopyRect
(Rect (0, 0, screen.Width, screen.Height), fullscreenCanvas,
Rect (0, 0, Screen.Width, Screen.Height));
            //把整個屏幕復制到BITMAP中
    FullscreenCanvas.Free;          //釋放CANVAS對象
    ReleaseDC (0, DC);              //釋放DC
    //*******************************
    image1.picture.Bitmap:=fullscreen;//拷貝下的圖象賦給IMAGE對象
    image1.Width:=fullscreen.Width;
    image1.Height:=fullscreen.Height;
    fullscreen.free;                //釋放bitmap
    form1.WindowState:=wsNormal;    //復原窗口狀態
    form1.show;                    //顯示窗口
    messagebeep(1);  //BEEP叫一聲,報告圖象已經截取好了。
end;
6. 接 下 去FULLSCREEN 按 鈕 上 的 代 碼 就 很 簡 單 了。

procedure TForm1.FullscreenClick(Sender: TObject);
begin
    form1.WindowState:=wsMinimized; //最小化程序窗口
    form1.hide;                    //把程序藏起來
    timer1.enabled:=true;          //打開記時器
end;
7. 拷 貝 到 了 圖 象 當 然 要 存 起 來 了,SAVE 按 鈕 就 有 了 用 武 之 地, 我 們 寫 下 如
下 代 碼。

procedure TForm1.Save1Click(Sender: TObject);
begin
  if savedialog1.Execute then
    begin
    form1.Image1.Picture.SaveToFile(savedialog1.filename)
    end;
end;
8. 下 面 是 區 域 拷 貝 的 實 現。 再New 一 個FORM,BorderStype 設 為 bsNone, 這 樣 能 夠 顯 示
為 全 屏 幕, 上 面 放 置 一 個TIMAGE 部 件,ALIGN 設 為ALCLIENT, 另 外 放 置 一 個TTIMER
部 件,TIMER 部 件 的 程 序 跟 上 面 的 很 象, 因 為 它 首 先 要 實 現 的 是 全 屏 幕 的 拷
貝。

procedure TForm2.Timer1Timer(Sender: TObject);
var
Fullscreen:Tbitmap;
FullscreenCanvas:TCanvas;
dc:HDC;
begin
    timer1.Enabled:=false;
    Fullscreen := TBitmap.Create;   
    Fullscreen.Width := screen.width;
    Fullscreen.Height := screen.Height;
    DC := GetDC (0); 
    FullscreenCanvas := TCanvas.Create;
    FullscreenCanvas.Handle := DC;
Fullscreen.Canvas.CopyRect (Rect
(0, 0, screen.Width, screen.Height), fullscreenCanvas,
    Rect (0, 0, Screen.Width, Screen.Height));
    FullscreenCanvas.Free;       
    ReleaseDC (0, DC);
    image1.picture.Bitmap:=fullscreen;
    image1.Width:=fullscreen.Width;
    image1.Height:=fullscreen.Height;
    fullscreen.free;               
    form2.WindowState:=wsMaximized;
    form2.show;

    messagebeep(1);
    foldx:=-1;
    foldy:=-1;
    image1.Canvas.Pen.mode:=pmnot; //筆的模式為取反
    image1.canvas.pen.color:=clblack; //筆為黑色
    image1.canvas.brush.Style:=bsclear; //空白刷子
    flag:=true;
end;
9.TIMAGE 部 件 上 有 兩 個 事 件 的 程 序 需 要 編 寫, 一 個 是ONMOUSEDOWN, 另 一 個
是ONMOUSEMOVE。

10. 可 以 回 頭 看 看 區 域 拷 貝 的 思 路, 此 時 需 要 作 區 域 拷 貝 的 屏 幕 我 們 已 經
得 到, 也 顯 示 在 屏 幕 上 了, 按 下 鼠 標 左 鍵 是 區 域 的 原 點, 此 后 移 動 鼠 標, 將
有 一 個 矩 形 在 原 點 和 鼠 標 之 間, 它 會 隨 著 鼠 標 的 移 動 而 變 化, 再 次 按 下 鼠
標 的 左 鍵, 此 時 矩 形 所 包 含 的 區 域 就 是 我 們 要 得 到 的 圖 象 了。

11. 所 以MOUSEDOWN 有 兩 次 響 應 的 處 理, 見 以 下 程 序。

procedure TForm2.Image1MouseDown
(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 image1.canvas do
      begin             
        moveTo(foldx,0);
        LineTo(foldx,screen.height);
        moveto(0,foldy);
        lineto(screen.width,foldy);
      end;
  x1:=x;           
  y1:=y;
  oldx:=x;
  oldy:=y;
  trace:=true;
  image1.Canvas.Pen.mode:=pmnot;    //筆的模式為取反
        //這樣再在原處畫一遍矩形,相當于擦除矩形。
  image1.canvas.pen.color:=clblack;  //筆為黑色
  image1.canvas.brush.Style:=bsclear;//空白刷子
  end
  else           
  begin      //第二次點擊,表示已經得到矩形了,
              //把它拷貝到FORM1中的IMAGE部件上。
    x2:=x;
    y2:=y;
    trace:=false;
    image1.canvas.rectangle(x1,y1,oldx,oldy);
    width:=abs(x2-x1);
    height:=abs(y2-y1);
    form1.image1.Width:=Width;
    form1.image1.Height:=Height;

    newbitmap:=Tbitmap.create; 
    newbitmap.width:=width;
    newbitmap.height:=height;
newbitmap.Canvas.CopyRect
(Rect (0, 0, width, Height),form2.image1.canvas,
    Rect (x1, y1,x2,y2)); //拷貝
    form1.image1.picture.bitmap:=newbitmap; //放到FORM的IMAGE上
    newbitmap.free;   
    form2.hide;
    form1.show;
  end;
end;

12.MOUSEMOVE 的 處 理 就 是 在 原 點 和 鼠 標 當 前 位 置 之 間 不 斷 地 畫 矩 形 和 擦
除 矩 形。

procedure TForm2.Image1MouseMove
(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if trace=true then  //是否在追蹤鼠標?
    begin            //是,擦除舊的矩形并畫上新的矩形
    with image1.canvas do
      begin
      rectangle(x1,y1,oldx,oldy);
      Rectangle(x1,y1,x,y);
      oldx:=x;
      oldy:=y;
      end;
    end
  else if flag=true then  //在鼠標所在的位置上畫十字
      begin
      with image1.canvas do
        begin
        moveTo(foldx,0);          //擦除舊的十字
        LineTo(foldx,screen.height);
        moveto(0,foldy);
        lineto(screen.width,foldy);
        moveTo(x,0);              //畫上新的十字
        LineTo(x,screen.height);
        moveto(0,y);
        lineto(screen.width,y);
        foldx:=x;
        foldy:=y;
        end;
      end;
end;

13. 好 了, 讓 我 們 回 過 頭 來 編 寫REGION 按 鈕 的 代 碼。

procedure TForm1.RegionClick(Sender: TObject);
begin
form1.Hide;
form2.hide;
form2.Timer1.Enabled:=true;
end;
好 了, 我 們 終 于 勝 利 完 工 了, 趕 快 運 行 一 遍, 把 漂 亮 的 屏 幕 拷 下 來 ! 瞧
DELPHI 不 僅 是 一 個 優 秀 的 數 據 庫 開 發 工 具, 而 且 是 一 個 優 秀 的 編 寫WINDOWS
程 序 的 好 幫 手。 讓 我 們 不 禁 贊 嘆: 偉 大 的DELPHI !

寧 波 市 游 河 巷 賈 學 杰

上一篇:在delphi中如何限制鼠標的移動區域。

下一篇:Delphi的優點

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区久久久| 国产精品观看在线亚洲人成网| 国产一区二区日韩| 91成人在线播放| 亚洲人成在线观看网站高清| 欧美第一黄色网| 中文字幕精品www乱入免费视频| 国产激情999| 久久久日本电影| 美乳少妇欧美精品| 日韩av电影国产| 亚洲欧美在线磁力| 国产一区二区免费| 国产精品一区二区女厕厕| 美女国内精品自产拍在线播放| 91久久久久久久久久久久久| 国产精品永久免费视频| 亚洲国内精品在线| 7777kkkk成人观看| 亚洲国产天堂久久综合网| 免费av在线一区| 国产精品va在线播放| 欧美超级乱淫片喷水| 日本午夜在线亚洲.国产| 国产视频欧美视频| 高清一区二区三区日本久| 激情懂色av一区av二区av| 欧美日韩爱爱视频| 欧美激情视频在线| 色哟哟亚洲精品一区二区| 亚洲视频在线播放| 亚洲视频在线播放| 久久久久久久国产精品视频| 亚洲人成网站在线播| 欧美亚洲视频在线看网址| 国产欧美中文字幕| 欧美孕妇性xx| 日韩美女免费视频| 色妞色视频一区二区三区四区| 欧美激情第99页| 亚洲老头老太hd| 精品久久久久久中文字幕一区奶水| 黑人巨大精品欧美一区免费视频| 日韩av电影免费观看高清| 91精品免费看| 久久精品视频播放| 日韩在线视频线视频免费网站| 7777免费精品视频| 91亚洲精华国产精华| 亚洲欧美日韩第一区| 亚洲天堂一区二区三区| 亚洲国产成人久久| 一区二区亚洲欧洲国产日韩| 国产精品视频自拍| 中文字幕精品—区二区| 国产不卡视频在线| 欧美成aaa人片在线观看蜜臀| www国产亚洲精品久久网站| 69视频在线播放| 69国产精品成人在线播放| 疯狂做受xxxx高潮欧美日本| 一区二区国产精品视频| 91久久精品国产91性色| 国产美女精品视频免费观看| 国产欧美va欧美va香蕉在线| 欧美成人免费一级人片100| 91美女片黄在线观看游戏| 国产美女久久精品香蕉69| 粗暴蹂躏中文一区二区三区| 国产ts一区二区| 成人啪啪免费看| 在线一区二区日韩| 精品国产乱码久久久久久虫虫漫画| 久久偷看各类女兵18女厕嘘嘘| 欧美日韩免费在线观看| 国产日韩在线亚洲字幕中文| 亚洲欧美制服综合另类| 国产成人精品久久| 欧美大尺度激情区在线播放| 久久久久久久久久久网站| 国产日韩欧美中文在线播放| 国产精品免费视频xxxx| 久久午夜a级毛片| 日韩一区二区福利| 北条麻妃99精品青青久久| 69av视频在线播放| 久99九色视频在线观看| 国产精品69精品一区二区三区| 国产精品网红福利| 7777kkkk成人观看| 亚洲精品自拍第一页| 精品女同一区二区三区在线播放| 91精品久久久久久综合乱菊| 国产精品99免视看9| 亚洲黄色www| 成人中心免费视频| 国产成人精品网站| 日韩的一区二区| 日韩一区在线视频| 另类美女黄大片| 欧美中文字幕视频在线观看| 亚洲丝袜一区在线| 亚洲精品91美女久久久久久久| 日韩免费观看视频| 欧美与欧洲交xxxx免费观看| 亚洲电影免费观看高清完整版在线| 欧美精品在线极品| 97国产suv精品一区二区62| 91av在线影院| 久久影院免费观看| 国产亚洲人成网站在线观看| 亚洲女性裸体视频| 国产精品丝袜久久久久久不卡| 91久久国产精品91久久性色| 欧美在线视频观看| 欧美激情在线一区| 日韩av毛片网| 日本精品一区二区三区在线播放视频| 亚洲人在线观看| 国产91对白在线播放| 国产丝袜一区二区三区| 欧美精品一区二区免费| 精品久久久久久亚洲国产300| 亚洲男人的天堂在线播放| 精品一区二区三区四区| 欧美自拍视频在线观看| 日韩欧美精品中文字幕| 91av在线免费观看| 九九热这里只有在线精品视| 欧美日韩一二三四五区| 91手机视频在线观看| 久久久精品欧美| 亚洲人午夜精品免费| 红桃av永久久久| 亚洲欧美一区二区三区久久| 日本伊人精品一区二区三区介绍| 亚洲一区二区久久久| 国产色视频一区| 亚洲国产精品99| 日韩高清电影免费观看完整| 亚洲成人精品久久久| 日韩免费黄色av| 亚洲免费人成在线视频观看| 91亚洲人电影| 国产精品9999| 欧美黄色小视频| 人九九综合九九宗合| 日韩视频免费观看| 午夜精品美女自拍福到在线| 超碰97人人做人人爱少妇| 欧美理论电影在线播放| 精品国产乱码久久久久久天美| 91亚洲国产成人精品性色| 97在线看免费观看视频在线观看| 日韩黄色高清视频| 最近中文字幕日韩精品| 欧美成人免费全部| 国产精品三级美女白浆呻吟| 欧美激情高清视频| 亚洲成av人片在线观看香蕉| 伊人久久大香线蕉av一区二区| 国产亚洲福利一区| 欧美日韩国产一区二区三区| 高清视频欧美一级|