代码之家  ›  专栏  ›  技术社区  ›  IceCold

由于TStyleManager,消息丢失。尝试设置样式

  •  0
  • IceCold  · 技术社区  · 10 月前

    我创建了一个替代品 TApplication 对象。

    除了其他功能(内存和GUI日志记录、将GUI状态保存到磁盘、单例实例、与用户/应用程序路径相关的实用程序等)外,它还实现了一个GUI可以通过发布的窗口消息正确初始化的地方(不再滥用OnFormCreate!),该消息使用 PostMessage(MForm.Handle, MSG_LateFormInit) 应用程序发送到主窗体。

    然而,我发现了一个问题:如果我打电话 TrySetStyle() 在我使主窗体可见之前,我的消息丢失了。

    我认为这是因为 尝试设置样式() 在内部重新创建表单,这可能会影响消息传递循环( MSG_LateFormInit 消息丢失或未按预期发送?)。

    DPR看起来像这样:

    program Stuff;  
    begin
      AppData:= TAppData.Create('My App Name');
      AppData.CreateMainForm(TMainForm, MainForm, False {Not visible});  // This calls PostMessage
    
      // Warning:
      // Don't call TrySetStyle until the main form is visible. 
      // Solution: Make the main form visible before you call TrySetStyle!
      TStyleManager.TrySetStyle('Amakrits');
    
      Application.Run;
    end.
    

    困惑 :

    1. 我不想在之后移动POST代码 尝试设置样式() 。我不想强迫用户在他的主窗体/DPR中调用超过必要的代码,因为很容易忘记这样做。到目前为止,所有的代码都是自包含的(好吧……窗体中有一个方法可以拦截 MSG_LateFormInit 消息,但这是可选的)。所有的更改都在DPR中完成。我想保持这样。

    2. 另一方面,我确实想打电话 尝试设置样式() 而形状仍然不可见以防止闪烁。

    PS:我不知道用户是否会打电话 尝试设置样式() 或者不。这对他来说是可选的。

    因此,我需要找到一种可靠的方法来POST和接收 MSG_LateFormInit 信号,最好是在主形式仍然不可见时。

    1 回复  |  直到 10 月前
        1
  •  1
  •   Remy Lebeau    10 月前

    一种选择是 邮递 给您的留言 TAppData 的隐藏窗口,所需的Form对象位于消息的 lparam 字段,然后给出 TAppData 消息处理程序 发送 你的 MSG_LateFormInit 如果消息仍处于活动状态,则将消息发送到消息的指定表单。

    这样,您就不会再受到表单的HWND在发布帖子和发送消息之间变化的影响。