Наложение курсора, Mac Objective-C - PullRequest
0 голосов
/ 10 января 2012

Хорошо, я пытаюсь сделать так, чтобы, когда мое приложение открывалось, курсор менялся, но чтобы изменить его, я накладываю наложение изображения. Вот код, который у меня есть ...

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
        // get the cursor image 
        NSPoint mouseLoc; 
        mouseLoc = [NSEvent mouseLocation]; //get cur

        NSLog(@"Mouse location is x=%d,y=%d",(int)mouseLoc.x,(int)mouseLoc.y);

        // get the mouse image 
        NSImage *overlay    =   [[[NSCursor arrowCursor] image] copy];

        NSLog(@"Mouse location is x=%d,y=%d cursor width = %d, cursor height = %d",(int)mouseLoc.x,(int)mouseLoc.y,(int)[overlay size].width,(int)[overlay size].height);

        int x = (int)mouseLoc.x;
        int y = (int)mouseLoc.y;
        int w = (int)[overlay size].width;
        int h = (int)[overlay size].height;
        int org_x = x;
        int org_y = y;

        size_t height = CGImageGetHeight([NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"arrow" ofType:@"png"]]);
        size_t width =  CGImageGetWidth([NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"arrow" ofType:@"png"]]);
        int bytesPerRow = CGImageGetBytesPerRow([NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"arrow" ofType:@"png"]]);

        unsigned int * imgData = (unsigned int*)malloc(height*bytesPerRow);

        // have the graphics context now, 
        CGRect bgBoundingBox = CGRectMake (0, 0, width,height);

        CGContextRef context =  CGBitmapContextCreate(imgData, width, 
                                                      height, 
                                                      8, // 8 bits per component 
                                                      bytesPerRow, 
                                                      CGImageGetColorSpace([NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"arrow" ofType:@"png"]]), 
                                                      CGImageGetBitmapInfo([NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"arrow" ofType:@"png"]]));

        // first draw the image 
        CGContextDrawImage(context,bgBoundingBox,[NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"arrow" ofType:@"png"]]);

        // then mouse cursor 
        CGContextDrawImage(context,CGRectMake(0, 0, width,height),[NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"arrow" ofType:@"png"]]);

        // then mouse cursor 
        CGContextDrawImage(context,CGRectMake(org_x, org_y, w,h),[overlay CGImageForProposedRect: NULL context: NULL hints: NULL] );


        // assuming both the image has been drawn then create an Image Ref for that 

        CGImageRef pFinalImage = CGBitmapContextCreateImage(context);

        CGContextRelease(context);

        return pFinalImage; /* to be released by the caller */
    }

Итак, я попробовал это, и он компилирует предупреждения относительно пути URL, но не содержит ошибок. Но когда я открываю приложение, оно вылетает! Так кто-нибудь может мне помочь?

Ответы [ 2 ]

1 голос
/ 10 января 2012

Если вы хотите изменить курсор, почему вы просто не создаете новый экземпляр NSCursor с тем изображением, которое хотите показать?

0 голосов
/ 10 января 2012

Вы берете NSURL* и передаете его функциям, которые принимают CGImageRef.Это даже близко не имеет смысла, поэтому я не знаю, почему вы не получили ошибок.Чтобы загрузить CGImage из URL-адреса, вам нужно использовать функции CGImageSource, такие как CGImageSourceCreateWithURL.

PS, вместо того, чтобы просто сказать, что он падает, запустить его под отладчиком и выяснить, где именно он падает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...