# Associer un son à un bouton



## HommeCocoa (29 Septembre 2005)

Bonsoir,

Je viens de m'apercevoir que l'on pouvait associer un son à un bouton en glissant un des sons se trouvant dans la palette d'instance de Interface builder sous l'onglet "Sounds". Sans une seule ligne de code, le son choisi est joué à chaque pression du bouton. C'est assez interessant, mais quelqu'un sait si l'on peut faire la même chose mais au passage de la souris sur le bouton et non pas au "mouseUp" ?  :sleep: 

Bonne soirée Cocoa,
David


----------



## Céroce (3 Octobre 2005)

Oui c'est possible (bien qu'assez insupportable, à mon avis).
Tu dois ajouter un "Tracking Rectangle" sur ton bouton et faire retentir le son lorsque la bonne méthode du délegué est appelée.

C'est pas une réponse très complète, mais j'ai pas le temps de chercher davantage.


----------



## HommeCocoa (3 Octobre 2005)

Oui c'est vrai que dans la plus part des cas, c'est asser insuportable, seulement dans ce cas, c'est pas un "gadget" mais c'est une application destiné au enfant ne sachant pas lire, du coup, il doivent trouver  les sons représenté par des boutons non pas en lisant mais en écoutant   

Le "Tracking rectangle" c'est un objet que l'on peut trouver dans Interface Builder?

Merci,
David


----------



## tatouille (4 Octobre 2005)

HommeCocoa a dit:
			
		

> Oui c'est vrai que dans la plus part des cas, c'est asser insuportable, seulement dans ce cas, c'est pas un "gadget" mais c'est une application destiné au enfant ne sachant pas lire, du coup, il doivent trouver les sons représenté par des boutons non pas en lisant mais en écoutant
> 
> Le "Tracking rectangle" c'est un objet que l'on peut trouver dans Interface Builder?
> 
> ...



il faut que tu implementes ta class nsbutton avec un nsevent 
Tracking rectangle n'est que la zone du button

il faut que tu catch l'event mouseUP et là tu appels ton son


----------



## Céroce (4 Octobre 2005)

J'ai essayé de faire ce que je te disais de faire.
Le principe:
On sous-classe NSButton (ici la classe CeSurvolButton), et dans la méthode -awakeFromNib, on ajoute un "tracking rectangle", un rectangle qui sert à suivre le mouvement de la souris. On le positionne pour qu'il soit superposé au bouton. On charge également le son à ce moment là (pour ne pas le faire de façon répétitive).

La méthode -mouseEntered: est ensuite dérivée pour jouer le son lorsque le pointeur entre dans le tracking rectangle.


```
#import <Cocoa/Cocoa.h>


@interface CeSurvolButton : NSButton
{
	NSSound	*_sound;
}

- (void)awakeFromNib;
- (void)mouseEntered:(NSEvent *)theEvent;

@end
```



```
#import "CeSurvolButton.h"


@implementation CeSurvolButton

- (void)awakeFromNib
{
		_sound = [NSSound soundNamed:@"Glass"];
		[self addTrackingRect:[self bounds] owner:self userData:nil assumeInside:YES];
}

- (void)mouseEntered:(NSEvent *)theEvent
{
	NSLog(@"Entre");
	[_sound play];
}

@end
```

Et voilà.

Je pensais qu'on pouvait le faire avec un délégué (ça me semblait plus propre), mais cette méthode est relativement directe.


----------



## HommeCocoa (8 Octobre 2005)

Merci bien pour l'explication,

J'ai juste un petit problème, je sais comment créer une sous-classe d'un NSView avec la commande "New File" mais je n'ai aucune idée comment créer un sous-classe de NSButton.

Héé oui je suis un sacré débutant  

Merci encore
David


----------



## olof (9 Octobre 2005)

Dans la fen&#234;tre principale de IB, tu affiche le panel 'Classes' , tu clics sur la classe NSButton et tu presses sur <return>. Apr&#232;s, clic-droite sur ta classe fra&#238;chement cr&#233;&#233;e et 'Create files for <ta classe>'.

A+


----------



## HommeCocoa (9 Octobre 2005)

Haa oui super!

Merci pour le tuyau


----------



## Nickopol (3 Juin 2009)

Bonjour tout le monde, voila, jsuis tout nouveau en Interface Builder ainsi que sur le forum et du coup, je galere.
Mon probleme parait idiot mais... je ne trouve aucun onglet "Sounds" ni de palette d'instance dans mon IB et du coup je n'arrive pas a associer un son a un bouton. 
Il est possible que cela vienne de ma version (Xcode 3.x et IB 3.x too) mais a ce moment la, quelqu'un pourrait-il me dire comment je doit m'y prendre ? (meme si je sais bien que je deterre un post qui a 4ans, je garde espoir ^^)


----------



## tatouille (4 Juin 2009)

enjoy

http://code.google.com/p/le-depotoir/source/browse/#svn/trunk/obj-C/ButtonWithSound

a ma montre 4 minutes, ce que tu cherches est dans OBJECT ATTRIBUTES, premier onglet de la palette inspector 

shift-command-I

Céroce, j'ai ajoute un filtre anti _agaçant_


----------



## Céroce (4 Juin 2009)

Nickopol a dit:


> Mon probleme parait idiot mais... je ne trouve aucun onglet "Sounds" ni de palette d'instance dans mon IB et du coup je n'arrive pas a associer un son a un bouton.
> Il est possible que cela vienne de ma version (Xcode 3.x et IB 3.x too)



Effectivement, Interface Builder a beaucoup évolué depuis.
Les sons se trouvent maintenant dans la palette Library > Media. Tu peux en glisser un sur un bouton.

- System Media contient les sons intégrés à Mac OS.
- User Media, ceux mis dans les Resources de ton appli.


(Tatouille, ton filtre marche trop bien: nous allons finir par nous trouver très seuls, entre connaisseurs).


----------



## tatouille (4 Juin 2009)

moi j'ai toujours espoir de voir demarrer un truc comme NSCoder Night ou CocoaHeads en France, et inviter les entreprises avec des talks, c'est comme ca que tu dynamises le marché et aide les independants a se regrouper et a trouver des projets et des clients

pour l'instant j'ai pas fini de migrer mais cocoa/touch represente 50% de mon travail, j'aimerai passer a 95% 


```
- (id)initWithCoder:(NSCoder *)coder
{
        if ((self = [super initWithCoder:coder])) {
                [self setSound:[NSSound soundNamed:@"toto"]];
                [self addTrackingRect:[self bounds] owner:self userData:nil assumeInside:YES];
        }
        
        return self;
}

- (void)mouseEntered:(NSEvent *)theEvent
{
        if (![[self sound] isPlaying]) {
                [[self sound] play];
        }
}

- (void)mouseUp:(NSEvent *)theEvent
{
    // overwrite default don't work
}
```
la solution serait, (snip), conclusion: ce qui prouve qu'il est plus efficient et facile de travailler a partir d'un NSControl si tu veux faire un nouveau button

```
- (void)mouseEntered:(NSEvent *)theEvent
{
        if (![[self sound] isPlaying]) {
                [[self sound] play];
        }
}

- (void)mouseUp:(NSEvent *)theEvent
{
    // overwrite default
    [self highlight:NO];
}

- (void)mouseDown:(NSEvent *)theEvent
{
    // overwrite default
    [self highlight:YES];
}

@end
```


----------

