即使主要形式最小化,强制形式仍然保持在一切之上

时间:2017-08-09 17:24:04

标签: winforms user-interface lazarus

尝试找到一种方法,即使主窗体最小化,也可以强制我的某个表单保持在桌面上的所有其他表单上。有点像谷歌浏览器确实有点通知。

我已将表单的表单样式设置为systemStayOnTop,这样做效果很好,直到我最小化主表单。当我尽量减少它时,其他一切都消失了(我猜应该这样)。

那么,即使我的主表单最小化,是否有一种简洁的方法可以在所有之上强制使用表单?或者我是否需要深入研究DirectX / WinAPI?

P.S。 已经去过this question,但这些方法都不起作用。

感谢。

注意:即便如此,这个问题最初被标记为[delphi],根据以下评论,它是关于Lazarus的。这就是德尔福有答案的原因。

3 个答案:

答案 0 :(得分:2)

您可以通过将FormStyle设置为fsStayOnTop并使其成为顶级窗口并设置适当的窗口样式来强制表单保持在最顶层。您可以通过覆盖表单中的CreateParams来执行此操作:

TForm1 = class(TForm)        
  private
    { Private declarations }
  protected      
    procedure CreateParams(var Params: TCreateParams); override;
  public
    { Public declarations }
end;

实施:

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := 0;  { Make this a top-level window }
  Params.Style := WS_POPUPWINDOW or WS_CAPTION or WS_CLIPCHILDREN;
end;

答案 1 :(得分:0)

我在Delphi 10.3.3中尝试了上面发布的CreateParams解决方案-但它没有用。但是,我确实找到了适用于Delphi的解决方案。不知道Lazarus中是否有类似的东西,但是我在这里发布了Delphi答案,以防万一其他人发生此事,因为我在找到有效的Delphi答案之前30分钟找到了这篇文章。 :)

将其放在“ Form B” OnCreate事件中:

FormStyle:= fsStayOnTop;

但是仅靠这还不够...

TApplicationEvents 拖到“表格B”上

ApplicationEvents1 OnDeactivate 事件中,添加以下内容:

SetForegroundWindow(Handle);

当我的主要表单正在处理场外数据时,我会注意一个小的状态窗口。做工精美!

答案 2 :(得分:-1)

除了@J...'s post之外,您还可以使用TForm类中的OnDeactivate过程强制用户不要从窗口中松开焦点。

创建和显示表单时,您还可以使用ShowModal而不是Show来使窗口显示在父级之上。