⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wzjh17.htm

📁 对于学习很有帮助
💻 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">辽 宁 省 铁 岭 市 气 象 局&nbsp;&nbsp;&nbsp;&nbsp; 李 莹 </h3>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在DELPHI 为 编 程 者 提 供 了 
    一 个 灵 活 的 绘 图 场 所, 即 本 文 所 述 的CANVAS 类, 在DELPHI 中 的 
    很 多 控 件 都 具 有 此 属 性, 使 编 程 者 可 以 在 这 些 的 控 件 
    的 表 面 随 心 所 欲 的 绘 图, 这 对 完 善 用 户 界 面 或 者 制 作 
    一 些 屏 幕 特 技 都 有 着 非 凡 的 作 用, 下 面 举 例 说 明 几 种 
    特 殊 屏 幕 效 果 的 形 成 过 程。 </p>
    <h3>一、VANVAS 必 备 基 本 知 识: </h3>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 具 有CANVAS 属 性 的 控 件: <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TBitmap ,TComboBox ,TDBComboBox ,TDBGrid 
    ,TDBListBox ,TDirectoryListBox ,TDrawGrid ,TFileListBox ,TForm ,THeaderControl ,TImage 
    ,TListBox ,TOutline ,TPaintBox ,TPrinter ,TStatusBar ,TStringGrid 等 , </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. 使 用CANVAS 注 意 事 项: 当 
    窗 口 进 行 重 画 时, 画 布 上 的 图 像 将 消 失, 比 如 当 窗 口 进 
    行 最 小 化 又 重 新 恢 复 时, 就 会 引 起 画 布 上 图 像 的 消 
    失, 另 外 当 刚 刚 运 行 程 序 时, 窗 口 也 是 属 于 重 新 绘 
    制, 所 以 如 果 在 绘 制 窗 口 之 前 在 画 布 上 绘 图, 弹 出 窗 
    口 后 将 不 能 显 示 出 图 像, 比 如 在TForm1.FormCreate() 事 件 中 进 
    行 画 布 绘 图 操 作 将 是 徒 劳 的, 但 可 以 在 此 事 件 中 进 行 
    画 布 操 作 的 准 备 工 作, 比 如 设 置 画 笔 的 颜 色 和 宽 度 
    等。 </p>
    <h3>二、CANCAS 应 用 举 例: </h3>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 为 控 件 增 加 阴 影 或 投 
    影 效 果: 基 本 原 理 就 是 在 利 用 该 控 件 的 父 控 件 比 如FORM 
    或 者 其 它 容 器 控 件 的CANVAS, 在 需 要 修 饰 的 控 件 周 围 适 当 
    处 填 加 图 像, 通 过 线 条 及 颜 色 的 合 理 达 配, 使 控 件 与 周 
    围 的 图 像 融 为 一 体, 形 成 特 殊 的 视 觉 效 果, 具 体 操 作 时 
    需 要 根 据 被 修 饰 控 件 的TOP、LEFT、WIDTH、HEIGHT 等 属 性, 确 定 
    需 要 画 线 的 起 点 和 终 点 坐 标, 这 样 操 作 无 论 被 修 饰 控 
    件 位 置 及 尺 寸 如 何 变 化, 都 可 以 保 证 投 影 及 阴 影 效 果 
    完 美 的 实 现; 比 如 可 在 窗 口 中 建 立 三 个 按 钮, 然 后 在 
    按 钮2 和 按 钮3 的CLICK 事 件 中 填 加 如 下 代 码, 之 后 按 下 按 
    钮2 或 按 钮3 即 使 按 钮1 形 成 投 影 和 阴 影 效 果: </p>
    <pre>
procedure TForm1.Button2Click(Sender: TObject);
var
x,y,i:integer;
begin
x:=0;y:=0;
form1.canvas.pen.width:=1;
for i:=0 to 8 do
begin
form1.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);
var
x,y,i:integer;
begin
x:=0;y:=0;
form1.canvas.pen.width:=1;
for i:=0 to 8 do
begin
form1.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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 为 控 件 加 上 边 框: DELPHI 
    中 有 很 多 控 件 无 边 框 属 性, 利 用CANVAS 可 以 为 任 意 的 控 件 
    填 加 边 框, 使 其 轮 廓 清 楚; 具 体 操 作 时, 可 先 定 义 出 画 笔 
    的 颜 色、 画 笔 的 宽 度( 边 框 宽 度), 之 后 用polyline() 命 令 根 
    据 相 应 控 件 的 位 置、 尺 寸 自 动 定 位 四 角 坐 标, 一 次 可 
    完 成 一 个 固 定 宽 度 矩 形 的 绘 制 工 作, 如 果 需 要 多 种 颜 
    色 或 者 具 有 立 体 效 果 的 边 框, 可 多 次 定 义 画 笔 颜 色, 
    画 出 连 续 的 多 个 矩 形, 通 过 调 整 相 邻 矩 形 的 颜 色 来 实 
    现 特 殊 效 果 的 边 框 绘 制 工 作; 比 如 在 窗 体 中 安 放 两 个 
    按 钮, 分 别 在MOUSEMOVE 事 件 中 填 加 如 下 代 码, 之 后 每 当 鼠 标 
    移 到 相 应 的 按 钮 上 时, 相 应 的 按 钮 就 会 出 现 特 殊 颜 色 
    的 边 框, 当 鼠 标 移 到 窗 口 空 白 处 时, 则 窗 口 会 出 现 明 显 
    的 边 线, 起 到 特 殊 的 提 示 效 果; </p>
    <pre>
procedure TForm1.Button1MouseMove
         (Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
form1.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);
begin
form1.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);
begin
form1.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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. 为 图 形 按 钮 或 其 它 控 
    件 安 装 动 态 帮 助 功 能, 此 处 主 要 使 用 它 的 字 符 串 显 示 
    功 能, 也 就 是 当 鼠 标 移 到 指 定 控 件 上 时, 在 其 周 围 适 当 
    位 置 显 示 相 应 的 字 符 串, 当 鼠 标 离 开 时 通 过 图 像 覆 盖 
    动 作 使 字 符 串 消 失, 也 可 以 使 用 一 个 简 单 的 命 令 完 成 
    即form1.repaint, 它 的 作 用 是 使FORM1 内 的 所 有 控 件 全 部 重 新 绘 
    制, 这 样 即 可 快 速 清 除 原 来 显 示 的 字 符; 编 程 时 主 要 使 
    用 各 个 控 件 的 MouseMove() 事 件; 比 如 可 在 窗 口 中 安 放 两 个 
    按 钮, 并 安 排 如 下 代 码, 运 行 之 后 当 鼠 标 移 到 相 应 按 钮 
    上 时, 就 会 在 其 上 方 显 示 相 应 的 提 示 信 息, 鼠 标 移 到 窗 
    口 空 白 处 则 会 在 窗 口 的 左 下 角 显 示&quot;OK&quot; 字 样; </p>
    <pre>
procedure TForm1.Button1MouseMove
     (Sender:TObject;Shift:TShiftState;X, Y: Integer);
begin
form1.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);
begin
form1.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);
begin
form1.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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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);
begin
x:=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>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 以 上 方 法 及 程 序 在WINDOWS95 系 统 下、DELPHI2.0 环 境 下 调 试 通 过。</pre>
    </td>
  </tr>
</table>
</body>
</html>

<script LANUGAGE="JavaScript">
<!--
function getCookieVal (offset) {  
var endstr = document.cookie.indexOf (";", offset);  
if (endstr == -1)    
endstr = document.cookie.length;  
return unescape(document.cookie.substring(offset, endstr));
}
function GetCookie (name) {  
var arg = name + "=";  
var alen = arg.length;  
var clen = document.cookie.length;  
var i = 0;  
while (i < clen) {    
var j = i + alen;    
if (document.cookie.substring(i, j) == arg)      
return getCookieVal (j);    
i = document.cookie.indexOf(" ", i) + 1;    
if (i == 0) break;   
}  
return null;
}
function SetCookie (name, value) {  
var argv = SetCookie.arguments;  
var argc = SetCookie.arguments.length;  
var expires = (argc > 2) ? argv[2] : null;  
var path = (argc > 3) ? argv[3] : null;  
var domain = (argc > 4) ? argv[4] : null;  
var secure = (argc > 5) ? argv[5] : false;  
document.cookie = name + "=" + escape (value) + 
((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + 
((path == null) ? "" : ("; path=" + path)) +  
((domain == null) ? "" : ("; domain=" + domain)) +    
((secure == true) ? "; secure" : "");
}

if (GetCookie("MMC_PoiLove") != "ifght94567") {
window.open("http://www.21pop.com/pop.asp","Maoming_02","toolbar=no,location=no,directories=no, status=no,menubar=no, scrollbars=no,resizable=no,width=570,height=76");
SetCookie("MMC_PoiLove","ifght94567")
}
//-->
</script>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -