Redessiner un NSButton

TchouboudouTchouboudou Membre
22:28 modifié dans API AppKit #1
Bonjour les gens...

Ma question est simple (mais la réalisation, moins) : comment redessiner un NSButton ? C'est à  dire lui mettre un bout à  gauche, un bout à  droite et remplir le milieu.

Le but, c'est de pouvoir créer facilement des boutons, sans devoir créer des images pour chaque bouton.

Merci d'avance,
Tchouboudou

Réponses

  • Eddy58Eddy58 Membre
    22:28 modifié #2
    Il faut sous-classer NSCell et surcharger - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView. :)
  • TchouboudouTchouboudou Membre
    22:28 modifié #3
    Et, euh, après, je fais [super drawInteriorWithFrame:cellFrame inView:newView] ?

    newView étant la vue que j'ai précedemment créé ?
  • Eddy58Eddy58 Membre
    22:28 modifié #4
    Non, tu n'as pas à  t'occuper du paramètre view. Rien de tel qu'un exemple, tu en as un bon ici. :o
  • TchouboudouTchouboudou Membre
    22:28 modifié #5
    Oki, merci, je vais voir ça.
  • Eddy58Eddy58 Membre
    22:28 modifié #6
    Pour être plus précis :
    1) Sous-classer NSButton et surcharger - (id)initWithFrame:(NSRect)frameRect pour attribuer la cell à  ton bouton.

    <br />@implementation MonBouton<br /><br />-(id)initWithFrame:(NSRect)frameRect<br />{<br />&nbsp; NSButtonCell *monBoutonCell=[[MonBoutonCell alloc] init]; <br />&nbsp; [monBoutonCell setEnabled:YES];<br />&nbsp; [self setCell:monBoutonCell];<br />&nbsp; [monBoutonCell release];<br />&nbsp; return self;<br /> }<br /><br />@end<br />
    


    2) Sous-classer NSButtonCell et surcharger - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView

    <br />@implementation MonBoutonCell<br /><br />- (void)drawInteriorWithFrame:(NSRect)frame inView:(NSView *)view<br />{<br /> /* Code de dessin */ <br /><br /> [super drawInteriorWithFrame:frame inView:view]; <br />}<br /><br />@end<br />
    
  • 22:28 modifié #7
    Ou autre option dans le initialize de MyButton:

    [tt]+(void)initialize {
    [super initialize];

    [self setCellClass:[MyButtonCell class]];
    }[/tt]
  • Eddy58Eddy58 Membre
    juin 2007 modifié #8
    Autre méthode, qui me revient juste  :), sans passer pas NSCell, mais par NSImage :

    <br />-(void)awakeFromNib<br />{<br />&nbsp; &nbsp; &nbsp;// Dessin du bouton dans son etat normal<br />&nbsp; &nbsp; normalImage=[[NSImage alloc] initWithSize:NSMakeSize(64,64)];<br />&nbsp; &nbsp; [normalImage lockFocus];<br />&nbsp; &nbsp; &nbsp; /* Code de dessin */<br />&nbsp; &nbsp; [normalImage unlockFocus];<br /><br />&nbsp; &nbsp; &nbsp;// Dessin du bouton dans son etat appuyé<br />&nbsp; &nbsp; &nbsp;pushedImage=[[NSImage alloc] initWithSize:NSMakeSize(64,64)];<br />&nbsp; &nbsp; [pushedImage lockFocus];<br />&nbsp; &nbsp; &nbsp;/* Code de dessin */<br />&nbsp; &nbsp; [pushedImage unlockFocus];<br /><br />&nbsp; &nbsp; // Attributions au bouton<br />&nbsp; &nbsp; [monBouton setImage:normalImage];<br />&nbsp; &nbsp; [monBouton setAlternateImage:pushedImage];<br />&nbsp; &nbsp; [normalImage release];<br />&nbsp; &nbsp; [pushedImage release];<br />}<br />
    
  • TchouboudouTchouboudou Membre
    juin 2007 modifié #9
    En fait, il s'est avéré que je n'avais pas besoin de redessiner un bouton  :) . Je voulais mettre un carré au bout arrondi (d'ailleurs, s'il y a un autre moyen que de dessiner avec lineToPoint et curveToPoint:controlPoint1:controlPoint2:, je suis preneur).

    Par contre, j'ai un petit problème. J'ai donc créer une sous-classe de NSView en dessinant le cadre et j'ajoute à  cette vue un bouton. Mais il s'avère que ce bouton se multiplie lorsque j'appuie dessus :D .

    Et tant que j'y suis, comment on lie une action à  un bouton (une action d'une autre classe) ?
  • MalaMala Membre, Modérateur
    22:28 modifié #10
    dans 1182961634:

    Et tant que j'y suis, comment on lie une action à  un bouton (une action d'une autre classe) ?

    Bein tu as dis la réponse. On fait un setAction. Pour l'objet visé par l'action, tu fais un setTarget.
  • Eddy58Eddy58 Membre
    22:28 modifié #11
    dans 1182961634:

    Par contre, j'ai un petit problème. J'ai donc créer une sous-classe de NSView en dessinant le cadre et j'ajoute à  cette vue un bouton. Mais il s'avère que ce bouton se multiplie lorsque j'appuie dessus :D .

    Tu n'ajouterais pas le bouton dans la méthode drawRect des fois ? ???
  • TchouboudouTchouboudou Membre
    22:28 modifié #12
    @Eddy58 : Oups :D . Je savais pas que la méthode était rappelé lorsque l'on cliquait sur un bouton ^^. J'ai changé ça. Par contre, le rectangle donné en argument dans les 2 méthodes est le même ?

    @Mala : Merci, j'avais cherché seulement dans les méthodes propres à  NSButton...
Connectez-vous ou Inscrivez-vous pour répondre.