?? wzjh17.htm
字號:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb_2312-80"><meta name="GENERATOR" content="Microsoft FrontPage 3.0"><title>DELPHI中畫布應用技巧</title></head><body bgcolor="#FFFFFF" text="#000000"><table border="0"> <tr> <td valign="top" width="600"><font color="#0000ff"><h2 align="center">DELPHI 中 畫 布 應 用 技 巧 </font></h2> <h3 align="center">遼 寧 省 鐵 嶺 市 氣 象 局 李 瑩 </h3> <p> 在DELPHI 為 編 程 者 提 供 了 一 個 靈 活 的 繪 圖 場 所, 即 本 文 所 述 的CANVAS 類, 在DELPHI 中 的 很 多 控 件 都 具 有 此 屬 性, 使 編 程 者 可 以 在 這 些 的 控 件 的 表 面 隨 心 所 欲 的 繪 圖, 這 對 完 善 用 戶 界 面 或 者 制 作 一 些 屏 幕 特 技 都 有 著 非 凡 的 作 用, 下 面 舉 例 說 明 幾 種 特 殊 屏 幕 效 果 的 形 成 過 程。 </p> <h3>一、VANVAS 必 備 基 本 知 識: </h3> <p> 1. 具 有CANVAS 屬 性 的 控 件: <br> TBitmap ,TComboBox ,TDBComboBox ,TDBGrid ,TDBListBox ,TDirectoryListBox ,TDrawGrid ,TFileListBox ,TForm ,THeaderControl ,TImage ,TListBox ,TOutline ,TPaintBox ,TPrinter ,TStatusBar ,TStringGrid 等 , </p> <p> 2.CANVAS 屬 性 及 命 令: 篇 幅 所 限, 省 略 參 數 及 格 式 說 明, 具 體 請 參 考 文 后 程 序 及DELPHI 幫 助 文 件: </p> <pre> canvas.rectangle(): 畫 矩 形 pen.color: 定 義 畫 筆 顏 色 roundrect(): 畫 圓 角 矩 形 pen.width: 定 義 畫 筆 寬 度 arc(): 畫 弧 線( 不 填 充) brush.color: 定 義 填 充 顏 色 chord(): 畫 弧 線( 填 充) textout(): 在 固 定 位 置 輸 出 字 符 串 pie: 畫 扇 形 textwidth: 取 字 符 串 高 度 polygon(): 畫 多 邊 形 填 充 textheight: 取 字 符 串 寬 度 polyline(): 多 點 連 線( 不 填 充) font.color: 指 定 字 體 顏 色 Pixels(): 指 定 固 定 象 素 點 顏 色 值 font.size: 指 定 字 體 大 小 moveto(): 指 明 畫 線 起 點 Ellipse(): 畫 圓 或 橢 圓 lineto(): 指 明 畫 線 終 點</pre> <p> 3. 使 用CANVAS 注 意 事 項: 當 窗 口 進 行 重 畫 時, 畫 布 上 的 圖 像 將 消 失, 比 如 當 窗 口 進 行 最 小 化 又 重 新 恢 復 時, 就 會 引 起 畫 布 上 圖 像 的 消 失, 另 外 當 剛 剛 運 行 程 序 時, 窗 口 也 是 屬 于 重 新 繪 制, 所 以 如 果 在 繪 制 窗 口 之 前 在 畫 布 上 繪 圖, 彈 出 窗 口 后 將 不 能 顯 示 出 圖 像, 比 如 在TForm1.FormCreate() 事 件 中 進 行 畫 布 繪 圖 操 作 將 是 徒 勞 的, 但 可 以 在 此 事 件 中 進 行 畫 布 操 作 的 準 備 工 作, 比 如 設 置 畫 筆 的 顏 色 和 寬 度 等。 </p> <h3>二、CANCAS 應 用 舉 例: </h3> <p> 1. 為 控 件 增 加 陰 影 或 投 影 效 果: 基 本 原 理 就 是 在 利 用 該 控 件 的 父 控 件 比 如FORM 或 者 其 它 容 器 控 件 的CANVAS, 在 需 要 修 飾 的 控 件 周 圍 適 當 處 填 加 圖 像, 通 過 線 條 及 顏 色 的 合 理 達 配, 使 控 件 與 周 圍 的 圖 像 融 為 一 體, 形 成 特 殊 的 視 覺 效 果, 具 體 操 作 時 需 要 根 據 被 修 飾 控 件 的TOP、LEFT、WIDTH、HEIGHT 等 屬 性, 確 定 需 要 畫 線 的 起 點 和 終 點 坐 標, 這 樣 操 作 無 論 被 修 飾 控 件 位 置 及 尺 寸 如 何 變 化, 都 可 以 保 證 投 影 及 陰 影 效 果 完 美 的 實 現; 比 如 可 在 窗 口 中 建 立 三 個 按 鈕, 然 后 在 按 鈕2 和 按 鈕3 的CLICK 事 件 中 填 加 如 下 代 碼, 之 后 按 下 按 鈕2 或 按 鈕3 即 使 按 鈕1 形 成 投 影 和 陰 影 效 果: </p> <pre>procedure TForm1.Button2Click(Sender: TObject);varx,y,i:integer;beginx:=0;y:=0;form1.canvas.pen.width:=1;for i:=0 to 8 dobeginform1.canvas.pen.color:=$00a0a0a0;form1.canvas.moveto(Button1.left+Button1.width+x, Button1.top+y);form1.canvas.lineto(Button1.left+Button1.width+x, Button1.top+button1.height+y);form1.canvas.pen.color:=$00606060;form1.canvas.moveto(Button1.left+x, Button1.top+Button1.height+y);form1.canvas.lineto(Button1.left+Button1.width+x, Button1.top+button1.height+y);x:=x+1;y:=y+1;end;end;procedure TForm1.Button3Click(Sender: TObject);varx,y,i:integer;beginx:=0;y:=0;form1.canvas.pen.width:=1;for i:=0 to 8 dobeginform1.canvas.pen.color:=$00404040;form1.canvas.moveto(Button1.left+Button1.width+x, Button1.top+8);form1.canvas.lineto(Button1.left+Button1.width+x, Button1.top+button1.height+8);form1.canvas.moveto(Button1.left+8, Button1.top+Button1.height+y);form1.canvas.lineto(Button1.left+Button1.width+8, Button1.top+button1.height+y);x:=x+1;y:=y+1;end;end;</pre> <p> 2. 為 控 件 加 上 邊 框: DELPHI 中 有 很 多 控 件 無 邊 框 屬 性, 利 用CANVAS 可 以 為 任 意 的 控 件 填 加 邊 框, 使 其 輪 廓 清 楚; 具 體 操 作 時, 可 先 定 義 出 畫 筆 的 顏 色、 畫 筆 的 寬 度( 邊 框 寬 度), 之 后 用polyline() 命 令 根 據 相 應 控 件 的 位 置、 尺 寸 自 動 定 位 四 角 坐 標, 一 次 可 完 成 一 個 固 定 寬 度 矩 形 的 繪 制 工 作, 如 果 需 要 多 種 顏 色 或 者 具 有 立 體 效 果 的 邊 框, 可 多 次 定 義 畫 筆 顏 色, 畫 出 連 續 的 多 個 矩 形, 通 過 調 整 相 鄰 矩 形 的 顏 色 來 實 現 特 殊 效 果 的 邊 框 繪 制 工 作; 比 如 在 窗 體 中 安 放 兩 個 按 鈕, 分 別 在MOUSEMOVE 事 件 中 填 加 如 下 代 碼, 之 后 每 當 鼠 標 移 到 相 應 的 按 鈕 上 時, 相 應 的 按 鈕 就 會 出 現 特 殊 顏 色 的 邊 框, 當 鼠 標 移 到 窗 口 空 白 處 時, 則 窗 口 會 出 現 明 顯 的 邊 線, 起 到 特 殊 的 提 示 效 果; </p> <pre>procedure TForm1.Button1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);beginform1.repaint;form1.Canvas.pen.color:=clGreen;form1.Canvas.pen.width:=5;form1.Canvas.polyline([point(Button1.left,Button1.top), point(Button1.left+Button1.width,Button1.top), point(Button1.left+Button1.width,Button1.top+Button1.height), point(Button1.left,Button1.top+Button1.height), point(Button1.left,Button1.top)]);end;procedure TForm1.Button2MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);beginform1.repaint;form1.Canvas.pen.color:=clBlue;form1.Canvas.pen.width:=5;form1.Canvas.polyline([point(Button2.left,Button2.top), point(Button2.left+Button2.width,Button2.top), point(Button2.left+Button2.width,Button2.top+Button2.height), point(Button2.left,Button2.top+Button2.height), point(Button2.left,Button2.top)]);end;procedure TForm1.FormMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);beginform1.repaint;form1.Canvas.pen.color:=clRed;form1.Canvas.pen.width:=3;form1.Canvas.polyline([point(0,0), point(form1.width-10,0),point(form1.width-10,form1.height-30), point(0,form1.height-30), point(0,0)]);end;</pre> <p> 3. 為 圖 形 按 鈕 或 其 它 控 件 安 裝 動 態 幫 助 功 能, 此 處 主 要 使 用 它 的 字 符 串 顯 示 功 能, 也 就 是 當 鼠 標 移 到 指 定 控 件 上 時, 在 其 周 圍 適 當 位 置 顯 示 相 應 的 字 符 串, 當 鼠 標 離 開 時 通 過 圖 像 覆 蓋 動 作 使 字 符 串 消 失, 也 可 以 使 用 一 個 簡 單 的 命 令 完 成 即form1.repaint, 它 的 作 用 是 使FORM1 內 的 所 有 控 件 全 部 重 新 繪 制, 這 樣 即 可 快 速 清 除 原 來 顯 示 的 字 符; 編 程 時 主 要 使 用 各 個 控 件 的 MouseMove() 事 件; 比 如 可 在 窗 口 中 安 放 兩 個 按 鈕, 并 安 排 如 下 代 碼, 運 行 之 后 當 鼠 標 移 到 相 應 按 鈕 上 時, 就 會 在 其 上 方 顯 示 相 應 的 提 示 信 息, 鼠 標 移 到 窗 口 空 白 處 則 會 在 窗 口 的 左 下 角 顯 示"OK" 字 樣; </p> <pre>procedure TForm1.Button1MouseMove (Sender:TObject;Shift:TShiftState;X, Y: Integer);beginform1.repaint;form1.Canvas.brush.color:=clGreen;form1.Canvas.font.size:=8;form1.Canvas.font.color:=$1200ffff;form1.Canvas.TextOut(Button1.left, Button1.top-15,'OPEN FILE');end;procedure TForm1.Button2MouseMove (Sender:TObject;Shift:TShiftState;X, Y: Integer);beginform1.repaint;form1.Canvas.font.size:=8;form1.Canvas.brush.color:=clRed;form1.Canvas.font.color:=$1200ffff;form1.Canvas.TextOut(Button2.left,Button2.top-15,'EXIT');end;procedure TForm1.FormMouseMove (Sender:TObject;Shift:TShiftState;X, Y: Integer);beginform1.repaint;form1.Canvas.font.size:=12;form1.Canvas.brush.color:=clBlue;form1.Canvas.font.color:=$00ffffff;form1.Canvas.TextOut(0,form1.height-50,'OK');end;</pre> <p> 4. 仿 電 視 移 動 字 幕 或 圖 像, 用 此 方 法 制 作 移 動 字 幕 的 基 本 方 法 是: 首 先 選 定 一 個 可 作 為 畫 布 的 控 件, 比 如 FORM 或IMAGE, 然 后 用 一 種 填 充 顏 色 填 滿 整 個 畫 布, 在 畫 布 的 固 定 位 置 顯 示 一 個 特 殊 前 景 色 固 定 尺 寸 的 字 符 串, 在 TIMER 控 件 中 定 時 連 續 改 變 顯 示 字 符 串 的 位 置, 由 于 原 來 位 置 的 字 符 串 不 能 自 動 消 失, 所 以 需 要 用 與 填 充 顏 色 相 同 顏 色 的 線 條 覆 蓋 多 余 部 分, 這 樣 即 可 實 現 平 滑 的 字 幕 移 動 效 果; 實 現 圖 像 移 動 的 方 法: 可 事 先 定 義Bitmap 類 和Rect 類 變 量, 在 程 序 運 行 階 段 建 立Bitmap 和Rect 對 象, 并 在Bitmap 中 裝 入 指 定 的 圖 像 文 件, 同 時 把 對 象Bitmap 裝 入Rect 對 象 中 實 現 圖 像 的 顯 示, 然 后 在Timer 控 件 中 定 時 連 續 改 變Rect 的 坐 標 值, 并 用 與 填 充 顏 色 相 同 的 線 條 覆 蓋 遺 留 圖 像 部 分, 即 可 以 實 現 圖 像 的 平 穩 移 動; 采 用 上 述 方 法 實 現 的 字 符 串 或 圖 像 移 動 操 作, 其 效 果 平 穩, 無 任 何 閃 爍 或 抖 動 現 象, 視 覺 效 果 極 佳, 并 且 不 需 要 事 先 建 立 控 件, 完 全 由 程 序 代 碼 實 現, 具 有 相 當 多 的 優 點; 編 程 舉 例: 在 窗 體 中 安 放 時 間 控 件TIMER1、 圖 像 框IMAGE1, 定 義TRECT 及TBITMAP 型 變 量, 并 在FormCreate 和Timer1Timer 事 件 中 安 排 如 下 代 碼, 程 序 運 行 之 后 即 會 在 圖 像 框 中 出 現 至 下 而 上 的 移 動 字 幕 及 圖 像 效 果, 并 從 頂 部 消 失, 之 后 重 新 從 底 部 出 現; </p> <pre>var { 定 義 變 量} Form1: TForm1; x,tt,l,h:integer; pic:Trect; map:Tbitmap;{ 具 體 動 畫 演 示 代 碼}procedure TForm1.Timer1Timer(Sender: TObject);beginx:=x-1;tt:=tt-1;if x<-160 then x:="image1.height+20;" tt:="x+80;" image1.Canvas.font.size:="18;" image1.Canvas.font.color:="$1200ffff;" image1.Canvas.TextOut(10,x,'OK 字 幕 移 動 演 示'); image1.Canvas.font.size:="12;" image1.Canvas.font.color:="$120000ff;" image1.Canvas.TextOut(20,x+50,' 字 體 變 色 效 果 演 示'); l:="image1.Canvas.textwidth('" 字 體 變 色 效 果 演 示'); h:="image1.Canvas.textheight('" 字 體 變 色 效 果 演 示'); image1.Canvas.pen.color:="clGreen;" image1.Canvas.moveto(20,h+x+50-2); image1.Canvas.lineto(20+l,h+x+50-2); pic.topleft.x:="30;" pic.topleft.y:="tt;" pic.bottomright.x:="pic.topleft.x+100;" pic.bottomright.y:="pic.topleft.y+80;" image1.canvas.stretchdraw(pic,map); image1.Canvas.pen.color:="clGreen;" image1.Canvas.moveto(0,pic.topleft.y+80); image1.Canvas.lineto(pic.topleft.x+100,pic.topleft.y+80); end; { 以 下 設 置 動 畫 初 值} procedure TForm1.FormCreate(Sender: TObject); begin timer1.enabled:="true;" timer1.Interval:="10;" x:="image1.height+20;" tt:="x+80;" form1.repaint; image1.Canvas.brush.color:="clGreen;" pic:="Rect(0,0,image1.width,image1.height);" image1.Canvas.FillRect(pic); pic:="Rect(-1,-1,1,1);" map:="Tbitmap.create;" map.loadfromfile('d:\windows\256color.bmp'); image1.canvas.stretchdraw(pic,map); end; </pre> 以 上 方 法 及 程 序 在WINDOWS95 系 統 下、DELPHI2.0 環 境 下 調 試 通 過。</pre> </td> </tr></table></body></html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -