2009-03-14 22 views
8

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

+0

を意味していますか? –

+0

私はそれが画面に描画されているかどうかを意味します。カバーされることが1つの理由かもしれません。まだ作成されていないがまだ表示されていないフォームに配置されている場合は別のものになる可能性があります。 –

答えて

15

私はFormと同じ種類の問題を抱えていました。フォームが実際に(部分的にでも)ユーザーに表示されるかどうかを判断する方法を探していました。
特に、表示されるはずの表示が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; 
+0

ありがとう!それはまさに私が探していたものです。 –

2

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

+0

私はこれを最善の指標としています。 Vistaではすべてのアプリケーションがオフスクリーンのビットマップに描画され、グラフィックカードにオーバーレイなどが含まれているため、決して確実に確認することはできません。 – mj2008

+0

しかし、現時点で画面に表示される場合は、 ? –

+1

WM_PAINTは、そのピクセルが画面に当たったときに来ると仮定するのは安全だとは思いません。 Desktop Composition(http://msdn.microsoft.com/en-us/library/aa969540%28VS.85%29.aspx)を使用すると、WindowsはWindows Flip(http:// www。 microsoft.com/windows/windows-vista/features/flip-3d.aspx)*すべてのウィンドウを一度に必要とする可能性があります。このため、私はいくつかのバックグラウンドのキャッシュリフレッシュがあると思います。 –

1

私はこれがTWinControl.Showingの目的だと思います。 私はそれがどれほど信頼できるか分かりません。

+1

フォームなどでは機能しません。フォームは完全に別のフォームの背後にあることができ、まだ真を表示しています。 –

+0

私が言ったように、私はそれがどれほど徹底しているか分かりませんでした。 –

+2

表示のみは、すべての親コントロールが表示されているかどうかを示します。これは、設計モードでいくつかの状況を区別します。目に見えない成分が見える。つまり、現時点で表示されているコンポーネントが表示されているかどうかを示します。 –

関連する問題