7

我在 XE2 中遇到了一个奇怪的问题:

我正在使用 HWND_TOPMOST 和 SetWindowPos 将我的表单设置在顶部,但是如果我在运行时切换 VCL 样式,则窗口不再是最顶部的,并且取消设置/重新设置它也不能修复它。

有任何解决这个问题的方法吗?

4

3 回答 3

8

您的问题是,由于样式更改并失去了最重要的样式,因此表单正在重新创建,因为 VCL 对此一无所知。要么使用:

FormStyle := fsStayOnTop; 

或覆盖CreateWindowHandle,以便在SetWindowPos每次重新创建表单时调用:

type
  TForm1 = class(TForm)
    ..
  protected
    procedure CreateWindowHandle(const Params: TCreateParams); override;
  ..

procedure TForm1.CreateWindowHandle(const Params: TCreateParams);
begin
  inherited;
  SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
end;


顺便说一句,我无法复制“取消设置/重新设置不能修复它”。通过我的测试,再次调用SetWindowPos修复它。

于 2012-05-10T00:35:23.183 回答
5

在控件上设置新样式会导致重新创建控件的窗口句柄,因此HWND_TOPMOST必须再次重新应用。

于 2012-05-10T00:50:44.820 回答
0

在互联网上长时间搜索并在Delphi帮助中没有解决方案后,我尝试了几个不同的代码,几个提示,所有这些都没有任何效果,问题仍然存在。看着帮助,我决定测试下面对我来说非常有效的简单代码。

procedure TForm1.FormShow(Sender: TObject);
begin
  Application.RestoreTopMosts;
end;
于 2017-08-24T11:55:03.363 回答