• 点击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消息产生。还有中间风格的变化,没有分析。

  • 相关阅读:
    在Myeclipse中移除项目对Hibernate的支持
    使用MyEclipse可视化开发Hibernate实例
    利用MyEclipse自动创建PO类、hbm文件(映射文件)、DAO
    Mtk Camera
    Linux问题,磁盘分区打不开了
    Android SDK在线更新镜像服务器大全
    TeamTalk——ubuntu服务端部署
    Nginx
    VCC/AVCC/VDD/AVDD区别
    android studio and sdk mirror for China
  • 原文地址:https://www.cnblogs.com/findumars/p/4127611.html
Copyright © 2020-2023  润新知