zoukankan      html  css  js  c++  java
  • 有趣的TWinControl.RecreateWnd,并分析在哪些场合使用

    CM_RECREATEWND = CM_BASE + 51; // TWinControl里有对应函数
    procedure CMRecreateWnd(var Message: TMessage); message CM_RECREATEWND; // important 毁掉后,重新创建,并加上焦点
    procedure RecreateWnd; // 非虚函数,发消息CM_RECREATEWND 重新创建组件 fixme 为什么不把销毁工作写在这里,非要另外另起一个消息响应函数呢。原因一方面是可以附加参数,另一方面发消息调用更灵活,VMT表更小


    procedure TWinControl.RecreateWnd;
    begin
    if FHandle <> 0 then Perform(CM_RECREATEWND, 0, 0);
    end;

    procedure TWinControl.CMRecreateWnd(var Message: TMessage);
    var
    WasFocused: Boolean;
    begin
    WasFocused := Focused; // 类函数,调用API检测
    DestroyHandle; // 调用入口函数 fixme 句柄值被变掉了怎么办
    UpdateControlState; // 检查一下,然后在显示的过程中再次创建
    if WasFocused and (FHandle <> 0) then Windows.SetFocus(FHandle); // API
    end;

    procedure TWinControl.CMBiDiModeChanged(var Message: TMessage);
    begin
    inherited;
    if (SysLocale.MiddleEast) and (Message.wParam = 0) then
    RecreateWnd;
    NotifyControls(CM_PARENTBIDIMODECHANGED);
    end;

  • 相关阅读:
    如何处理消息堆积
    如何避免消息的重复发送
    内存泄漏和内存溢出的关系
    数据挖掘
    servlet
    数据驱动安全需三大核心新技术
    JS 入门经典 第三章 判断、循环和函数
    JS 高级程序设计 第三章
    JS入门经典
    JS高级程序设计1-2章
  • 原文地址:https://www.cnblogs.com/findumars/p/4767127.html
Copyright © 2011-2022 走看看