zoukankan      html  css  js  c++  java
  • 点击Button后,执行MouseDown的过程(使用Call Stack观察很清楚)

    Form1上放两个按钮Button1和Button2,默认输入焦点是Button1,现在点击Button2,产生WM_LBUTTONDOWN消息

    procedure TForm1.Button2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
    tag := 2000;
    end;
    

    其实这个过程使用Call Stack观察的很清楚,这里就是做学习笔记,并细化一下:
    TButtonControl.WndProc(var Message: TMessage);
    -->调用Windows.SetFocus(Handle);设置键盘输入焦点
    -->inherite;
    TWinControl.WndProc(var Message: TMessage);
    -->调用IsControlMouseMsg(TWMMouse(Message)),发现Button2没有图形子控件响应
    -->inherite;
    TControl.WndProc(var Message: TMessage);
    -->处理鼠标单击消息,但只处理拖动模式。
    -->然后一定加上csLButtonDown状态
    -->Dispatch
    TControl.WMLButtonDown
    -->调用TControl.SendCancelMode(Sender: TControl); 最后发送CM_CANCELMODE
    -->调用inherite,相当于调用TWinControl.DefaultHandler,因为没有TButton.DefaultHandler
    -->调用CallWindowProc(FDefWndProc, FHandle, Msg, WParam, LParam);,这步是关键
    -->调用DoMouseDown
    TControl.DoMouseDown
    -->调用MouseDown
    TControl.MouseDown
    -->调用FOnMouseDown(Self, Button, Shift, X, Y);

    点击一下鼠标,同时还有WM_LBUTTONUP和WM_COMMAND消息产生。还有中间风格的变化,没有分析。

  • 相关阅读:
    滤镜
    android 判断网络是否断开
    U5
    android 界面跳转
    光影魔术手 图片压缩
    服务器绑定 独立ip
    Java 开源 SOCKET 框架
    spring aop ehcache
    呼叫中心
    华丽字体
  • 原文地址:https://www.cnblogs.com/findumars/p/4127611.html
Copyright © 2011-2022 走看看