zoukankan      html  css  js  c++  java
  • 终于懂了:Delphi重定义消息结构随心所欲,只需要前4个字节是消息编号就行了(有了这个,就有了主动)

    Delphi重定义消息结构随心所欲,只需要前4个字节是消息编号就行了,跟Windows消息虽然尽量保持一致,但其实相互没有特别大的关系。有了这个,就有了主动,带不带句柄完全看需要。

    比如这个结构就带句柄(放到了第二个参数):

      TWMContextMenu = packed record
        Msg: Cardinal;
        hWnd: HWND;
        case Integer of
          0: (
            XPos: Smallint;
            YPos: Smallint);
          1: (
            Pos: TSmallPoint;
            Result: Longint);
      end;

    这个也带,因为确实需要:

      TWMDropFiles = packed record
        Msg: Cardinal;
        Drop: THANDLE;
        Unused: Longint;
        Result: Longint;
      end;

    这里甚至带了2个句柄:

      TWMSizeClipboard = packed record
        Msg: Cardinal;
        Viewer: HWND;
        RC: THandle;
        Result: Longint;
      end;

     而大多数消息都是不带句柄的:

      TWMSize = packed record
        Msg: Cardinal;
        SizeType: Longint; { SIZE_MAXIMIZED, SIZE_MINIMIZED, SIZE_RESTORED,
                             SIZE_MAXHIDE, SIZE_MAXSHOW }
        Width: Word;
        Height: Word;
        Result: Longint;
      end;
    
      TWMTimer = packed record
        Msg: Cardinal;
        TimerID: Longint;
        TimerProc: TFarProc;
        Result: Longint;
      end;

    但是看了一遍Messages.pas定义的消息结构,几乎全都是16字节大小,没有找到例外,这是为什么呢?

    甚至即使明明不使用那么多空间,还要加一个Unused:

      TWMSystemError = packed record
        Msg: Cardinal;
        ErrSpec: Word;
        Unused: Longint;
        Result: Longint;
      end;

    最后,忽然想起来,Delphi消息结构这个的Result的作用,很像QT里中止信号的Q_UNUSED,例如 :

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
               QWidget *widget)
    {
        Q_UNUSED(option);
        Q_UNUSED(widget);
        // ...
    }
  • 相关阅读:
    JVM视角:值传递or引用传递?【转】
    mybaits trim用法
    Collections.shuffle()用法
    api缓存
    接口开发
    Integer.parseInt()和这个Integer.valueOf()的详解【转】
    MyBatis 通过包含的jdbcType类型
    idea 相关设置
    idea快捷键
    equals 与 ==
  • 原文地址:https://www.cnblogs.com/findumars/p/5183647.html
Copyright © 2011-2022 走看看