zoukankan      html  css  js  c++  java
  • delphi消息结构

    消息描述 

    Tmsg是   Windows系统用来记录描述一个具体的windows消息的。就是windows   用于封装应用程序及系统程序发生的消息,它是操作系统使用的。  

     Tmessage   则封装了TMsg的参数,是应用程序响应的消息。该消息记载了消息的编号,最重要的就是它携带的两个参数。一般接收对象要定义处理句柄,然后对收到的消息进行处理。如果不定义处理句柄,就交给祖先类去处理。我们在应用程序中使用的是TMessage   消息,而不是TMsg消息。

     

    消息结构

     Windows消息结构---Tmsg:

    typedef struct tagMSG {     

                HWND  hwnd;   

                UINT  message;

                WPARAM wParam;

                LPARAM lParam;

                DWORD  time;

                POINT  pt;

    } MSG;

     

    delphi消息结构---Tmesssage:

    TMessage   =   packed   record  

              Msg:   Cardinal;  

              case   Integer   of  

                  0:   (  

                      WParam:   Longint;  

                      LParam:   Longint;  

                      Result:   Longint);  

                  1:   (  

                      WParamLo:   Word;  

                      WParamHi:   Word;  

                      LParamLo:   Word;  

                      LParamHi:   Word;  

                      ResultLo:   Word;  

                      ResultHi:   Word);  

          end;  

    其中Integer是个判断变量条件,0和1只是为了给变体字段分组,0部分的三个字段和1部分的六个字段共享一段内存。这段内存大小是12个字节,你要么用WParam, LParam...来访问,要么用WparamLo,WParamHi来访问。用不到0和1这两个值的,他们仅仅为可读性而存在。  

      也可以用:  

      case   Boolean   of  

      False:(...);  

      True:(...);  

    我们知道一个32位整数在内存中是高字节在后,低字节在前,因此,WParamLo被对应到WParam的低16位,WParamHi被对应到WParam的高16位。依次类推。

     

     

    实例:

      当程序运行到   sendmessage(Form1.handle,WM_User+100,0,0)时,  

      操作系统就把这个消息进行描述,填入TMsg的一个结构中,大概是这样:  

          AMsg:TMsg;  

          AMsg.handle:=Form1.handle    

          AMsg.message:=WM_User+100  

          AMsg.WParam:=0  

          Amsg.lparam:=0;  

          Amsg.time:=Getsystemtime();  

          Amsg.pt:=mouse.CursorPos;  

      然后再把这个消息重新封装,提取它里面的参数,发送给Form1.handle   所在的消息队列,有  

      form1.handle   所在的wndproc过程进行处理。  

       形式如下:  

            msg:Tmessage;  

            Msg.msg:=Amsg.Message(   WM_User+100)      

            Msg.lparam:=Amsg.lparam  

            msg.wparam;=Amsg.wparam  

        然后 put Msg  to Form1 消息队列 ,由form1的窗体过程处理。

     

    Delphi用户定义消息:

    Delphi中用户定义的消息大小必须是128bit,也就是16字节。

    Delphi在接受到Tmesssage后,会自动把该消息转换成用户定义的消息结构

    实例:

    procedure CMSocketMessage(var Message: TCMSocketMessage); message CM_SOCKETMESSAGE;

    CM_SOCKETMESSAGE消息触发CMSocketMessage函数,

    CM_SOCKETMESSAGE消息是Tmesssage结构。

    TCMSocketMessage是用户自定义消息机构,结构如下:

      TCMSocketMessage = record

        Msg: Cardinal;

        Socket: TSocket;

        SelectEvent: Word;

        SelectError: Word;

        Result: Longint;

      end;

     

    delphi自动进行如下转换

    TCMSocketMessage .Msg=Tmessage.Msg

    TCMSocketMessage.Socket=Tmessage.WParam

    TCMSocketMessage.SelectEvent=地位字段(Tmessage.Lparam);

    TCMSocketMessage.SelectError=高位字段(Tmessage.Lparam);

    TCMSocketMessage.Result =Tmessage.Result

  • 相关阅读:
    6.11 考试修改+总结
    6.10 考试修改+总结+颓废记
    我们都一样
    【HDU 5730】Shell Necklace
    【SPOJ 8093】Sevenk Love Oimaster
    【BZOJ 3238】【AHOI 2013】差异
    【UOJ #131】【NOI 2015】品酒大会
    【SPOJ 220】Relevant Phrases of Annihilation
    【POJ 3177】Redundant Paths
    【POJ 2186】Popular Cows
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254613.html
Copyright © 2011-2022 走看看