• 学习 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 是关闭窗口的消息, 它不需要什么参数(不需要也要按格式写个数).



    下面的例子使用四种不同的方法来关闭窗口:

    1


    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.
    
    摘自万一的 Delphi 博客
     
    本例源代码下载: http://www.rayfile.com/files/46d3c657-17e9-11df-8205-0015c55db73d/
  • 相关阅读:
    浅谈SQLite——查询处理及优化
    .NET 并行(多核)编程系列之七 共享数据问题和解决概述
    sql 存储过程学习一
    SQL中获得EXEC后面的sql语句或者存储过程的返回值的方法 【收藏】
    script刷新页面,刷新代码
    C#编程中关于数据缓存的经验总结
    SQL存储过程的概念,优点及语法
    SQLite数据库安装、试用及编程测试手记
    c# sqlite 数据库加密
    进销存管理系统的设计与实现
  • 原文地址:https://www.cnblogs.com/hackpig/p/1667980.html
Copyright © 2020-2023  润新知