delphi的消息处理的相关函数

delphi的消息处理的相关函数

TWinControl.MainWndProc

TControl.WndProc

TObject.Dispatch

TObject.DefaultHandler

TWinControl.MainWndProc

procedure TWinControl.MainWndProc(var Message: TMessage);

begin

  try

    try

      WindowProc(Message);

    finally

      FreeDeviceContexts;

      FreeMemoryContexts;

    end;

  except

    Application.HandleException(Self);

  end;

end;

 

property WindowProc: TWndMethod read FWindowProc write FWindowProc;

 

TWndMethod = procedure(var Message: TMessage) of object;

TControl.WndProc

procedure WndProc(var Message: TMessage); virtual;

procedure TControl.WndProc(var Message: TMessage);

var

  Form: TCustomForm;

begin

  if (csDesigning in ComponentState) then

  begin

    Form := GetParentForm(Self);

    if (Form <> nil) and (Form.Designer <> nil) and

      Form.Designer.IsDesignMsg(Self, Message) then Exit;

  end

  else if (Message.Msg >= WM_KEYFIRST) and (Message.Msg <= WM_KEYLAST) then

  begin

    Form := GetParentForm(Self);

    if (Form <> nil) and Form.WantChildKey(Self, Message) then Exit;

  end

  else if (Message.Msg >= WM_MOUSEFIRST) and (Message.Msg <= WM_MOUSELAST) then

  begin

    if not (csDoubleClicks in ControlStyle) then

      case Message.Msg of

        WM_LBUTTONDBLCLK, WM_RBUTTONDBLCLK, WM_MBUTTONDBLCLK:

          Dec(Message.Msg, WM_LBUTTONDBLCLK - WM_LBUTTONDOWN);

      end;

    case Message.Msg of

      WM_MOUSEMOVE: Application.HintMouseMessage(Self, Message);

      WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:

        begin

          if FDragMode = dmAutomatic then

          begin

            BeginAutoDrag;

            Exit;

          end;

          Include(FControlState, csLButtonDown);

        end;

      WM_LBUTTONUP:

        Exclude(FControlState, csLButtonDown);

    end;

  end

  else if Message.Msg = CM_VISIBLECHANGED then

    with Message do

      SendDockNotification(Msg, WParam, LParam);

  Dispatch(Message);

end;

TObject.Dispatch

procedure TObject.Dispatch(var Message);

asm

        PUSH    EBX

        MOV     BX,[EDX]

        OR      BX,BX

        JE      @@default

        CMP     BX,0C000H

        JAE     @@default

        PUSH    EAX

        MOV     EAX,[EAX]

        CALL    GetDynaMethod

        POP     EAX

        JE      @@default

        MOV     ECX,EBX

        POP     EBX

        JMP     ECX

 

@@default:

        POP     EBX

        MOV     ECX,[EAX]

        JMP     dword ptr [ECX].vmtDefaultHandler

end;

TObject.DefaultHandler

procedure DefaultHandler(var Message); virtual;

procedure TObject.DefaultHandler(var Message);

begin

end;

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值