zoukankan      html  css  js  c++  java
  • 学习 Message(9): 消息结构纵览

    传递消息就是传递消息数据, 数据是一组数据, 所以消息是一个结构;
    系统标准的消息结构在 Delphi 中被定义为 TMsg
    PMsg = ^TMsg;
    tagMSG = packed record
      hwnd: HWND;
      message: UINT;
      wParam: WPARAM;
      lParam: LPARAM;
      time: DWORD;
      pt: TPoint;
    end;
    TMsg = tagMSG;
    MSG = tagMSG;
    

    但 TMsg 和 VCL 中的更多消息结构如: TWMMouse、TWMKey 并不兼容;
    但 TWMMouse、TWMKey 等都可以兼容: TMessage;
    TMessage 是 VCL 重新定义的消息结构:
    PMessage = ^TMessage;
    TMessage = packed record
      Msg: Cardinal;
      case Integer of
        0: (
          WParam: WPARAM;
          LParam: LPARAM;
          Result: LRESULT);
        1: (
          WParamLo: Word;
          WParamHi: Word;
          LParamLo: Word;
          LParamHi: Word;
          ResultLo: Word;
          ResultHi: Word);
    end;
    

    有多少必要让 Delphi 不直接使用 TMsg 而非要有个 TMessage 呢?
    我现在所能知道的: 1、简化; 2、增加返回值; 肯定还有其他理由, 望先者告诉我.
    但我想不管怎样, VCL 最终肯定要回归 TMsg 的结构格式, 才能与系统打交道.

    因为面对不同的消息, 消息参数的意义会完全不同;
    在不同的消息里面, 有些参数也毫无意义, 可以省略;
    另外, 有些消息参数非常抽象, 需要反复换算才得到我们容易理解的数据, 为什么不直接使用容易理解的数据呢?
    所以 Delphi 定义了更多的消息结构:
    TWMNoParams
    TWMCancelMode       = TWMNoParams;
    TWMChildActivate    = TWMNoParams;
    TWMClear            = TWMNoParams;
    TWMClose            = TWMNoParams;
    TWMCopy             = TWMNoParams;
    TWMCut              = TWMNoParams;
    TWMDestroy          = TWMNoParams;
    TWMDestroyClipboard = TWMNoParams;
    TWMDrawClipboard    = TWMNoParams;
    TWMFontChange       = TWMNoParams;
    TWMGetDlgCode       = TWMNoParams;
    TWMGetFont          = TWMNoParams;
    TWMGetHotKey        = TWMNoParams;
    TWMGetTextLength    = TWMNoParams;
    TWMMDIGetActive     = TWMNoParams;
    TWMMDIIconArrange   = TWMNoParams;
    TWMMDIRefreshMenu   = TWMNoParams;
    TWMNCDestroy        = TWMNoParams;
    TWMPaintIcon        = TWMNoParams;
    TWMPaste            = TWMNoParams;
    TWMQueryDragIcon    = TWMNoParams;
    TWMQueryNewPalette  = TWMNoParams;
    TWMQueryOpen        = TWMNoParams;
    TWMQueueSync        = TWMNoParams;
    TWMRenderAllFormats = TWMNoParams;
    TWMSysColorChange   = TWMNoParams;
    TWMTimeChange       = TWMNoParams;
    TWMQueryUIState     = TWMNoParams;
    TWMUndo             = TWMNoParams;
    TWMKey
    TWMChar       = TWMKey;
    TWMKeyDown    = TWMKey;
    TWMKeyUp      = TWMKey;
    TWMDeadChar   = TWMChar;
    TWMSysChar    = TWMKey;
    TWMSysKeyDown = TWMKey;
    TWMSysKeyUp   = TWMKey;
    TWMMouse
    TWMLButtonDblClk = TWMMouse;
    TWMLButtonDown   = TWMMouse;
    TWMLButtonUp     = TWMMouse;
    TWMMButtonDblClk = TWMMouse;
    TWMMButtonDown   = TWMMouse;
    TWMMButtonUp     = TWMMouse;
    TWMMouseMove     = TWMMouse;
    TWMRButtonDblClk = TWMMouse;
    TWMRButtonDown   = TWMMouse;
    TWMRButtonUp     = TWMMouse;
    TWMMouseWheel
    TMSHMouseWheel
    TWMWindowPosMsg
    TWMWindowPosChanged  = TWMWindowPosMsg;
    TWMWindowPosChanging = TWMWindowPosMsg;
    TWMScroll
    TWMHScroll = TWMScroll;
    TWMVScroll = TWMScroll;
    TWMActivate
    TWMActivateApp
    TWMAskCBFormatName
    TWMChangeCBChain
    TWMCharToItem
    TWMVKeyToItem = TWMCharToItem;
    TWMChooseFont_GetLogFont
    TWMCommand
    TWMCompacting
    TWMCompareItem
    TWMCopyData
    TWMCreate
    TWMCtlColor
    TWMCtlColorBtn       = TWMCtlColor;
    TWMCtlColorDlg       = TWMCtlColor;
    TWMCtlColorEdit      = TWMCtlColor;
    TWMCtlColorListbox   = TWMCtlColor;
    TWMCtlColorMsgbox    = TWMCtlColor;
    TWMCtlColorScrollbar = TWMCtlColor;
    TWMCtlColorStatic    = TWMCtlColor;
    TWMDDE_Ack
    TWMDDE_Advise
    TWMDDE_Data
    TWMDDE_Execute
    TWMDDE_Initiate
    TWMDDE_Poke
    TWMDDE_Request
    TWMDDE_Terminate
    TWMDDE_Unadvise
    TWMDeleteItem
    TWMDevModeChange
    TWMDrawItem
    TWMDropFiles
    TWMEnable
    TWMEndSession
    TWMEnterIdle
    TWMEnterMenuLoop
    TWMExitMenuLoop = TWMEnterMenuLoop;
    TWMEraseBkgnd
    TWMGetIcon
    TWMGetMinMaxInfo
    TWMGetText
    TWMHotKey
    TWMHScrollClipboard
    TWMIconEraseBkgnd = TWMEraseBkgnd;
    TWMInitDialog
    TWMInitMenu
    TWMInitMenuPopup
    TWMKillFocus
    TWMMDIActivate
    TWMMDICascade
    TWMMDICreate
    TWMMDIDestroy
    TWMMDIMaximize
    TWMMDINext
    TWMMDIRestore
    TWMMDISetMenu
    TWMMDITile
    TWMMeasureItem
    TWMMenuChar
    TWMMenuSelect
    TWMMouseActivate
    TWMMove
    TWMMoving
    TWMNCActivate
    TWMNCCalcSize
    TWMNCCreate
    TWMNCHitTest
    TWMNCHitMessage
    TWMNCLButtonDblClk = TWMNCHitMessage;
    TWMNCLButtonDown   = TWMNCHitMessage;
    TWMNCLButtonUp     = TWMNCHitMessage;
    TWMNCMButtonDblClk = TWMNCHitMessage;
    TWMNCMButtonDown   = TWMNCHitMessage;
    TWMNCMButtonUp     = TWMNCHitMessage;
    TWMNCMouseMove     = TWMNCHitMessage;
    TWMNCRButtonDblClk = TWMNCHitMessage;
    TWMNCRButtonDown   = TWMNCHitMessage;
    TWMNCRButtonUp     = TWMNCHitMessage;
    TWMNCPaint
    TWMNextDlgCtl
    TWMNotify
    TWMNotifyFormat
    TWMPaint
    TWMPaintClipboard
    TWMPaletteChanged
    TWMPaletteIsChanging
    TWMParentNotify
    TWMPower
    TWMQueryEndSession
    TWMQuit
    TWMRenderFormat
    TWMSetCursor
    TWMSetFocus
    TWMSetFont
    TWMSetHotKey
    TWMSetIcon
    TWMSetRedraw
    TWMSetText
    TWMShowWindow
    TWMSize
    TWMSizeClipboard
    TWMSpoolerStatus
    TWMStyleChange
    TWMStyleChanged  = TWMStyleChange;
    TWMStyleChanging = TWMStyleChange;
    TWMSysCommand
    TWMSysDeadChar
    TWMSystemError
    TWMTimer
    TWMUIState
    TWMChangeUIState = TWMUIState;
    TWMUpdateUIState = TWMUIState;
    TWMVScrollClipboard
    TWMWinIniChange
    TWMSettingChange
    TWMHelp
    TWMDisplayChange
    TWMContextMenu
    TWMPrint
    TWMPrintClient = TWMPrint;
    

    这样做的目的, 无非就是为了理解与简捷. 但为什么会有那么多重命名(说明它们的参数结构相同)呢?
    我想 Delphi 这样做可能是为了和消息一一对应吧, 譬如: WM_LButtonDown 消息对应 TWMLButtonDown 结构. 这样根据命名规则, 可以方便地通过消息名称方便地找到对应的消息结构.

    TMessage 在 VCL 中是通用的, 它可以代替其中任何一个.

    另外, 这会是 Windows 消息的全部吗?
    我想肯定不是, 就像 API 函数一样, 它们在不断地增加, 况且还有那么多的自定义消息, 这应该只是一些常用的, 也够多了.

  • 相关阅读:
    json和xml以及ajax的数据格式用法
    关于PHP数据库mysql的一些案例
    PHP的一些语句 if...else...elseif
    Python中的流程控制(if、while、for)
    Python获取当前系统时间
    Python中格式化输出的三种方式
    Python中如何修改文件
    Python的五大数据类型的作用、定义方式、使用方法
    了解Python
    ~
  • 原文地址:https://www.cnblogs.com/del/p/1322112.html
Copyright © 2011-2022 走看看