Delphi XE2,如何在更改VCL样式后保持窗体在顶部
我在XE2中遇到了一个奇怪的问题: 我正在使用HWND_TOPMOST和SetWindowPos将我的表单设置在顶部,但是如果我在运行时切换VCL样式,窗口就不再是最顶部的,取消设置/重新设置也无法修复它Delphi XE2,如何在更改VCL样式后保持窗体在顶部,delphi,delphi-xe2,vcl-styles,Delphi,Delphi Xe2,Vcl Styles,我在XE2中遇到了一个奇怪的问题: 我正在使用HWND_TOPMOST和SetWindowPos将我的表单设置在顶部,但是如果我在运行时切换VCL样式,窗口就不再是最顶部的,取消设置/重新设置也无法修复它 有没有办法解决这个问题?您的问题是,由于样式更改,表单正在重新创建,并且由于VCL不知道这一点,表单失去了最顶层的样式。或使用: FormStyle := fsStayOnTop; 或者重写CreateWindowHandle,以便在每次重新创建表单时调用SetWindowPos: typ
有没有办法解决这个问题?您的问题是,由于样式更改,表单正在重新创建,并且由于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\u
。在internet上进行了长时间搜索,在没有解决方案的Delphi帮助中,我尝试了几个不同的代码、几个技巧,所有这些都没有任何效果,问题依然存在。看着这些帮助,我决定测试下面的简单代码,这些代码非常适合我
procedure TForm1.FormShow(Sender: TObject);
begin
Application.RestoreTopMosts;
end;
听起来像个虫子。您应该将此报告给@MasonWheeler这不是一个bug,这是vcl样式的工作方式,每次更改vcl样式时,表单的句柄都会重新创建。@RRUZ:根据OP的原始描述,重新设置属性与启用样式不起作用,如果这是真的,那肯定是一个bug。(请参阅OP对Sertac回答的评论,以更好地解释实际发生的情况。)谢谢。你是对的,重新设置它实际上是有效的。问题是窗口句柄不同,因为我在更改VCL样式以克服不同的问题后调用了RecreateWnd,所以我使用一个现在无效的句柄调用SetWindowPos。