Frage

Ich brauche einen Weg für eine individuelle Steuerung (abstammen von TCustomControl) zu sagen, ob es noch sichtbar ist. Ich spreche nicht über die .Visible Eigenschaft; Ich meine, ob oder nicht es ist tatsächlich auf dem Bildschirm zur Zeit angezeigt wird. Wer weiß, wie dies zu tun?

War es hilfreich?

Lösung

Ein paar Jahre zurück, hatte ich die gleiche Art von Problem für eine Form: Ich suchte nach einem Weg, um zu bestimmen, ob ein Formular tatsächlich sichtbar ist (auch nur teilweise) an den Benutzer
. Insbesondere dann, wenn sollte sie sichtbar sein und Angezeigt war wahr, aber das Fenster war eigentlich ganz hinter einem anderen.
Hier ist der Code, könnte es für angepasst werden ein 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;

Andere Tipps

Könnten Sie Code an das Ereignis OnPaint anhängen? Dies wird sehr oft genannt und ich denke, wird nur aufgerufen, wenn die Steuerung tatsächlich gemalt werden soll (zB ist sichtbar in der Art und Weise Sie bedeuten).

Ich denke, das ist es, was TWinControl.Showing ist. Ich bin nicht sicher, wie zuverlässig es ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top