zoukankan      html  css  js  c++  java
  • Delphi中的消息处理

    1、windows的消息驱动体系 
      在windows系统中,消息传递是实现对象间通信和控制的主要手段。可以系统都以消息驱动的方式工作。系统中发生的用户输入操作、显示信息的改变、系统环境参数变化等所有事件都以系统定义消息的形式出现在相关的应用程序和窗口。所以程序设计的主要任务就是为这些消息的处理设计代码。 

      在应用程序中,发送者可以通过发送消息,要求接收者完成相应的处理。当程序运行时,windows系统为每个应用程序实例建立一个消息队列,依次保存发送给该程序实例的消息,在应用程序的主控部分,需要设置一个消息循环,利用一组系统函数从该程序实例的消息队列中依次读取和分析消息,并将他们发送给指定的消息。这种消息传递可以使用系统定义消息,也可以使用用户自定义的消息。现有的多种可视化开发环境,都已经将这一过程封装到了各种类,部件,以及部件的方法中。

      当我们利用它们写一个应用程序时,必须考虑每个对象要做什么,将他们分解为不同的消息处理函数,并且对应不同的消息。虽然有的控件(部件)种类繁多,编写程序非常便利。但这些毕竟是一些通用的对象和消息处理函数,如果我们要编写自己的部件或者想要更加灵活的运用现有控件,就必须深刻了解消息驱动体系以及消息的映射消息处理函数编写系统有关消息操作的函数。 
    2、DELPHI开发环境: 
      DELPHI已成为日益普及的优秀的32位WINDOWS开发环境,其中一个最大的特点就是在DELPHI 中可自定义消息写自己的构件(Cmponent)的,因为编写构件一般要对相应的消息进行处理.。 
    3、DELPHI中的消息: 
      在Delphi 中所有的类都有一个内建的用于处理消息、调用消息处理过程的机制。VCL定义了发送所有WINDOWS消息(包括自定义消息)的消息派送系统,你只需要建立消息处理方法。一个Windows 消息是一个包含多个字段的数据记录。其中最重要的是消息标识,在WINDOWS中已经定义了许多消息,其他有用的字段是两个参数和一个结果字段。一个16位和一个32位参数wparan录数据类型:

    type 
    TMessage = packed record 
    Msg: Cardinal; 
    case Integer of 
    0: ( 
    WParam: Longint; 
    LParam: Longint; 
    Result: Longint); 
    1: ( 
    WParamLo: Word; 
    WParamHi: Word; 
    LParamLo: Word; 
    LParamHi: Word; 
    esultLo: Word; 
    ResultHi: Word); 
    end;

    4、消息的使用: 

      在DELPHI 中用户可以自定义消息及消息处理句柄消息处理句柄的定义有如下几个原则:


      1、消息处理句柄方法必须是一个过程 
      2、方法声明后要有一个message命令型常数. 
      3、消息处理句柄方法不需要用override 命令来显式指明重载祖先的一个消息处理句柄 
      4、在消息处理句柄中一般先是用户自己对消息的处理,用祖先类中对应此消息的处理句柄(有些情况下可能正相反).由于可能对祖先类中对此消息的处理句柄的名字和参数类型不清楚避免,此麻烦调用Defaulthandler方法.(当然如果要屏蔽掉此消息了)。

    消息处理句柄方法声明为:

    procedure Mymsgmethod(var message:Tmessage); message Msgtype;

    同样用户也可以定义自己的消息自定义消息及消息处理句柄举例如下:

    const my_paint=Wm_user 1; 
    type 
    Tmypaint=record 
    msgid:cardinal; 
    msize:word; 
    mcolor:longint; 
    msgresult:longint; 
    end; //也可以使用Tmessage类型 
    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;

      重载消息句柄方法:你可以直接重载windows定义的窗口消息添加自己的处理。例如在应用中重载windows的窗口消息wm_paint:

    type 
    TMyComponent = class(...) 
    ... 
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT; 
    end;

      然后再实现部分添加消息句柄的过程。 

    5、delphi中有关消息的重要函数和属性:


    (1) procedure DefaultHandler(var Message); virtual; 
    如果一个对象处理某个消息,则该函数提供对消息的默认处理。 
    (2) procedure Dispatch(var Message); virtual; 
    这个函数用于调用对象的消息处理函数。 
    (3)Windowproc属性: 
    type TWndMethod = procedure(var Message: TMessage) of object; 
    property WindowProc: TWndMethod;


      这个属性用于指定一个函数,用这个函数来响应message参数指定的windows消息。例如:


    procedure TMyListBoxDescendant.ToggleSubClass(On: Boolean); 
    begin 
    if On then 
    WindowProc := SubClassWndProc; 
    else 
    WindowProc := WndProc; 
    end;


    (4)function Perform(Msg: Cardinal; WParam这个函数用来向控件自己发一个消息。 
    例如:


    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
    with RichEdit1 do 
    Begin 
    SelStart := StrToInt(MaskEdit1.Text); 
    RichEdit1.Perform(EM_SCROLLCARET 
    end; 
    end;


    (5)procedure Broadcast(var Message);这个函数用于向所有的子控件广播一个消息。 
    (6)procedure DefaultHandler(var Message); virtual;该函数提供了队所有消息的默认处理,可以重载这个虚拟函数。Message参数是无类型的,但可以强制转换成Tmessage类型。

    6、windows API中有关消息的几个重要函数:


    (1)GetMessage函数: 
    BOOL GetMessage(LPMSG lpMsg HWND hWnd 
    UINT wMsgFilterMin UINT wMsgFilterMax// 最后的消息); 
    delphi中的定义: 
    function GetMessageA(var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin 
    这个函数可以有选择的从消息队列重得到消息。 
    (2)TranslateMessage函数: 
    BOOL TranslateMessage(CONST MSG *lpMsg // 消息的地址); 
    delphi中的定义: 
    function TranslateMessage(const lpMsg: TMsg): BOOL; stdcall; 
    这个函数用于将virtul-key消息翻译为字符消息。 
    (3)DispatchMessage函数: 
    LONG DispatchMessage(CONST MSG *lpmsg // 消息的指针); 
    delphi中的定义: 
    function DispatchMessage(const lpMsg: TMsg): Longint; stdcall; 
    这个函数派送消息到窗口过程。 
    (4)PostMessage函数: 
    BOOL PostMessage(HWND hWnd UINT Msg WPARAM wParam 
    LPARAM lParam // 第二个消息参数); 
    delphi中的定义: 
    function PostMessageA(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;这个函数用于将消息传送到窗口的消息队列。

    转自:http://www.cnblogs.com/railgunman/articles/1790078.html

  • 相关阅读:
    tinyxml优化之一
    vs下C++内存泄露检测
    Cocos2d-x项目移植到WP8系列之九:使用自定义shader
    [leetcode 双周赛 11] 1228 等差数列中缺失的数字
    [leetcode 周赛 158] 1224 最大相等频率
    [leetcode 周赛 158] 1223 掷骰子模拟
    [leetcode 周赛 158] 1222 可以攻击国王的皇后
    [leetcode 周赛 158] 1221 分割平衡字符串
    [leetcode 周赛 157] 1220 统计元音字母序列的数目
    [leetcode 周赛 157] 1219 黄金矿工
  • 原文地址:https://www.cnblogs.com/760044827qq/p/4855139.html
Copyright © 2011-2022 走看看