7

XE2 で奇妙な問題が発生しました。

SetWindowPos で HWND_TOPMOST を使用してフォームを一番上に設定していますが、実行時に VCL スタイルを切り替えると、ウィンドウが一番上に表示されなくなり、設定を解除/再設定しても修正されません。

これを修正する方法はありますか?

4

3 に答える 3

8

問題は、スタイルが変更されたためにフォームが再作成され、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と修正されました。

于 2012-05-10T00:35:23.183 に答える
5

コントロールに新しいスタイルを設定すると、コントロールのウィンドウ ハンドルが再作成されるため、HWND_TOPMOST再度適用する必要があります。

于 2012-05-10T00:50:44.820 に答える