كيف يمكنني معرفة ما إذا كان عنصر تحكم دلفي مرئيا حاليا؟
-
22-07-2019 - |
سؤال
وأنا بحاجة إلى وسيلة للعنصر تحكم مخصصة (ينحدر من 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;
نصائح أخرى
هل يمكنك إرفاق رمز إلى الحدث OnPaint؟ وهذا ما يسمى في كثير من الأحيان، وأعتقد أن يسمى إلا عندما السيطرة هي في طريقها فعلا إلى أن يرسم (على سبيل المثال مرئيا في الطريقة التي يعني).
وأعتقد أن هذا هو ما هو TWinControl.Showing ل. ولست متأكدا كيف يمكن الاعتماد عليها هو عليه.