Redessiner un NSSlider et un NSPopUpButton
Herve
Membre
Bonjour,
J'ai besoin d'updater NSSlider et NSPopUpButton.
J'ai un problème avec les NSSlider : quand on les utilise, le trait s'efface durant l'utilisation. Il ne se redessine complètement que lorsqu'on relâche la souris. Ce n'est pas dramatique mais ce serait mieux sans ce défaut...
Voici mon code :
Cela fait un bouton comme ceux de cette page :
http://www.hervenoury.com/VueKey4fev.tiff
Concernant les popUp, je n'ai pu faire mieux que de redessiner le cadre (le NSCell en fait) et mettre une couleur avec un faible alpha par dessus pour la couleur.
Sauriez vous comment sous-classer (ou dériver) vraiment NSSlider et NSPopUpButton s'il vous plaà®t? Merci par avance...
J'ai besoin d'updater NSSlider et NSPopUpButton.
J'ai un problème avec les NSSlider : quand on les utilise, le trait s'efface durant l'utilisation. Il ne se redessine complètement que lorsqu'on relâche la souris. Ce n'est pas dramatique mais ce serait mieux sans ce défaut...
Voici mon code :
<br />
- (void)drawRect:(NSRect)cellFrame<br />
{<br />
NSRect cell = [self bounds];<br />
float hauteur = (cell.size.height - 18);<br />
<br />
float coef = [self floatValue]/[self maxValue];<br />
float med = cellFrame.size.width/2.0;<br />
[[ NSColor colorWithCalibratedHue:0.125 saturation:0.87 brightness:0.42 alpha:1.0]set];//Or brun<br />
<br />
[NSBezierPath setDefaultLineWidth:2.0];<br />
[NSBezierPath strokeLineFromPoint:NSMakePoint(med, 0.0) toPoint:NSMakePoint(med, cellFrame.size.height)];<br />
<br />
NSImage *fondBouton= [NSImage alloc];<br />
[fondBouton initWithContentsOfURL: [NSURL fileURLWithPath:<br />
[[NSBundle mainBundle] pathForResource: @"FondBoutonOr" ofType: @"tiff"]]];<br />
[NSGraphicsContext saveGraphicsState];<br />
NSBezierPath *bouton = [NSBezierPath bezierPathWithOvalInRect:NSMakeRect(2.5, (((1.0 - coef) * hauteur) + 1), 16, 16)];<br />
[bouton addClip];<br />
[fondBouton drawInRect:NSMakeRect(2.5, (((1.0 - coef) * hauteur) + 1), 16, 16) fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];<br />
[NSGraphicsContext restoreGraphicsState];<br />
[bouton stroke];<br />
}<br />
Cela fait un bouton comme ceux de cette page :
http://www.hervenoury.com/VueKey4fev.tiff
Concernant les popUp, je n'ai pu faire mieux que de redessiner le cadre (le NSCell en fait) et mettre une couleur avec un faible alpha par dessus pour la couleur.
Sauriez vous comment sous-classer (ou dériver) vraiment NSSlider et NSPopUpButton s'il vous plaà®t? Merci par avance...
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Pour le dessin ça se passe dans les méthodes suivantes:
Drawing and Highlighting
Pour la NSSliderCell regarde du coté de - (void)drawKnob:(NSRect)knobRect et - (void)drawBarInside:(NSRect)rect flipped:(BOOL)flipped /wink.png' class='bbc_emoticon' alt=';)' />
Sauriez-vous comment changer la couleur du texte d'un bouton s'il vous plaà®t?
En ce qui concerne les sliders, j'ai employé dans le "drawRect" du NSSlider les méthodes :
le bouton ne s'affiche qu'une fois le slider manipulé. Au démarrage, il ne s'affiche pas.
ne marche pas. Jamais le trait ne s'affiche.
Tes méthodes, Jeremy1729 sont les bonnes, mais je les emploie manifestement mal.
Question toute bête, comment relit-on une classe dérivée de NSCell à un contrôleur? La méthode "setCellClass" sans doute?
Merci encore pour vos réponses, j'avance, je progresse!
Pour lier la cell au slider, tu peux mettre dans ta sous classe de NSSlider le code suivant. Les méthodes setCell: ou setCellClass marchent aussi.
En re-écrivant les méthodes dites plus haut, ça devrait aller.
Infâme bricolage !
En théorie, implémenter les méthodes :
- (void)drawKnob:(NSRect)knobRect
- (void)drawBarInside:(NSRect)aRect flipped:(BOOL)flipped
devrait suffire ...
Seulement voila, drawBarInside: n'est jamais appelée !!!
Donc il faut passer par drawWithFrame:
http://lists.apple.c...n/msg00762.html
Utiliser un attributed string:
http://www.cocoabuil...tton.html#56068
On peut spécifier un custom cell dans IB, il faut double-cliquer sur le button et choisir la classe dans l'onglet info (pour xcode 3, pour le 4 je ne sais pas si la procédure est la même))
Oui, j'avoue mpergand, j'ai "infâmement bricolé". C'était pour voir... Pardon! /rolleyes.gif' class='bbc_emoticon' alt='::)' />
Bon, je m'y remets demain. Merci à tous.
Merci à tous.