2010-07-07 6 views
1

Je suis nouveau dans le monde Mac et je vois un comportement qui me laisse perplexe. Je travaille sur un utilitaire de base en plein écran qui va capturer l'affichage principal du Mac et afficher du texte. Le problème que j'ai est que si je capture l'affichage plusieurs fois, après la première fois que le texte que j'écris le contextRef commence à se dégrader au début de la ligne chaque fois qu'il est écrit. La première fois, il se peut que le remplissage ne soit pas dessiné dans la première lettre, après que des sections entières du texte au début de la ligne disparaissent. Le code que je utilise est comme suit:Texte tiré vers CGContextRef Pas toujours complet

CGDisplayCapture(kCGDirectMainDisplay); 
CGDirectDisplayID display = kCGDirectMainDisplay; 
CGContextRef ctx = CGDisplayGetDrawingContext (display); 

CGContextSelectFont (ctx, "Times-Roman", 48, kCGEncodingMacRoman); 
CGContextSetTextDrawingMode (ctx, kCGTextFillStroke); 
CGContextSetRGBFillColor (ctx, 1, 1, 1, 0.75); 
CGContextSetRGBStrokeColor (ctx, 1, 1, 1, 0.75); 
CGContextShowTextAtPoint (ctx, 400, 400, text, strlen(text)); 

J'ai trouvé que si je mets un « [NSThread sleepForTimeInterval: 0,25] » avant le CGContextShowTextAtPoint que le texte affiche toujours correctement, mais c'est ce que je considère une pirater.

Ma question pour ceux qui sont plus intelligents que moi est, qu'est-ce qui cause le problème et y a-t-il quelque chose de différent que je devrais faire pour essayer de le résoudre?

TIA,

JT

+0

où est ce code? tamponnez-vous les graphiques? –

Répondre

1

Pour une application en mode plein écran de base, ne pas obtenir le CGDisplay et associé CGContextRef et dessiner directement sur elle. Je suppose que vous dessinez au contexte sans être averti par le système de le faire. Ce n'est pas ce que vous êtes censé faire.

Sauf nécessité absolue, créez une grande vue couvrant l'ensemble de l'écran (c'est-à-dire en conservant les fenêtres des autres applications) et dessinez-la comme vous le feriez normalement. C'est à dire. N'obtenez jamais le contexte manuellement et écrivez-le activement. Plutôt, implémentez une sous-classe de NSView, implémentez drawRect et exécutez le dessin à l'intérieur. Enfin, utilisez enterFullScreenMode:withOptions: pour afficher en plein écran.

+0

Une partie de l'exigence des projets est que pendant le peu de temps le texte est affiché que l'utilisateur ne peut rien faire d'autre. C'est pourquoi je capture l'écran. Si ce n'était pas une exigence, je ferais comme vous le suggérez. J'ai testé en utilisant un NSGraphicsContext et NSString drawAtPoint. Cela m'a également permis d'écrire le texte mais il a également montré le même problème lors du dessin plusieurs fois de suite. Puis-je ajouter un NSView au NSGraphicsContext, puis dessiner le texte à cela? –

+0

Même avec cette exigence, ce que vous devez faire est de créer un 'NSView' qui a un fond transparent éventuel couvrant tout l'affichage, de sorte qu'il capture chaque événement. 'enterFullScreenMode: withOptions' fait cela. Ce n'est pas que vous dessinez au contexte à n'importe quelle heure que vous souhaitez; à la place, le système appelle votre -drawRect à chaque fois que le système se sent bien. Si vous dessinez au contexte en dehors de cela, quelque chose de mal arrive. – Yuji

+0

Merci Yuji, je vais essayer et voir comment ça fonctionne et vous le faire savoir. –

Questions connexes