处 理 句 柄, 另 外 它 一 般 声 明 在 构 件 的protected 或private 区. 4.在 消 息 处 理 句 柄 中 一 般 先 是 用 户 自 己 对 消 息 的 处 理, 最 后 用inherited 命 令 调 用 祖 先 类 中 对 应 此 消 息 的 处 理 句 柄( 有 些 情 况 下 可 能 正 相 反). 由 于 可 能 对 祖 先 类 中 对 此 消 息 的 处 理 句 柄 的 名 字 和 参 数 类 型 不 清 楚, 而 调 用 命 令inherited 可 以 避 免 此 麻 烦, 同 样 如 果 祖 先 类 中 没 有 对 应 此 消 息 的 处 理 句 柄,inherited 就 会 自 动 调 用Defaulthandler 方 法.( 当 然 如 果 要 屏 蔽 掉 此 消 息, 就 不 用inherited 命 令 了)。
消 息 处 理 句 柄 方 法 声 明 为:
procedure Mymsgmethod(var message:Tmessage); message Msgtype;
同 样 用 户 也 可 以 定 义 自 己 的 消 息, 用 户 自 定 义 消 息 应 从WM_USER 开 始.
自 定 义 消 息 及 消 息 处 理 句 柄 举 例 如 下:
const my_paint=Wm_user+1;
type
Tmypaint=record
msgid:cardinal;
msize:word;
mcolor:longint;
msgresult:longint;
end;
type
Tmycontrol=class(TCustomControl)
protected
procedure change(var message:Tmypaint); message my_paint;
..
end;
procedure Tmycontrol.change(var message:Tmypaint);
begin
size:=message.msize; { 设 置Tmybutton 尺 寸 属 性}
color:=message.mcolor; { 设 置Tmybutton 颜 色 属 性}
{do something else}
inherited; { 交 由Tcustomcontrol 处 理}
end;
三. 过 滤 消 息
过 滤 消 息 又 称 消 息 陷 阱。 在 一 定 情 况 下, 用 户 可 能 需 要 屏 蔽 某 些 消 息. 或 者 截 获 某 些 消 息 进 行 处 理。 由 以 上 介 绍 可 以 看 出 过 滤 消 息 一 般 有 三 种 途 径:(1). 重 载 构 件 继 承 的 虚 拟 方 法wndproc. (2). 针 对 某
消 息 编 写 消 息 处 理 句 柄. (3). 重 载 构 件 继 承 的 虚 拟 方 法Defhandler, 在 其 中 对 消 息 进 行 处 理。 其 中 常 用 的 方 法 是 方 法(2), 在 上 节 中 已 介 绍 过 了, 方 法(1) 与 方 法(3) 相 似, 这 里 只 简 单 介 绍 一 下 方 法(1)。
重 载 虚 拟 方 法wndproc 的 一 般 过 程 如 下:
procedure Tmyobject.wndproc(var message:Tmessage);
begin
{ 判 断 此 消 息 是 否 该 处 理..}
inherited wndproc(message);
{ 未 处 理 的 消 息 交 由 父 辈wndproc 方 法 处 理}
end;
由 此 可 以 看 出 在wndproc 方 法 中 处 理 消 息 的 优 势 是 可 以 过 滤 整 个 范 围 内 的 消 息, 而 不 必 为 每 个 消 息 指 定 一 个 处 理 句 柄, 事 实 上Tcontrol 构 件 中 就 是 利 用 它 来 过 滤 并 处 理 所 有 的 鼠 标 消 息 的(
从WM_mousefirst 到WM_mouselast, 如 下 代 码 示). 同 样 利 用 它 也 可 以 阻 止 某 些 消 息 被 发 送 给 处 理 句 柄。
procedure TControl.WndProc(var Message: TMessage);
begin
if (Message.Msg>=WM_MOUSEFIRST) and
(Message.Msg <= WM_MOUSELAST)
then
if Dragging then { 处 理 拖 曳 事 件}
DragMouseMsg(TWMMouse(Message))
else
{ 处 理 其 他 鼠 标 消 息}
end;
Dispatch(Message);
{ 否 则 正 常 发 送 消 息}
end;
下 例 为 一 简 单 的 自 定 义 构 件 例 子 :
Tmyedit 类 是 从Tedit 类 派 生 出 的 一 个 新 类, 它 的 特 点 是 在 运 行 中 不 能 获 得 焦 点, 不 能 由 键 盘 输 入( 有 点 类 似Tlabel 构 件). 我 们 可 在 其wndproc 方 法 中 过 滤 出WM_setfocus,WM_mousemove 消 息 并 进 行 处 理 来 达 到 上 述
要 求, 源 程 序 如 下:
unit myedit;
interface
uses
Windows, Messages, SysUtils, Classes,