2 votes

Screeneur de veille cocoa hello world

J'ai étudié NSView et, en tant que tel, j'ai pensé que je donnerais un coup de main à un économiseur d'écran. J'ai pu afficher une image dans un NSView mais je n'arrive pas à modifier ce code d'exemple pour afficher une simple image dans ScreenSaverView.

http://www.mactech.com/articles/mactech/Vol.20/20.06/ScreenSaversInCocoa/

BTW super tutoriel qui fonctionne avec Snow Leopard.

Je pensais simplement afficher une image j'aurais besoin de quelque chose qui ressemblait à ceci...

Qu'est-ce que je fais de mal ?

//
//  try_screensaverView.m
//  essayer économiseur d'écran
//

#import "try_screensaverView.h"

@implementation try_screensaverView

- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
{
    self = [super initWithFrame:frame isPreview:isPreview];
    if (self) {
        [self setAnimationTimeInterval:1]; //rafraîchissement une fois par seconde
    }
    return self;
}

- (void)startAnimation
{
    [super startAnimation];

    NSString *path = [[NSBundle mainBundle] pathForResource:@"leaf" ofType:@"JPG" inDirectory:@""];
    image = [[NSImage alloc] initWithContentsOfFile:path];
}

- (void)stopAnimation
{
    [super stopAnimation];
}

- (void)drawRect:(NSRect)rect
{
    [super drawRect:rect];
}

- (void)animateOneFrame
{
    //////////////////////////////////////////////////////////
    //charger l'image et l'afficher Cela ne met pas à l'échelle l'image

    NSRect bounds = [self bounds];
    NSSize newSize;
    newSize.width = bounds.size.width;
    newSize.height = bounds.size.height;
    [image setSize:newSize];
    NSRect imageRect;
    imageRect.origin = NSZeroPoint;
    imageRect.size = [image size];
    NSRect drawingRect = imageRect;
    [image drawInRect:drawingRect fromRect:imageRect operation:NSCompositeSourceOver fraction:1];
}

- (BOOL)hasConfigureSheet
{
    return NO;
}

- (NSWindow*)configureSheet
{
    return nil;
}

@end

3voto

Peter Hosey Points 66275
NSRect bounds = [self bounds];
NSSize newSize;
newSize.width = bounds.size.width;
newSize.height = bounds.size.height;
[image setSize:newSize];

Je ne sais pas pourquoi tu fais ça.

NSRect imageRect;
imageRect.origin = NSZeroPoint;
imageRect.size = [image size];

A.k.a. [self bounds].size.

NSRect drawingRect = imageRect;
[image drawInRect:drawingRect fromRect:imageRect operation:NSCompositeSourceOver fraction:1];

c'est-à-dire, [image drawInRect:[self bounds] fromRect:[self bounds] operation:NSCompositeSourceOver fraction:1].

Si vous essayez de dessiner l'image à sa taille naturelle, il n'y a aucune raison de jamais lui envoyer un message setSize:. Supprimez toute cette première partie, et le reste devrait fonctionner très bien.

Si vous essayez de remplir l'écran (ce qui serait un redimensionnement, ce qui contredirait le commentaire), définissez drawingRect sur [self bounds], pas sur imageRect. Cela fonctionne exactement comme il est écrit :

image,
    dessiner dans (les limites de la vue),
    de (toute la zone de l'image).

[image
    drawInRect:[self bounds]
      fromRect:imageRect
              ⋮
];

Ni le dessin à taille naturelle et à position fixe, ni le dessin en plein écran ne constituent un économiseur d'écran efficace. Ce dernier est irrécupérable; vous pouvez rendre le premier utile en animant l'image autour de l'écran.

3voto

ndg Points 1016

J'ai rencontré un problème similaire, donc je vais poster ma solution. L'OP tentait de charger le contenu d'une image via NSBundle's mainBundle. Au lieu de cela, vous aurez plus de chance en chargeant le bundle de l'économiseur d'écran et en chargeant les fichiers à partir de là, comme ceci:

NSBundle *saverBundle = [NSBundle bundleForClass:[self class]];
NSImage *image = [[NSImage alloc] initWithContentsOfFile:[saverBundle pathForResource:@"image" ofType:@"png"]];

0voto

Logachu Points 365

Comme vous effectuez votre dessin dans animateOneFrame, essayez de supprimer votre drawRect surchargé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X