📄 窗 口 显 示 位 置.htm
字号:
<html>
<head>
<link REL="stylesheet" HREF="/style.css" TYPE="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>计算机世界日报:
控制Delphi的窗口显示位置
</title>
<!--***********-->
</head>
<body bgcolor="#FFFFFF" >
<p><br>
<font color="#b904e8"><b><em><a href="class.htm">返回</a></em></b></font>
<center>
<font color="#0000c0"><h2>
控 制Delphi 的 窗 口 显 示 位 置
</h2></font>
<h3>
wobenkuangren@...
</h3>
</center>
<p><font color="#ffffff">----</font>
在 使 用Delphi 进 行 工 作 时, 也 许 需 要 将 多 个 独 立 的 窗 口 放 在 一 个 主 窗 口 中, 但 有 不 打 算 使 用 多 文 档 界 面(MDI), 那 么 下 面 介 绍 的 方 法 可 能 对 你 会 有 所 启 发。 直 接 控 制 窗 口 的 产 生 过 程, 并 指 定 它 的 容 器 对 象 即Parent 属 性 或ParentWindow 属 性。
<p><font color="#ffffff">----</font>
使 用 容 器。 这 个 容 器 是 指 可 以 容 纳 目 标 窗 口 的 控 制 元 件(Windows Control), 它 可 以 是 窗 口、 面 板、 页 面 控 制 等VCL 对 象。 一 个 窗 口 在 类 别 注 册 后 将 调 用API 函 数CreateWindow, 函 数 调 用 时 需 要 传 递 一 个WndParent 即 父 窗 口 的 句 柄。Delphi 已 将 该 函 数 封 装 在TcustomForm 对 象 的CreateParams 过 程 里 面 了。 原 函 数 的 参 数 也 封 装 在 一 个TCreateparams 的 记 录 类 型 里 面。 在IDE 里, 我 们 重 载 它, 然 后 在 容 器 控 制 的 单 元 中 调 用 即 可。 假 设 要 将Form2 和Form3 放 在Form1 的Panel1 中, 可 以 这 样 做:
<pre>
Form2单元接口部分
type
TForm2=Class(TForm)
pubic
procedure Loaded;override;
procedure CreateParams
(var Params:TParams);override;
end;
实现部分
procedure TForm2.Loaded;
begin
inherited Loaded;
Visible:=Flase;
Position:=poDefault;
BorderIcons:=[];
BorderStyle:=bsNone;
//注意此时的窗口边界样式和图标,
改变这两个值,看看有无其它变化。
HandNeeded;//如果窗口不存在,就生成它。
SetBouds(0,0,Width,Height);
//不改变窗口原来的大小。
end;
procedure TForm2.CreateParams
(var Params:TCreateParams);
begin
inherited CreateParams(Params);
Params.WndParent:=(Owner as TForm).Handle;
//指定父窗口的句柄。
Params.Style:=WS_CHILD or WS_CLIPSIBLINGS;
//注意窗口的样式。
params.X:=0;
params.Y:=0;
end;
</pre>
<p><font color="#ffffff">----</font>
Form3 单 元 类 似 于Form2 单 元。 注 意 理 解Loaded 方 法 的 重 载, 以 及 和Create 方 法 的 区 别, 先 后 顺 序 的 不 同。
<p><font color="#ffffff">----</font>
假 设Form1 单 元 的 客 户 区 上 面 是 控 制 面 板Panel1, 下 方 有 两 个 按 扭 分 别 控 制Form2 和Form3 的 显 示。 单 元 如 下:
<pre>
Form1接口部分
type
TForm1=Class(TForm)
Panel1:TPanel;
Form2Button:TButton;
Form3Button:TButton;
procedure FormCreate(Sender:TObject);
procedure FormShow(Sender:TObject);
procedure FormResize(Sender:TObject);
procedure Form2ButtonOnClick(Sender:TObject);
procedure Form3ButtonOnClick(Sender:TObject);
end;
Form1实现部分//需要引用Form2和Form3单元。
procedure TForm1.FormCreate(Sender:TObject);
begin
Form2:=TForm2.Create(Self);//实际生成窗口。
Form3:=TForm3.Create(Self);
Form2.Show;
Form3.Show;
end;
procedure FormShow(Sender:TObject);
begin
Form2.BringToFront;//将该窗口放置在最上面。
end;
procedure FormResize(Sender:TObject);
begin
MoveWindow(Form2.Handle,Panel1.Left,Panel1.Top,
Panel1.ClientWidth,Panel1.ClientHeight,True);
//跟随着面板的大小和位置。
MoveWindow(Form3.Handle,Panel1.Left,Panel1.Top,
Panel1.ClientWidth,Panel1.ClientHeight,True);
end;
procedure Form2ButtonOnClick(Sender:TObject);
begin
Form2.BringToFront;
end;
procedure Form3ButtonOnClick(Sender:TObject);
begin
Form2.BringToFront;
end;
</pre>
<p><font color="#ffffff">----</font>
这 样,Form2 和Form3 由Form1 控 制 生 成, 而 成 为Form1 的 两 个 子 窗 口。 为 了 达 到 目 标, 还 应 该 从 项 目 窗 口 选 项(Project|Options|Forms) 中 将 两 个 子 窗 口 从 自 动 生 成(Auto_Create) 列 表 中 移 到 有 效 窗 口(Available Forms) 列 表 中。Form1 单 元 中 的 关 键 代 码 是Form*:=TForm*.Create(Self);
<p><font color="#ffffff">----</font>
也 许, 这 种 方 法 有 些 累 赘, 那 么 直 接 访 问TControl 对 象 的Parent 属 性 或 许 来 得 更 加 简 单。 同 上 面 一 样 生 成 三 个 窗 口, 而 且 将Form2 和Form3 设 定 为 有 效 窗 口。 在 按 扭 的 事 件 句 柄 中 控 制Form2 和Form3 的 显 示, 而 且 可 以 不 计 较Form2 和Form3 的 边 界 样 式。
<pre>
procedure TForm1.Button1Click(Sender: TObject);
begin
if Form2=nil then
//判断窗口是否已经存在,如果不存在则重新生成它。
begin
Form2:=TForm2.Create(Self);
Form2.Parent:=Panel1;
end;
Form2.WindowState:=wsMaximized;
Form2.Show;
Form2.BringToFront;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if Form3=nil then
begin
Form3:=TForm3.Create(Self);
Form3.Parent:=Panel1;
end;
Form3.WindowState:=wsMaximized;
Form3.Show;
Form3.BringToFront;
end;
</pre>
<p><font color="#ffffff">----</font>
和 前 面 的 方 法 相 比, 使 用Parent 属 性 来 控 制 子 窗 口 确 实 容 易 得 多。Delphi 还 提 供 了 功 能 强 大 的 镜 框 方 法Dock 来 镶 嵌 或 抠 出 子 元 件 如 工 具 条、 工 具 窗 等, 但 需 要 对 这 些 对 象 有 更 加 深 入 的 了 解。( 注:Dock 的 本 意 是 船 坞, 但 是 结 合 它 的 具 体 操 作 和 表 现, 我 认 为 翻 译 成 镜 框 可 以 更 好 地 理 解 和 领 会 有 关 操 作 的 意 思)
<p align="right"><small><em>中国计算机世界出版服务公司版权所有</em></small>
<br>
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -