Vous avez la bonne idée, je pense. Gardez à l'esprit cependant que, selon ce que vous voulez faire, les fenêtres sans bordure ne sont pas la chose la plus facile à travailler (elles peuvent être difficiles, surtout avec les complexités que des choses comme Spaces et Exposé peuvent ajouter).
S'il s'agit d'un projet personnel, vous pourriez probablement vous en sortir avec un bord d'un pixel de la fenêtre. S'il s'agit d'un projet professionnel, je vous recommanderais d'utiliser les Event Taps (plus d'informations à ce sujet plus tard). Si vous utilisez la méthode "projet personnel", vous pouvez laisser une bordure de 1 px de la fenêtre, utilisez une sous-classe NSView personnalisée qui se dessine comme transparente et configurez NSTrackingArea pour vous informer des événements mouseEntered:.
Pour dessiner une zone transparente, vous pouvez faire quelque chose comme ça dans drawRect:
- (void)drawRect:(NSRect)frame {
[[NSColor clearColor] set];
NSRectFill(frame);
}
Pour mettre en place une zone de suivi, faire dans le awakeFromNib dans votre sous-classe de vue:
- (void)awakeFromNib {
NSTrackingArea *tracker = [[[NSTrackingArea alloc] initWithRect:[self frame]
options:(NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways)
owner:self
userInfo:nil] autorelease];
[self addTrackingArea:tracker];
}
- (void)mouseEntered:(NSEvent *)theEvent {
[[[self window] windowController] showWindow:self];
}
- (void)mouseExited:(NSEvent *)theEvent {
[[[self window] windowController] myHideMethodName:self];
}
Cela suppose que vous remplacez la méthode showWindow: du contrôleur de fenêtre pour faire une animation ou autre chose). En passant, quoi que vous fassiez, ne cherchez pas les événements déplacés par la souris. (Ce n'est pas un gros problème dans votre cas, car votre zone sera probablement très petite, mais en général, la recherche d'événements déplacés par la souris est la mauvaise façon de procéder, car ils peuvent rapidement inonder la file d'attente des événements. Quartz Debug pour voir comment la plupart des logiciels le font). Gardez à l'esprit que même si la vue peut s'afficher de manière transparente, elle empêchera les événements de votre souris de passer au niveau inférieur (il peut s'agir d'une autre fenêtre ou du bureau, etc.).
Si vous souhaitez utiliser la route «pro», vous devriez pouvoir configurer des Event Taps pour accomplir pratiquement la même chose que le code de zone de suivi. Avec cette route, vous pouvez avoir la fenêtre complètement cachée afin qu'elle n'interfère avec rien. Pour comprendre comment fonctionne Taps Event, vous voudrez peut-être télécharger les 2 applications suivantes:
http://brockerhoff.net/quay/
http://pfiddlesoft.com/eventtapstestbench/
Le premier est un exemple frais de la façon dont vous pouvez utiliser événement tapote pour accomplir des trucs cool (lisez l'aide pour voir quelques fonctionnalités plus avancées). Rainer utilise les robinets d'événement pour appuyer sur le Dock pour déterminer quand vous déplacez votre souris au-dessus des éléments sur le côté gauche du Dock. Il peut alors afficher ses menus personnalisés à la place des menus intégrés du Dock.
La deuxième application sera indispensable pour examiner comment et quoi Quay (ou QuayMenu, vraiment) fait à ses robinets d'événement.
BTW, l'événement tapote API est en quartz (ce qui suit est un exemple de ce que vous utilisez pour mettre en place un robinet d'événement):
CFMachPortRef CGEventTapCreate (
CGEventTapLocation tap,
CGEventTapPlacement place,
CGEventTapOptions options,
CGEventMask eventsOfInterest,
CGEventTapCallBack callback,
void *refcon
);
Je ne sais pas assez sur l'événement me tape à donnez un exemple de la façon de le mettre en place, mais cela devrait au moins vous orienter dans la bonne direction.
Espérons que cela aide ....