我在XE2中遇到了一个奇怪的问题:
我使用SetWindowPos和HWND_TOPMOST把我的窗体放在最上面,但是如果我在运行时切换VCL样式,窗口就不再是最上面的了,取消/重新设置也不能解决这个问题。
有没有什么方法可以解决这个问题?
我在XE2中遇到了一个奇怪的问题:
我使用SetWindowPos和HWND_TOPMOST把我的窗体放在最上面,但是如果我在运行时切换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
。
procedure TForm1.FormShow(Sender: TObject);
begin
Application.RestoreTopMosts;
end;