カスタムコントロール(TCustomControlから派生)が現在表示されているかどうかを確認する方法が必要です。.Visibleプロパティについて話しているのではありません。現時点で実際に画面に表示されているかどうかを意味します。誰かがこれを行う方法を知っていますか?
7892 次
2 に答える
17
数年前、フォームで同じような問題が発生しました。フォームが実際に (部分的にでも) ユーザーに表示されているかどうかを判断する方法を探していました。
特に、ウィンドウが表示されるはずで、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;
于 2009-03-16T18:39:03.487 に答える
2
OnPaintイベントにコードを添付できますか?これは非常に頻繁に呼び出され、コントロールが実際にペイントされるときにのみ呼び出されると思います(たとえば、あなたが意味する方法で表示されます)。
于 2009-03-14T20:05:09.287 に答える