[Résolu] Problème de tracé

novembre 2007 modifié dans API AppKit #1
Bonjour,

Je n'ai jamais été fortiche dans les NSView.. mais bon j'ai fait un système d'affichage de notes.
Cependant, j'ai un problème, lorsque je dessine mes "étoiles" pour la note, des fois les étoiles sont tracées n'importe où dans la fenêtre (voir image).

Voici mon code de ma sous-classe NSView :
<br />- (id)initWithFrame:(NSRect)frameRect<br />{<br />	if ((self = [super initWithFrame:frameRect]) != nil) {<br />		stars=0;<br />	}<br />	return self;<br />}<br /><br />- (void)drawRect:(NSRect)cellFrame<br />{<br />	NSImage* star = [NSImage imageNamed:@&quot;star&quot;];<br />	NSSize starSize = [star size];<br />	NSImage* noStar = [NSImage imageNamed:@&quot;noStar&quot;];<br />	int i;<br /><br />	for (i = cellFrame.origin.x; i &lt; starSize.width*stars; i += starSize.width) <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [star drawInRect:NSMakeRect(i, cellFrame.origin.y, starSize.width, cellFrame.size.height)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fromRect:NSMakeRect(0, 0, starSize.width, starSize.height)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;operation:NSCompositeSourceOver<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fraction:1.0];<br />	<br />	for (i = starSize.width*stars; i &lt; starSize.width*5; i += starSize.width) <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [noStar drawInRect:NSMakeRect(i, cellFrame.origin.y, starSize.width, cellFrame.size.height)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fromRect:NSMakeRect(0, 0, starSize.width, starSize.height)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;operation:NSCompositeSourceOver<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fraction:1.0];<br />}<br /><br />- (void)displayForStars:(int)starsNum<br />{<br />	stars = starsNum;<br />	[self drawRect:[self frame]];<br />}<br />


Remarquez qu'une étoile s'est dessiné en "flipped" juste en dessous de "Abiword"

Edit : Bon ben j'ai trouvé, j'ai retiré le [self drawRect:[self frame]]; et à  la place je fais un [ratingView setNeedsDisplay:YES] une fois que j'ai envoyé la note.

Faudra vraiment m'éclaircir sur le rafraà®chissement des vues :/

Réponses

  • schlumschlum Membre
    18:49 modifié #2
    Ne jamais utiliser "drawRect" directement !
    Question de contexte graphique...
    Tu peux, mais dans ce cas, il faut un "lockFocus" avant, et un "unlockFocus" après.
    Sinon, ton étoile sera dessinée dans le contexte en cours, soit en général pas là  où tu veux  :P
Connectez-vous ou Inscrivez-vous pour répondre.