Bouton de taille variable...

Nebuchad34Nebuchad34 Membre
22:07 modifié dans API AppKit #1
Bonsoir,

je cherche à  créer un bouton dont les dimensions (dessin et texte) soit proportionnelles à  la taille de la fenêtre.

Je sais déjà  faire ce genre de chose pour la taille du texte et pour la taille du bouton, suffit de modifier le "frame" et la FontSize du bouton dans le draw rect de la fenêtre en fonction de la taille de celle-ci.

Ce que je voudrais, c'est pouvoir redessiner l'image et l'alternate image avec NSBezierPath et NSgradient, et là  je ne sais vraiment pas comment faire...

Réponses

  • CéroceCéroce Membre, Modérateur
    22:07 modifié #2
    dans 1251672328:

    Ce que je voudrais, c'est pouvoir redessiner l'image et l'alternate image avec NSBezierPath et NSgradient, et là  je ne sais vraiment pas comment faire...


    Les boutons utilisent des NSImage. Crée une NSImage et ajoute-lui une représentation. Je vois deux possibilités:
    - utiliser un représentation bitmap (NSBitmapImageRep)
    C'est la méthode la plus simple pour le dessin, mais la moins bonne au niveau qualité. Dans ce cas, dessine l'image à  la taille maximale qu'elle puisse avoir pour que l'interpolation se fasse uniquement à  la réduction.

    - utiliser une représentation vectorielle
    Avec la méthode -[NSView dataWithPDFInsideRect:], tu peux obtenir une NSPDFImageRep (avec sa méthode +imageRepWithData:].


    À vrai dire, je n'ai jamais essayé ni l'un, ni l'autre, en général, c'est inutile puisque tu dessines l'image dans un logiciel de dessin vectoriel et tu enregistres en PDF.
  • Nebuchad34Nebuchad34 Membre
    22:07 modifié #3
    La deuxième méthode, qui sort du PDF, me semble toute indiquée.

    Je vais y jeter un oeil et je reviendrais donner mes résultats.

    Merci pour l'info.
  • MalaMala Membre, Modérateur
    22:07 modifié #4
    Je conseillerais plutôt de surcharger la méthode de la vue du bouton:
    <br />- (void)drawRect:(NSRect)dirtyRect<br />
    

    A partir de là , on fait ce qu'on veut avec des NSBezierPath et cie dans la frame.
  • CéroceCéroce Membre, Modérateur
    22:07 modifié #5
    Oui, mais tu dois alors dessiner à  l'échelle.

    ça dépend si le dessin du bouton change souvent ou pas. Effectivement, si ça change souvent, ta méthode étant moins lourde, elle est plus indiquée.
  • Nebuchad34Nebuchad34 Membre
    22:07 modifié #6
    Je travaille en fait sur la nouvelle version de Poker Manager, et je rends l'écran qui affiche toutes les infos proportionnel à  la taille de la fenêtre, et donc à  la résolution de l'écran en mode plein écran . Et ce afin que le rendu soit le même sur Cinema Display 30"  ou sur projo en 1024x768...

    D'où la nécessité d'avoir des boutons qui se redimmensionnent automatiquement en fonction de la taille de la fenêtre.

    L'idée de tout faire dans le drawRect du NSbutton me plait bien fait, c'est assez simple. Je vais regarder de ce coté là ...
  • Philippe49Philippe49 Membre
    22:07 modifié #7
    Une autre piste consiste à  mettre un bouton sur une autre view, en profitant du resizing automatique de chacune des deux views, avec un code minimal.
  • Nebuchad34Nebuchad34 Membre
    22:07 modifié #8
    Bien, alors j'ai décidé de dessiner mon bouton dans le drawRect de ce dernier.

    Le résultat me convient parfaitement, sauf que j'aimerai juste pouvoir modifier ma couleur de remplissage quand "on est en train de cliquer" sur le bouton, bref générer un remplissage alternatif comme les boutons acceptent uen image alternative.

    Mais je ne sais pas comment capter les évènements "bouton clické" et "bouton relaché"
  • Philippe49Philippe49 Membre
    22:07 modifié #9
    Redéfinir setState: pour changer la couleur selon ...
  • Nebuchad34Nebuchad34 Membre
    août 2009 modifié #10
    Oui, mais non. Le "State" change après qu'on est cliqué. Je veux changer la couleur, pendant qu'on clique. Je suis en train de regarder du coté de mouseDown:, mais y'a pas de mouseUp: ?

    Edit : OK !

    - (void)mouseDown:(NSEvent *)event
    {
    fillColor = [NSColor blueColor];
    [self setNeedsDisplay];

    [super mouseDown:event];
    [self mouseUp:event];
    }

    - (void)mouseUp:(NSEvent *)event
    {
    fillColor = [NSColor blackColor];
    [self setNeedsDisplay];
    }
  • Philippe49Philippe49 Membre
    22:07 modifié #11
    C'est bizarre que tu aies besoin d'appeler mouseUp: à  l'intérieur de mouseDown ?
  • Nebuchad34Nebuchad34 Membre
    22:07 modifié #12
    Oui, je trouve ça bizarre aussi, mais il se trouve que mon mouseUp est ainsi appelé uniquement quand je relache la souris...

    Je suis tombé la dessus sur Google..
  • Philippe49Philippe49 Membre
    22:07 modifié #13
    Pour le mouseDown/mouseUp j'ai le vague souvenir d'une discussion sur ce forum qui date d'au moins deux ans.

    Le setState quant à  lui n'est jamais appelé.
  • Philippe49Philippe49 Membre
    22:07 modifié #14
    La voilou, si cela peut t'aider.
  • Nebuchad34Nebuchad34 Membre
    22:07 modifié #15
    Je crois que j'ai là  une solution tout à  fait convenable :

    http://www.cocoatreeapplications.com/_videos/ajustementFenetre.mov

    Le plus gros reste à  faire pour cette v3, mais c'est déjà  un bon pas en avant..
  • MalaMala Membre, Modérateur
    22:07 modifié #16
    dans 1251768452:

    La grande nébuleuse d'Orion est un peu trop saturée à  mon goût.  ;)
Connectez-vous ou Inscrivez-vous pour répondre.