Necesito una forma de para un control personalizado (desciende de TCustomControl) para decir si está actualmente visible. No estoy hablando de la propiedad .Visible; Quiero decir si realmente se muestra o no en pantalla en este momento. ¿Alguien sabe como hacer esto?¿Cómo puedo saber si un control Delphi está actualmente visible?
Respuesta
Hace unos años tuve el mismo tipo de problema para un Formulario: estaba buscando una forma de determinar si un Formulario es realmente visible (aunque sea solo parcialmente) para el usuario.
En particular, cuando se suponía que era visible y Mostrar era verdadero, pero la ventana estaba completamente detrás de otra.
Aquí está el código, podría ser adaptado para una 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;
¡Gracias! Eso es precisamente lo que estaba buscando. –
¿Podría adjuntar código al evento OnPaint? Esto se llama con mucha frecuencia y creo que solo se usa cuando el control va a pintarse (por ejemplo, es visible en la forma en que te refieres).
Me gustaría ir con esto como un mejor indicador. Nunca se puede estar seguro porque en Vista todas las aplicaciones se dibujan en un mapa de bits fuera de la pantalla que luego se compone en la tarjeta gráfica con las superposiciones, etc. – mj2008
Pero presumiblemente solo se saca de la pantalla si se va a mostrar en pantalla en este momento ? –
No creo que sea seguro suponer que WM_PAINT solo vendrá cuando esos píxeles estén a punto de tocar la pantalla. Con Desktop Composition (http://msdn.microsoft.com/en-us/library/aa969540%28VS.85%29.aspx), Windows mantiene un caché de ventanas dibujadas para efectos como Windows Flip (http: // www. microsoft.com/windows/windows-vista/features/flip-3d.aspx) que pueden requerir * todas * ventanas a la vez. Debido a esto, espero que haya algunas actualizaciones de caché de fondo. –
Creo que esto es para lo que TWinControl.Showing es. No estoy seguro de qué tan confiable es.
No funciona para un formulario, por ejemplo. Un formulario puede estar completamente detrás de otro y aún así mostrarse verdadero. –
Como dije, no tenía idea de lo completo que era. –
Mostrar solo le indica si todos los controles principales están visibles. Diferencia algunas situaciones en modo de diseño, donde f.e. los componentes no visibles son visibles. Entonces le dice si el componente si se muestra en este momento sería visible. –
- 1. ¿Cómo saber si un cierre está actualmente en curso?
- 2. ¿Cómo puedo saber si un UIView está visible y en la pantalla?
- 3. ¿Cómo puedo verificar si actualmente se está visualizando un UIViewController?
- 4. ¿Cómo puedo saber si un proceso se está ejecutando?
- 5. ¿Cómo puedo determinar si se visualiza un punto geográfico en el área actualmente visible?
- 6. jQuery si está visible
- 7. ¿Cómo puede saber mi programa si Delphi se está ejecutando?
- 8. ¿Cómo puedo saber si un cliente web está bloqueando anuncios?
- 9. ¿Cómo puedo saber si un secuenciador está cerrado?
- 10. CardLayouts: ¿Cómo puedo saber qué tarjeta es visible?
- 11. ¿Cómo saber si un elemento <video> se está reproduciendo actualmente?
- 12. Cómo saber si un actor está inactivo
- 13. ¿Cómo puedo detectar si un control ActiveX está cargado?
- 14. ¿Cómo comprobar si una vista específica de UIViewController está actualmente visible?
- 15. Cómo verificar si una NSWindow está visible
- 16. Cómo determinar si un marcador está visible en Google Maps
- 17. En jQuery, ¿cómo puedo saber si el objeto actual está oculto o no?
- 18. ¿Cómo comprobar si un NSProgressIndicator está actualmente animado?
- 19. ¿Cómo puedo saber si .NET 3.5 SP1 está instalado?
- 20. ¿Cómo puedo saber si el CouchDB está funcionando?
- 21. ¿Cómo puedo saber si Moodle cron está funcionando?
- 22. ¿Cómo puedo saber si Matlab está ocupado cuando usa GUI?
- 23. ¿Cómo puedo saber si la pantalla está activada en Android?
- 24. ¿Cómo puedo saber si NSTimer está activo o no?
- 25. ¿Cómo puedo saber si se está mostrando ModalViewController?
- 26. ¿Cómo puedo saber si está instalado .NET 4.02?
- 27. Cómo saber si la vista de UIViewController es visible
- 28. ¿Cómo puedo saber si la cámara está en uso?
- 29. ¿Cómo saber si el usuario está leyendo actualmente una página con Javascript?
- 30. ¿Cómo puedo saber si un TClass se deriva de otro?
¿Quieres decir si es o no está cubierta por otra ventana? –
Quiero decir si se está o no atrayendo a la pantalla. Estar cubierto podría ser una razón. Otro podría ser si se ha colocado en un formulario que se ha creado pero que aún no se muestra. –