Wie kann ich feststellen, ob eine Delphi-Steuerung zur Zeit zu sehen ist?
-
22-07-2019 - |
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?
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.