كيف يمكنني معرفة ما إذا كان عنصر تحكم دلفي مرئيا حاليا؟

StackOverflow https://stackoverflow.com/questions/646527

سؤال

وأنا بحاجة إلى وسيلة للعنصر تحكم مخصصة (ينحدر من 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 ل. ولست متأكدا كيف يمكن الاعتماد عليها هو عليه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top