科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件DELPHI中的消息处理机制

DELPHI中的消息处理机制

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Delphi 是Borland 公 司 提 供 的 一 种 全 新 的WINDOWS 编 程 开 发 工 具. 由 于 它 采 用 了 具 有 弹性 的 和 可 重 用 的 面 向 对 象Pascal(object-oriented pascal) 语 言, 并 有 强 大 的 数 据 库 引 擎(BDE)......

作者:马勇 来源:DELPHI大师 2007年11月1日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
 三. 过 滤 消 息

  过 滤 消 息 又 称 消 息 陷 阱。 在 一 定 情 况 下, 用 户 可 能 需 要 屏 蔽 某 些 消 息. 或 者 截 获 某 些 消 息 进 行 处 理。 由 以 上 介 绍 可 以 看 出 过 滤 消 息 一 般 有 三 种 途 径:

  (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, Graphics, Controls, Forms, Dialogs,StdCtrls;

  type

   Tmyedit = class(TEdit)

  private

   { Private declarations }

  protected

   { Protected declarations }

   { other fields and methods}

  procedure wndproc(var message:Tmessage);override;

  public

   { Public declarations }

  published

   { Published declarations }

  end;

  procedure Register;

  implementation

  procedure Register;

  begin

   RegisterComponents('Samples', [Tmyedit]);

  end;

  procedure Tmyedit.wndproc(var message:tmessage);

  begin

   if message.msg=wm_mousemove then

   begin

   cursor:=crarrow;

   { 设 置 光 标 为crarrow, 而 不 是 缺 省 的crBeam 光 标}

   exit;

  end;

  if message.msg=wm_SetFocus then exit;

   {屏蔽掉WM_setfocus消息,不让Tmyedit控件获得输入焦点}

   inherited wndproc(message);

   {其他消息交父辈wndproc处理}

   end;

  end.

您 可 以 将Tmyedit 加 到Component Palette 中 检 验 其 性 能。

由 以 上 介 绍 可 以 看 出, 只 有 清 楚 了Delphi VCL 中 的 消 息 处 理 机 制, 掌 握 好 处 理 各 种 消 息 的 方 法 和 时 机( 必 要 时 要 借 助 各 种 工 具, 如winsight32,spy 等), 并 结 合OOP 语 言 的 特 点, 我 们 才 可 能 编 出 高 质 量 的 构 件。 这 当 然 要 靠 读 者 在 实 践 中 不 断 摸 索, 积 累 经 验。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章