zoukankan      html  css  js  c++  java
  • delphi 自定义消息

    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
  • 相关阅读:
    ActiveMQ_Linux安装(一)
    Jenkins_多项目构建(二):使用Maven聚集关系
    Shell命令_for
    C# 读取Excel
    [ORACLE错误]ORA-00001: unique constraint (...) violated并不一定是数据冲突
    [ORACLE错误]ORA-00054:resource busy and acquire with nowait specified解决方法
    [ORACLE错误]oracle 不能更新 PL/SQL 点击“edit data”报“ these query results are not updateable”
    只有 DBA 才能导入由其他 DBA 导出的文件
    Windows系统安装Oracle 11g客户端
    Windows系统安装Oracle 11g数据库
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/3291316.html
Copyright © 2011-2022 走看看