J'ai besoin d'un moyen pour un contrôle personnalisé (descendant de TCustomControl) de dire s'il est actuellement visible. Je ne parle pas de la propriété .Visible; Je veux dire si oui ou non il est actuellement affiché à l'écran pour le moment. Est-ce que quelqu'un sait comment faire ça?Comment puis-je savoir si un contrôle Delphi est actuellement visible?
Répondre
Il y a quelques années, j'ai eu le même genre de problème pour un formulaire: je cherchais un moyen de déterminer si un formulaire est réellement visible (même partiellement) à l'utilisateur.
En particulier quand il était supposé être visible et Montrer était vrai mais la fenêtre était en réalité entièrement derrière une autre.
est ici le code, il pourrait être adapté pour une 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;
Merci! C'est exactement ce que je cherchais. –
Pourriez-vous joindre un code à l'événement OnPaint? Ceci est appelé très souvent et je pense qu'il n'est appelé que lorsque le contrôle va réellement être peint (par exemple, il est visible de la manière que vous voulez dire).
J'irais avec cela comme un meilleur indicateur. Vous ne pouvez jamais être sûr car dans Vista toutes les applications dessinent sur un bitmap hors écran qui est ensuite composé dans la carte graphique avec les superpositions, etc. – mj2008
Mais il est probable qu'il ne soit retiré de l'écran que s'il est affiché à l'écran pour le moment ? –
Je ne pense pas qu'il soit sûr de supposer que WM_PAINT viendra seulement quand ces pixels sont sur le point de frapper l'écran. Avec Desktop Composition (http://msdn.microsoft.com/en-us/library/aa969540%28VS.85%29.aspx), Windows conserve un cache de fenêtres dessinées pour des effets tels que Windows Flip (http: // www. microsoft.com/windows/windows-vista/features/flip-3d.aspx) qui peut nécessiter * toutes * les fenêtres à la fois. À cause de cela, je m'attendrais à ce qu'il y ait des rafraîchissements d'arrière-plan. –
Je pense que c'est ce que TWinControl.Showing est pour. Je ne suis pas sûr de sa fiabilité.
Cela ne fonctionne pas pour un formulaire par exemple. Une Forme peut être complètement derrière une autre et avoir toujours une Vraie Vraie. –
Comme je l'ai dit, je n'avais aucune idée à quel point c'était complet. –
L'affichage uniquement vous indique si tous les contrôles parents sont visibles. Il différencie certaines situations en mode design, où f.e. les composants non visibles sont visibles. Donc, il vous indique si le composant s'il est affiché pour le moment serait visible. –
- 1. Comment savoir si un contrôle est actuellement invalide?
- 2. Comment savoir si un UIView est visible et à l'écran?
- 3. Comment savoir si un contrôle est visible ou invisible à l'aide de Microsoft Active Accessibility
- 4. Détection si une chaîne particulière est actuellement visible sur TextField()
- 5. Comment vérifier si un Socket est actuellement connecté en Java?
- 6. C#: Comment déterminer si ScrollBar pour un contrôle Scrollable est actuellement affiché?
- 7. Comment savoir si un formulaire est en mode aide?
- 8. Comment savoir si un contrôle dérive d'une classe
- 9. Dans WPF, comment puis-je déterminer si un contrôle est visible pour l'utilisateur?
- 10. CrystalReportViewer, vérifiez si un rapport est actuellement affiché?
- 11. La meilleure façon de savoir si un objet DOM est visible ou non, en utilisant mootools
- 12. Comment puis-je savoir si mon viewcontroller est visible et accepte les événements?
- 13. Comment savoir si un rafraîchissement est venu d'une minuterie (C#)
- 14. Comment savoir si l'applet ou l'application est
- 15. Comment puis-je savoir si le OutputCache pour un contrôle donné est utilisé?
- 16. Comment savoir si dll RAPI est existant
- 17. JQuery - Si DIV ID est visible
- 18. Comment savoir si un assemblage est privé ou public
- 19. Comment savoir si un assembly .NET est dynamique?
- 20. Comment savoir si un objet est déjà référencé?
- 21. En Perl, comment savoir si une chaîne est un nombre?
- 22. Comment savoir si une classe Java est un type primitif?
- 23. Comment savoir si un objet est dynamique dans AS3
- 24. Java - Comment savoir si un nom de fichier est valide?
- 25. Comment savoir si un fichier est terminé de copier
- 26. Comment savoir si un classeur Excel est protégé
- 27. Comment savoir si un PropertyInfo est d'un type enum particulier?
- 28. Comment savoir si un trigger est activé dans PostgreSQL?
- 29. Comment puis-je savoir si un objet est verrouillé? C#
- 30. Comment savoir dans Ruby si un fichier est complètement téléchargé
Voulez-vous dire si oui ou non il est couvert par une autre fenêtre? –
Je veux dire si cela attire ou non l'écran. Être couvert pourrait être une raison. Un autre pourrait être si il a été placé sur un formulaire qui a été créé mais pas encore montré. –