光标覆盖,Mac物镜-c

时间:2012-01-10 02:42:33

标签: objective-c macos cursor

好吧所以我试着这样做,这样当我的应用程序打开时,光标会改变,但要改变它,我会放置一个图像叠加层。所以这是我的代码......

- (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 个答案:

答案 0 :(得分:1)

如果你想更改光标,为什么不用你想要显示的任何图像创建NSCursor的新实例?

答案 1 :(得分:0)

您正在使用NSURL*并将其传递给采用CGImageRef的函数。这甚至没有意义,所以我不知道为什么你没有得到错误。要从URL加载CGImage,您需要使用像CGImageSourceCreateWithURL这样的CGImageSource函数。

P.S。,而不是仅仅说它崩溃,在调试器下运行它,并找出它崩溃的确切位置。