06 mars 2006

Ramdam Rootless windows

Comment créer une fenêtre qui n'ait pas de bordure et qui serait de plus transparente sous mac os X ?
Quelle question saugrenue... heuresement à grand renforts d'adc et de google j'ai pu obtenir une solution
qui a le mérite d'etre pour le moins facile à implémenter.

C'est pas si simple de trouver comment interfacer le tout avec interface builder, alors voila je vous donne enmille la solution pour peu que cela vous ait posé problème.

Créez une Cocoa based Application avec Xcode, cherchez votre fichier nib habituel, ouvrez le. Cliquez sur le fond de la fenêtre vide. Dans la palette classes, cliquez sur subclass NSWindow, vous aurez une classe personnalisée qui vous permettra milles facéties. Recliquez donc sur le fond de fenêtre desespérement vide et cliquez dans l'inspecteur d'attributs sur Custom Class, associez la fenêtre avec la classe nouvellement crée. Personnalisez les fenêtres selon vos envies et votre projet, terminez par la génération des fichiers à partir de l'inspecteur des classes: tous les fichiers relatifs aux sous classes que vous avez créé ne devront pas être oubliés.


#import "Fenetre.h"
#import <AppKit/AppKit.h>

@implementation Fenetre

- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag {
NSWindow* fenetre = [super initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO];
[fenetre setBackgroundColor: [NSColor clearColor]];
[fenetre setLevel: NSStatusWindowLevel];
[fenetre setAlphaValue:0.5];
[fenetre setOpaque:NO];
[fenetre setHasShadow: NO];
[fenetre canHide: YES];
return fenetre;
}

ici le code minimal pour créer une fenêtre semi transparente sans barre de titre, sans ombre et dont tous les composants peuvent devenir transparents (setOpaque).
Ne pas omettre de préciser dans Fenetre.h que Fenetre hérite de NSWindow si vous n'êtes pas passés par Interface Builder

2 commentaires:

Jim a dit…

[fenetre canHide: YES]; ne fonctionne pas chez moi mais tout le reste est OK. Merci!

Julien a dit…

(void)setCanHide:(BOOL)flag

Exact, je me suis trompé, canHide retourne uniquement l'état de la fenetre, et setCanHide modifie le parametre en question !
Merci pour cette remarque
Lien vers la documentation Apple