Application
是什么?
- 它从何而来?
- 为什么存在?
- 最重要的是:为什么所有表单都将其作为其父窗口句柄?
Delphi帮助说:
TApplication.Handle
提供对窗口句柄的访问 的主要形式(窗口) 应用。
Application
描述
调用Windows API时使用Handle 需要父窗口的功能 处理。 例如,一个DLL 显示其自己的顶级弹出窗口 Windows需要一个父窗口来 在其窗口中显示其窗口 应用。 使用Handle属性 使此类窗户成为 应用程序,以便它们 最小化,还原,启用和 与应用程序禁用。
如果我专注于“应用程序主要形式的窗口句柄”一词,而我将其表示为应用程序主要形式的窗口句柄,那么我可以进行比较:
- “应用程序主要形式的窗口句柄”,其中
Application.OnActivate
的Application
的窗把手
但是它们不一样:
Application.MainForm.Handle: 11473728
Application.Handle: 11079574
那么Application
是什么?
- 它从何而来?
- 它是什么Windows®窗口句柄?
- 如果它是
Application
和Application.OnActivate
的Windows®窗口句柄,那么为什么不匹配? - 如果不是
Application
的Application.OnActivate
的窗把手,那是什么? - 更重要的是:为什么它是每种形式的最终父母?
- 最重要的是:如果我尝试让表单成为非父代无主(为什么它可以出现在TaskBar上),或者尝试使用诸如ProgressDialog之类的东西,为什么一切都会变得一团糟?
我真正要问的是:使Application.Handle存在的设计原理是什么? 如果我能理解原因,那么应该变得显而易见。
通过二十个问题的游戏来更新理解:
在谈到通过使窗口的所有者Application
使窗口出现在任务栏上的解决方案时,彼得·比尔在2000年说:
这可能会导致以下形式的模态形式出现问题: 次要形式。
如果用户在进行模态操作时离开了应用程序 形式,然后回到显示它的形式,模态形式可能 隐藏在表格下方。 通过确保可以解决此问题 情态形式是父母的[原文; 他的意思是拥有]显示它的形式(使用
Application
以上)但这对于标准来说是不可能的
Application
单元中的对话框和例外,需要付出更多努力才能 让他们正常工作(基本处理Application.OnActivate
, 通过GetLastActivePopup
寻找应用程序的父代形式形式 并通过SetWindowPos
将它们带到Z顺序的顶部)。
- 为什么模态形式最终会滞后于其他形式?
- 哪种机制通常将模式形式带到前端,为什么它在这里不起作用?
- Windows®负责显示堆叠的窗口。 Windows®没有显示正确的窗口是怎么回事?
他还谈到了通过添加Application
扩展样式来使用新的Windows扩展样式,该样式强制将窗口显示在任务栏上(当使常规窗口不拥有它时,是不切实际的或不受欢迎的)。
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams( params );
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
但随后他告诫:
如果您在另一个应用程序处于运行状态时单击辅助表单任务栏按钮 激活后,仍将所有申请表置于最前面。 如果你 不想有选择
表单所有者仍为Application
时,谁将所有表单都放在最前面。应用程序是否在这样做? 为什么这样做呢? 与其这样做,不应该不这样做吗? 不这样做的不利之处是什么? 我看到这样做的缺点(系统菜单无法正常工作,任务栏按钮缩略图不正确,Windows®Shell无法最小化窗口。
在另一篇有关Application
的文章中,Mike Edenfield说父窗口发送了其他窗口的最小化,最大化和还原消息:
这将为您的表单添加任务栏按钮,但是还有一些其他次要细节 处理。 最明显的是,您的表单仍然收到发送给父级的最小化/最大化 表格(应用程序的主要形式)。 为了避免这种情况,您可以安装一条消息 WM_SYSCOMMAND的处理程序,方法是添加以下行:
Application
请注意,此处理程序采用您希望独立于其他应用程序行为的PARENT形式,以避免传递最小化消息。 您可以为SC_MAXIMIZE,SC_RESTORE等添加类似的>代码。
如何最小化/最大化/还原Windows®窗口的消息不会进入我的窗口? 这是因为Windows®将发给窗口的消息发送给了窗口的所有者吗? 在这种情况下,Delphi应用程序中的所有表单都归Application
所有吗? 这是否不意味着使所有者为空:
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := 0; //NULL
end;
会删除Application
及其窗口句柄,以免干扰我的表单,而Windows应该再次向我发送我的最小化/最大化/还原消息?
也许如果我们现在比较和对比一个“正常的” Windows应用程序做事,以及Borland最初设计Delphi应用程序做事的方式-关于这个Application
对象及其主循环。
Application
对象解决了什么解决方案?- 后来的Delphi版本进行了哪些更改,以使这些相同的问题不存在?
- 后来的Delphi版本中的更改是否没有引入其他问题,以至于最初的应用程序设计很难解决?
- 在应用程序不干扰它们的情况下,这些较新的应用程序仍将如何运行?
显然,Borland意识到了他们最初设计中的缺陷。 他们最初的设计是什么,解决了什么问题,缺陷是什么,重新设计是什么,它如何解决问题?
猜你喜欢: