Delphiコントロールが現在表示されているかどうかを確認するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/646527

質問

カスタムコントロール(TCustomControlから派生)が現在表示されているかどうかを確認する方法が必要です。私は.Visibleプロパティについて話しているのではありません。現時点で実際に画面に表示されているかどうかを意味します。誰もこれを行う方法を知っていますか?

役に立ちましたか?

解決

数年前、フォームにも同じ種類の問題がありました。フォームが実際に(部分的にでも)ユーザーに見えるかどうかを判断する方法を探していました。
特に、表示されるはずで、ShowingがTrueだったが、実際にはウィンドウが完全に別のウィンドウの後ろにあった場合。
コードは次のとおりです。WinControlに適合させることができます...

{----------------------------------------------------------}
function IsMyFormCovered(const MyForm: TForm): Boolean;
var
   MyRect: TRect;
   MyRgn, TempRgn: HRGN;
   RType: Integer;
   hw: HWND;
begin
  MyRect := MyForm.BoundsRect;            // screen coordinates
  MyRgn := CreateRectRgnIndirect(MyRect); // MyForm not overlapped region
  hw := GetTopWindow(0);                  // currently examined topwindow
  RType := SIMPLEREGION;                  // MyRgn type

// From topmost window downto MyForm, build the not overlapped portion of MyForm
  while (hw<>0) and (hw <> MyForm.handle) and (RType <> NULLREGION) do
  begin
    // nothing to do if hidden window
    if IsWindowVisible(hw) then
    begin
      GetWindowRect(hw, MyRect);
      TempRgn := CreateRectRgnIndirect(MyRect);// currently examined window region
      RType := CombineRgn(MyRgn, MyRgn, TempRgn, RGN_DIFF); // diff intersect
      DeleteObject( TempRgn );
    end; {if}
    if RType <> NULLREGION then // there's a remaining portion
      hw := GetNextWindow(hw, GW_HWNDNEXT);
  end; {while}

  DeleteObject(MyRgn);
  Result := RType = NULLREGION;
end;

function IsMyFormVisible(const MyForm : TForm): Boolean;
begin
  Result:= MyForm.visible and
           isWindowVisible(MyForm.Handle) and
           not IsMyFormCovered(MyForm);
end;

他のヒント

OnPaintイベントにコードを添付できますか?これは非常に頻繁に呼び出され、コントロールが実際にペイントされるときにのみ呼び出されると思います(たとえば、あなたが意味する方法で表示されます)。

これがTWinControl.Showingの目的だと思います。 どれだけ信頼できるかわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top