Survol d'une fenêtre
olivier555
Membre
Bonjour!
Je voudrais savoir s'il est possible de détecter le simple survol de la souris au dessus d'une fenêtre (sans cliquer donc), sachant que la fenêtre en question est flottante et n'est jamais la keyWindow (c'est une palette d'outil). J'ai bo chercher dans la doc d'Apple ou sur les forums, je ne trouve pas la solution. Merci d'avance!
Je voudrais savoir s'il est possible de détecter le simple survol de la souris au dessus d'une fenêtre (sans cliquer donc), sachant que la fenêtre en question est flottante et n'est jamais la keyWindow (c'est une palette d'outil). J'ai bo chercher dans la doc d'Apple ou sur les forums, je ne trouve pas la solution. Merci d'avance!
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Oui j'ai essayé, mais il n'y a aucune réaction... J'ai ajouté dans le awakeFromNib la méthode setAcceptsMouseMovedEvents, ça marche pas non plus.
Pour tout vous dire, je voudrais faire une palette transparente qui devient opaque lorsqu'on la survole, de la même manière que sur Word.
Mon apli fait pas mal de calculs aussi bien au niveau affichage qu'au niveau son (MIDI, lecture de samples). Ta suggestion ne bouffe t-elle pas trop de ressources? Si c'est le cas, je préfère abandonner cette idée et faire une palette opaque, comme n'importe quel soft Windows...Â
Merci les gars en tout cas!
Mais si tu t'inquiètes de la consommation processeur, il y a des chances qu'une fenêtre translucide consomme plus dans l'ensemble que 4 comparaisons de nombres à chaque mouvement de souris.
Je parlais de Word sur Mac bien sûr, qui a une palette d'outils très sympa!
OK merci pour les pistes, j'essaye bientôt!
Sinon une piste: à la place de dessiner les contrôles de la palette dans la fenêtre IB représentant ton inspecteur, tu les dessines dans une CustomView (placée dans la fenêtre IB avec le File's Owner, First Responder,...). Cette vue doit être une sous-classe de NSView, pour laquelle l'implémentation contient le code suivant:
[tt]- (void) viewDidMoveToWindow {
[self addTrackingRect:[self bounds]
owner:self
userData:nil
assumeInside:NO];
}
- (void)mouseEntered:(NSEvent *)event {
NSPoint point = [event locationInWindow];
point = [self convertPoint:point toView:nil];
NSLog(@entered:%@",NSStringFromPoint(point));
}
- (void)mouseExited:(NSEvent *)event {
NSPoint point = [event locationInWindow];
point = [self convertPoint:point toView:nil];
NSLog(@exited:%@",NSStringFromPoint(point));
}[/tt]
Et dans le awakeFromNib du contrôleur, tu rajoutes:
[tt][inspectorWindow setContentView:lOutletVersTaVuePerso];[/tt]
ça fonctionne même si l'application n'est pas au premier plan (donc à priori que la fenêtre n'est pas active).
J'ai définitivement arrêté d'utiliser les trackingRect que je trouve trop restrictif, rigide d'emploi, et pas très au point.
Maintenant, je gère mes propres trackingRect en utilisant mouseMoved de NSResponder.
.
Aucune piste même Carbon ?
Un moyen, dont je parle déjà plus haut, est de récupérer les coordonnées globales de la souris en appelant la fonction DSpGetMouse() du framework DrawSprocket via un timer. Aprés tu peux comparer ces coordonnées avec les frames de tes fenêtres. Ce n'est pas trés propre il est vrai car DrawSprocket est maintenant considérée comme une "legacy" API donc elle doit fonctionner mais ces fonctions sont plus ou moins supportées.
[Fichier joint supprimé par l'administrateur]
Je disais moins réactif pour un timer qui suce moins (0.5/sec).
Mais je sais pas ce que ça peut donner sur un système qui tourne pendant plusieurs semaines... des avis ?
               Timer=0.1  : 0,3 %
               Timer=0.25 : 0,1 %
               Timer=0.5  :  0 %
Le timer réglé sur 0.25 donne un rapport correct, bien que je trouve que ça fonctionne trés bien aussi avec un réglage de 0.5. :P
En ce qui concerne le fonctionnement sur plusieurs semaines (voir même beaucoup plus), je vois pas où pourrait être le problème, mais le mieux est toujours de tester.
Résultat du grand test :
NSPoint pt=[NSEvent mouseLocation]; // 1.2 à 1.3%
struct Point globalMouse;DSpGetMouse(&globalMouse); // 1.0 à 1.1%
Je vais peut être faire comme ça... merci @+
NSEvent risque sûrement de ne pas être pris en compte dans les cas où l'appli n'est plus en premier plan et/ou les fenêtres visées ne sont pas key/main windows (ce qui est normal car ce n'est pas le but), et en plus, avec DSp, cela permet de prendre en compte l'intégralitée des fenêtres (barre de titre comprise), qu'elles soient partiellement cachées ou non.
[EDIT] J'avais oublié que mouseLocation était une méthode de classe, ça fonctionne bien aussi avec, bien qu'un poil plus gourmand en CPU c'est vrai.
ben peut-être comme cela :
- (void)awakeFromNib
{
NSRect r;
tracking_tag = [self addTrackingRect:imageRect owner: self userData:nil assumeInside: NO];
}
- (void)changeTrackingRectangle
{
if (nil!=tracking_tag)
[self removeTrackingRect:tracking_tag];
tracking_tag = [self addTrackingRect:[self bounds] owner: self userData: 0 assumeInside: FALSE];
}