zoukankan      html  css  js  c++  java
  • Caption,Text,WindowText的区别——TControl也有FText,是为了模拟一个窗口

    TControl = class(TComponent) // 控件的Windows功能从TControl开始

    property Caption: TCaption read GetText write SetText stored IsCaptionStored;
    property Text: TCaption read GetText write SetText; // 和Caption是一回事,别名而已
    property WindowText: PChar read FText write FText; // Windows窗口的真正标题

    destructor TControl.Destroy;
    begin
    StrDispose(FText);
    inherited Destroy;
    end;

    procedure TControl.DefaultHandler(var Message);
    var
    P: PChar;
    begin
    // 很好的帖子:http://blog.163.com/as_liaokun/blog/static/6492896120092514029260
    // 问题:为什么要处理这个几个看似不重要的消息呢?原因是:Windows 系统中每个窗口都有一个 WindowText 属性,
    // 而VCL 的 TControl 为了模拟成窗口也存储了一份保存在 FText 成员中,所以 TControl 在此接管这几个消息。
    // TControl.DefaultHandler 并没有调用 inherited,其实也没有必要调用,因为 TControl 的祖先类都没有实现 DefaultHandler函数。
    // 可以认为 DefaultHandler 的执行到此为止。VCL 的消息流程至此为止。

    // 针对图形控件的消息处理:
    // 处理三个文字消息,反正所有的TControl都有的
    // 问题:不过为什么不放在WndProc里面呢。影响效率?取得文字还用的挺多的呢。因为这样更容易截断它,否则放在WndProc第一时间就处理,就难以截断消息了
    // 问题:自己给图形按钮发消息执行一遍,写个Blog:
    with TMessage(Message) do
    case Msg of
    WM_GETTEXT: // 取得文字
    begin
    if FText <> nil then P := FText else P := '';
    Result := StrLen(StrLCopy(PChar(LParam), P, WParam - 1));
    end;
    WM_GETTEXTLENGTH: // 取得文字长度
    if FText = nil then Result := 0 else Result := StrLen(FText);
    WM_SETTEXT: // 设置文字,如果把这段去掉,所有按钮、标签都没有文字了
    begin
    P := StrNew(PChar(LParam));
    StrDispose(FText);
    FText := P; // 这里设置Caption
    SendDockNotification(Msg, WParam, LParam); // 类函数
    end;
    end;
    // important 不再继续传递消息了。但是它的子类,都应该调用父类的DefaultHandler函数,以求全面处理,或者避免重复处理。
    // 但是这个函数本来就是第三优先级(最低)的消息处理函数,不能奢求太多。
    // 问题:最后的消息流向去哪里?回答:Win控件的消息处理,到它自己的DefaultHandler就结束了,因为认识的消息已经处理过了,不认识的消息也一定调用了DefWinProc让系统来处理,并到此结束。
    // 图形控件的消息处理是Delphi自己的事情,所以可以很随意,但一般到此也就结束了。当然,这是TObject具有的函数,图形控件还可以覆盖这个函数进行处理呢。
    end;

    --------------------------------------------------------------------------

    Caption属性的来龙去脉:

        property Caption: TCaption read GetText write SetText stored IsCaptionStored;
    
    function TControl.GetText: TCaption;
    var
      Len: Integer;
    begin
      Len := GetTextLen;
      SetString(Result, PChar(nil), Len); // RTL函数
      if Len <> 0 then GetTextBuf(Pointer(Result), Len + 1); // 类函数
    end;
    
    procedure TControl.SetText(const Value: TCaption);
    begin
      if GetText <> Value then // 类函数
        SetTextBuf(PChar(Value)); // 类函数
    end;
    
    procedure TControl.SetTextBuf(Buffer: PChar);
    begin
      // important 无论是否Win控件,都会执行到这里,才能取得标题文字
      Perform(WM_SETTEXT, 0, Longint(Buffer)); // 先发消息设置Caption fixme 是不是所有子类都是这样发消息设置Text的?
      Perform(CM_TEXTCHANGED, 0, 0);           // 就这一处应用。设置完了,还要通知一下,TEdit,TLabel和TGroupBox都有相应的消息处理函数
    end;
    

     写一个Label1.Caption:='Hello World';的分析过程~

  • 相关阅读:
    PHP openssl_encrypt函数安全漏洞
    WordPress Organizer插件安全漏洞
    WordPress Poll插件多个SQL注入和安全绕过漏洞
    Redis 重写任意文件漏洞
    WordPress Events Manager插件多个跨站脚本漏洞
    项目建议书编写总结
    www.beihua.edu.cn计划摘录
    《易经》对中华文化的影响
    网站调研资料记录
    积分和排名
  • 原文地址:https://www.cnblogs.com/findumars/p/4751800.html
Copyright © 2011-2022 走看看