我需要一种方法来自定义控件(TCustomControl的后代)来判断它当前是否可见.我不是在谈论.Visible属性; 我的意思是它是否实际上正在屏幕上显示.有谁知道如何做到这一点?
几年前,我对表单遇到了同样的问题:我正在寻找一种方法来确定表单是否实际可见(甚至只是部分)给用户.
特别是当它应该是可见的并且显示是真的但是窗口实际上完全落后于另一个.
这是代码,它可以适用于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;