10

我需要一种方法来让自定义控件(从 TCustomControl 继承)来判断它当前是否可见。我不是在谈论 .Visible 属性;我的意思是它现在是否真的显示在屏幕上。有谁知道如何做到这一点?

4

2 回答 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 回答