我在 XE2 中遇到了一个奇怪的问题:
我正在使用 HWND_TOPMOST 和 SetWindowPos 将我的表单设置在顶部,但是如果我在运行时切换 VCL 样式,则窗口不再是最顶部的,并且取消设置/重新设置它也不能修复它。
有任何解决这个问题的方法吗?
我在 XE2 中遇到了一个奇怪的问题:
我正在使用 HWND_TOPMOST 和 SetWindowPos 将我的表单设置在顶部,但是如果我在运行时切换 VCL 样式,则窗口不再是最顶部的,并且取消设置/重新设置它也不能修复它。
有任何解决这个问题的方法吗?
您的问题是,由于样式更改并失去了最重要的样式,因此表单正在重新创建,因为 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
修复它。
在控件上设置新样式会导致重新创建控件的窗口句柄,因此HWND_TOPMOST
必须再次重新应用。
在互联网上长时间搜索并在Delphi帮助中没有解决方案后,我尝试了几个不同的代码,几个提示,所有这些都没有任何效果,问题仍然存在。看着帮助,我决定测试下面对我来说非常有效的简单代码。
procedure TForm1.FormShow(Sender: TObject);
begin
Application.RestoreTopMosts;
end;