Pergunta

Eu preciso de uma maneira de para um controle personalizado (descendente de TCustomControl) para dizer se é visível no momento. Eu não estou falando sobre a propriedade .Visible; Quero dizer se é ou não realmente está sendo exibido na tela no momento. Alguém sabe como fazer isso?

Foi útil?

Solução

Há alguns anos atrás eu tinha o mesmo tipo de problema para um formulário:. Eu estava procurando uma maneira de determinar se um formulário é realmente visível (mesmo que apenas parcialmente) para o usuário
Em particular, quando era suposto ser visível e mostrando era verdade, mas a janela estava realmente totalmente por trás de outro.
Aqui está o código, pode ser adaptado para uma 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;

Outras dicas

Você poderia anexar o código para o evento OnPaint? Isso é chamado muitas vezes e acho que só é chamado quando o controle é realmente vai ser pintada (por exemplo, é visível na forma como você dizer).

Eu acho que isso é o que TWinControl.Showing é para. Não estou certo de quão confiável é.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top