我需要一种自定义控件(来自TCustomControl)的方法来判断它当前是否可见。我不是在谈论.Visible属性;我的意思是它是否实际上正在屏幕上显示。有谁知道怎么做?
答案 0 :(得分:16)
几年前,我对表单遇到了同样的问题:我正在寻找一种方法来确定表单是否实际可见(甚至只是部分)给用户。
特别是当它应该是可见的并且显示为真时,但窗口实际上完全落后于另一个窗口
这是代码,它可以适用于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;
答案 1 :(得分:2)
您可以将代码附加到OnPaint事件吗?这种情况经常被调用,我认为仅在控件实际上被绘制时被调用(例如以你的意思显示)。
答案 2 :(得分:1)
我认为这就是TWinControl.Showing的用途。 我不确定它有多可靠。