DELPHI中的消息处理机制(3) 消 息 处 理 句 柄 方 法 声 明 为: 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 { 处 理 拖 曳 事 件}