Un objet qui dessine
Rocou
Membre
Bonjour,
Ma question va vous paraitre étrange mais je ne sais toujours pas comment faire pour qu'un objet dessine dans une vue.
Soit une classe rectangle qui contient une méthode "dessiner".
On alloue l'objet et on initialise ses variable (les coordonnées et dimensions du rectangle).
Puis on appelle la méthode "dessiner" de l'objet.
Bon mais comment faire pour dessiner ce rectangle dans la vue de son choix?
Jusqu'à présent j'ai rusé mais j'aimerais bien savoir comment faire ça dans les règles.
Tous les tutos que j'ai lus montrent comment dessiner dans une vue mais toujours en passant par la méthode drawRect de la vue. Jamais en utilisant un objet, ce qui est un comble, je trouve.
Ma question va vous paraitre étrange mais je ne sais toujours pas comment faire pour qu'un objet dessine dans une vue.
Soit une classe rectangle qui contient une méthode "dessiner".
On alloue l'objet et on initialise ses variable (les coordonnées et dimensions du rectangle).
Puis on appelle la méthode "dessiner" de l'objet.
Bon mais comment faire pour dessiner ce rectangle dans la vue de son choix?
Jusqu'à présent j'ai rusé mais j'aimerais bien savoir comment faire ça dans les règles.
Tous les tutos que j'ai lus montrent comment dessiner dans une vue mais toujours en passant par la méthode drawRect de la vue. Jamais en utilisant un objet, ce qui est un comble, je trouve.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Quand on utilise Quartz, tous les appels de fonctions prennent un CGContextRef en paramètre: il faut systématiquement préciser où dessiner.
Tu remarqueras que les objets Cocoa capables de se dessiner (NSBezierPath et NSImage) n'exigent pas de préciser où. C'est parce qu'il existe une notion de contexte graphique courant, que tu peux obtenir par +[NSGraphicsContext currentContext].
Pour obtenir le CGContextRef correspondant, utilise -[NSGraphicsContext graphicsPort].
Quand -[NSView drawRect:] est appelée, on est sûr que le contexte graphique correspond à la vue, et on peut donc y dessiner.
Pour répondre à ta questions, voici les possibilités auxquelles je pense:
- appeler une méthode -[draw] de l'objet Rectangle dans -[drawRect]:
- l'objet Rectangle a une méthode -[bezierPath]
Merci pour les précisions. Cependant en procédant de cette façon, à chaque appel de drawRect il faut allouer un objet rectangle et initialiser ses variables? C'est pas un peu lourdingue?
Oui, Ceetix, c'ets la "ruse" que j'ai toujours employée. "Ruse" que je t'ai d'ailleurs piquée dans un bout de code que tu avais posté il y a fort longtemps /thumbsup.gif' class='bbc_emoticon' alt='' />
Mais ça m'a toujours paru un peu étrange, pas vraiment "orienté objet"
Non, pourquoi faudrait-il ?
Tant que l'objet Rectangle est en mémoire, on peut le réutiliser à l'envi.
Ha ok, c'est mon allocation qui était mal placé (je ne sais pas encore pourquoi mais initWithFrame n'est jamais appelée).
Merci pour les explications, c'est très clair.
-initWithFrame: est certes l'initialiseur désigné, mais c'est initWithCoder: qui sera appelée si la NSView est désérialisée depuis un fichier nib.