zoukankan      html  css  js  c++  java
  • 学习 Message(1): 消息发送

    消息流程:

    譬如用鼠标左键点击一下窗体, 系统会收到一条 WM_LBUTTONDOWN 消息;
    当鼠标抬起, 系统又会收到 WM_LBUTTONUP 消息.

    系统收到消息后, 会告诉窗体发生的事情, 然后窗体再做出反应; 当然窗体能否做出反应要看窗体是否有相应的响应代码.

    要响应 WM_LBUTTONDOWN 消息, 我们需要在 OnMouseDown 事件中写代码;
    要响应 WM_LBUTTONUP 消息, 我们需要在 OnMouseUp 事件中写代码;

    当然我们也可以通过其他方法(譬如消息方法)来响应消息.

    关于消息流程, 这样说其实不够完整, 更详细的流程可以参见:
    http://www.cnblogs.com/del/archive/2008/04/08/1142768.html 系列.

    消息发送:

    我们通过鼠标、键盘等操作, 就在有意无意地随时向系统发送消息; 但有时我也需要间接发送消息, 譬如: 我们并不需要点击窗体, 也可以向窗体发送一条 WM_LBUTTONDOWN 消息, 从而引发 OnMouseDown 事件的执行.

    发送消息的常用函数:
    function SendMessage(
      hWnd: HWND;        {目标句柄}
      Msg: UINT;         {要发送的消息(编号)}
      wParam: WPARAM;    {消息参数}
      lParam: LPARAM     {消息参数}
    ): LRESULT; stdcall; {返回处理结果}
    
    function PostMessage(
      hWnd: HWND;     {目标句柄}
      Msg: UINT;      {要发送的消息(编号)}
      wParam: WPARAM; {消息参数}
      lParam: LPARAM  {消息参数}
    ): BOOL; stdcall; {是否发送成功}
    
    function Perform(
      Msg: Cardinal;  {要发送的消息(编号)}
      WParam: WPARAM; {消息参数}
      LParam: LPARAM  {消息参数}
    ): LRESULT;       {返回处理结果}
    

    SendMessage 发送消息后会等待处理结果;
    PostMessage 把消息送人等待处理的消息队列.

    发送 SendMessage 消息好比: 你扔一颗手榴弹到敌群中, 并期待看到血肉横飞的场面;
    发送 PostMessage 消息好比: 你在敌人就要路过的地方埋上一颗地雷, 你就不管了.

    其实 SendMessage 和 PostMessage 在实用过程中区别并不是很大.

    Perform 和上面两个不同, 它是控件的一个方法, 最早定义在 TControl 类, TControl 的子孙都有这个方法, TControl 之上的父类们不需要处理消息, 也没有消息要处理.

    Perform 和 SendMessage 更相似, 但貌似少了一个参数, 其实没有, 只是换了一下位置, 看它的调用对比:
    SendMessage(控件句柄, 消息, 参数, 参数);
    控件.Perform(消息, 参数, 参数);

    消息和消息参数:

    消息就是一个整数, 就是微软给做的一个编号:
    0 .. WM_USER-1: Windows 使用
    WM_USER .. $7FFF: 窗体类使用
    $8000 .. $BFFF: 保留
    $C000 .. $FFFF: 应用程序使用
    大于 $FFFF: 保留

    Delphi 也自定义了一些消息, 分别是 CM_ 和 CN_ 打头.

    消息参数是个比较复杂的概念, 因为不同的消息有不同的参数规定, 其实学习消息的过程就是学习消息参数.
    不过有些消息的参数就特简单, 譬如 WM_CLOSE 是关闭窗口的消息, 它不需要什么参数(不需要也要按格式写个数).

    下面的例子使用四种不同的方法来关闭窗口:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Close;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      SendMessage(Self.Handle, WM_CLOSE, 0, 0);
    end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      PostMessage(Self.Handle, WM_CLOSE, 0, 0);
    end;
    
    procedure TForm1.Button4Click(Sender: TObject);
    begin
      Self.Perform(WM_CLOSE, 0, 0);
    end;
    
    end.
    
  • 相关阅读:
    Chrome开发者工具中Elements(元素)断点的用途
    最简单的SAP云平台开发教程
    Java实现 LeetCode 495 提莫攻击
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 492 构造矩形
  • 原文地址:https://www.cnblogs.com/del/p/1318897.html
Copyright © 2011-2022 走看看