Un objet qui dessine

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.

Réponses

  • CeetixCeetix Membre
    février 2012 modifié #2
    Ce n'est pas ton objet qui dessine mais bien la vue dans laquelle tu le déclares (donc drawRect). Mais ton objet il contient des informations que tu peux getter non ? Genre coordonné, taille, couleur, .... Dans ton drawRect tu peux t'en servir.
  • CéroceCéroce Membre, Modérateur
    Non, ce n'est pas un comble, ça s'explique très bien: il faut savoir dessiner.



    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]
  • 'Céroce' a écrit:


    Non, ce n'est pas un comble, ça s'explique très bien: il faut savoir dessiner.



    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?
  • 'Ceetix' a écrit:


    Ce n'est pas ton objet qui dessine mais bien la vue dans laquelle tu le déclares (donc drawRect). Mais ton objet il contient des informations que tu peux getter non ? Genre coordonné, taille, couleur, .... Dans ton drawRect tu peux t'en servir.




    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 image/thumbsup.gif' class='bbc_emoticon' alt='' />

    Mais ça m'a toujours paru un peu étrange, pas vraiment "orienté objet"
  • CéroceCéroce Membre, Modérateur
    'Rocou' a écrit:


    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?


    Non, pourquoi faudrait-il ?

    Tant que l'objet Rectangle est en mémoire, on peut le réutiliser à  l'envi.
  • RocouRocou Membre
    février 2012 modifié #7
    'Céroce' a écrit:


    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.
  • CéroceCéroce Membre, Modérateur
    'Rocou' a écrit:


    (je ne sais pas encore pourquoi mais initWithFrame n'est jamais appelée).




    -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.
Connectez-vous ou Inscrivez-vous pour répondre.