Forcer le réaffichage

molgow

Membre expert
Club iGen
4 Janvier 2002
5 496
613
42
Suisse
Bonjour,

Comment puis-je forcer le réaffichage d'un NSView ?

J'y dessine plusieurs images successivement dans le même NSView. En fait, c'est un jeu avec un tableau de M x N cases (je n'ai pas utilisé de NSArray à la place de l'unique NSView, je n'y suis pas arrivé ;-), chaque fois il n'affiche pas mes modifications tout de suite (je dois, par exemple, miniaturisé et réagrandir la fenêtre pour voir la modification). J'aimerais donc, qu'il m'affiche mes modifs tout de suite!

Lorsque je dessine mes MxN images, est-ce juste de faire un [self lockFocus] et [self unlockFocus] pour chaque image ?

Et pour conclure, que veut dire cette erreur ? (une explication svp... j'ai déjà un dico et mon cerveau pour traduire!)

<pre><font class="small">code:</font><hr> 2002-07-23 17:59:23.405 myProject[966] *** Assertion failure in -[myView lockFocus], NSView.m:2084
2002-07-23 17:59:23.408 myProject[966] lockFocus sent to a view whose window is deferred and does not yet have a corresponding platform window </pre><hr>

Ma question n'est pas très clair, j'espère qu'on pourra tout de même m'aider. (je désespère... j'ai l'impression que mes instructions Cocoa ne font jamais ce que j'aimerais ! exemple, je fais un [myView display], je me dis que ça pourrait peut-être réafficher mon NSView subclassé, ben non. rien.)

molgow

PS : je précise que j'utilise un NSView subclassé, la fonction drawRect y est implementée.
 
Comment puis-je forcer le réaffichage d'un NSView ?

[myView setNeedsDisplay:YES];

Va faire un tour sur ton disque dur vers la doc cocoa de nsview
NSView

Lorsque je dessine mes MxN images, est-ce juste de faire un [self lockFocus] et [self unlockFocus] pour chaque image ?

Le lock focus permet de spécifier à quel endroit il faut dessiner. Si tu veux qu'un NSBezier fasse un stroke dans une window, tu fais [self lockfocus] et apres ton stroke. En général ca se fait dans la methode display de ta NSView

Pour ton erreur je ne sais pas trop.
[deffered] determines whether the Window Server creates a window device for the new object immediately. If flag is YES, it defers creating the window until the receiver is moved on screen. All display messages sent to the NSWindow or its NSViews are postponed until the window is created, just before it's moved on screen. Deferring the creation of the window improves launch time and minimizes the virtual memory load on the Window Server.
En gros décoche deferred dans les prop de ta window dans IB, ou rend ta fenetre visible.
 
<pre><font class="small">code:</font><hr>[myView setNeedsDisplay:YES];</pre><hr>

J'ai déjà essayé ça. Mais ça ne fonctionne pas. Quelle méthode dois-je implémenté pour mon NSView subclassé ? J'ai implémenté drawRect, et puis aussi display, mais ça n'y change rien. /ubbthreads/http://forums.macg.co/vbulletin/images/smiliesold/confused.gif


</font><blockquote><font class="small">Citer:</font><hr />
Le lock focus permet de spécifier à quel endroit il faut dessiner. Si tu veux qu'un NSBezier fasse un stroke dans une window, tu fais [self lockfocus] et apres ton stroke. En général ca se fait dans la methode display de ta NSView
<hr /></blockquote>

Là je n'y comprends rien. Je viens de tester, je fais un :

<pre><font class="small">code:</font><hr>[pict compositeToPoint:NSMakePoint(0.0, 0.0) operation:NSCompositeSourceOver];</pre><hr>

et sans aucun [self lockfocus] et [self unlockFocus], et ça a l'air de dessiner tout de même dans ma view (c'est juste que ma view n'est pas updatée immédiatement!)

</font><blockquote><font class="small">Citer:</font><hr />
En gros décoche deferred dans les prop de ta window dans IB, ou rend ta fenetre visible.<hr /></blockquote>

J'ai décoché deferred dans IB, ma fenêtre est toujours visible (visible at launch time), et le problème survient encore. Je précise que j'y dessine après l'action d'un menu, donc après que l'application soit lancée, et que la fenêtre soit affichée.

---

Pour plus de précisions sur ce que je fais (peut-être que l'erreur vient de là?) :
à la sélection d'un certain menu (Start), je dessine, le "fond" de ma zone de jeu (une image), ensuite, je dessine par dessus 9 petites images dans cette même view, toutes à des endroits différents. Et à chaque dessin d'une image, je fais un lockFocus, et unlockFocus. Je précise encore que mes procédures qui dessine une petite image, et un fond de jeu, se trouvent dans mon NSView subclassé. J'appelle ces procédures depuis un Controller qui "dirige" le jeu. Je sais pas si c'est clair....