Delphi XE2,如何在更改VCL样式后保持表单ON TOP

hik*_*ari 7 delphi delphi-xe2 vcl-styles

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

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

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

Ser*_*yuz 8

你的问题是,由于VCL对此没有任何了解,因为样式发生了变化并且失去了最顶级的风格,因此正在重新创建表单.使用:

FormStyle := fsStayOnTop; 
Run Code Online (Sandbox Code Playgroud)

或覆盖,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;
Run Code Online (Sandbox Code Playgroud)


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


Rem*_*eau 5

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