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
再度適用する必要があります。