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;

  • 相关阅读:
    Idea 找不到tomcat server 服务器选项
    idea永久使用
    Jax
    我的2014
    Mysql锁机制
    mysql 查询效率提升
    Java 静态工厂方法
    java 面试题(转)
    Java Semaphore
    Java CyclicBarrier
  • 原文地址:https://www.cnblogs.com/findumars/p/4767127.html
Copyright © 2011-2022 走看看