objective-c - 在 Cocoa/OSX 中覆盖鼠标图像

标签 objective-c cocoa cursor cursor-position nsevent

我需要捕获帧缓冲区并将其保存到文件中,
我正在使用son of grab捕获缓冲区的示例代码,但它没有给我鼠标指针,

所以我自己绘制鼠标指针,请引用下面的代码片段,一切正常,除了光标没有绘制在正确的位置,x & y坐标略有偏差,形成Cocoa框架,我正在获取鼠标指针位置,似乎我应该获取鼠标光标边界,因此我可以使用相同的矩形来绘制光标,
知道如何使用Mousse位置指针在正确的位置绘制鼠标图像吗?

-(CGImageRef)appendMouseCursor:(CGImageRef)pSourceImage{
    // 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-w/2;
    int org_y = y-h/2;

    size_t height = CGImageGetHeight(pSourceImage);
    size_t width =  CGImageGetWidth(pSourceImage);
    int bytesPerRow = CGImageGetBytesPerRow(pSourceImage);

    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(pSourceImage), 
                                                  CGImageGetBitmapInfo(pSourceImage));

    // first draw the image 
    CGContextDrawImage(context,bgBoundingBox,pSourceImage);

    // then mouse cursor 
    CGContextDrawImage(context,CGRectMake(0, 0, width,height),pSourceImage);

    // 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 */
}  

一切正常,除了鼠标位置与

略有偏差

最佳答案

您需要考虑鼠标光标的热点,即光标中的“事件点”像素。您可以从 NSCursor-hotspot 方法获取此信息,该方法返回相对于光标坐标系左下角的 NSPoint

所以你的代码可能应该是这样的:

NSPoint offset = [[NSCursor arrowCursor] hotSpot];

int org_x = (x - w/2) - offset.x;
int org_y = (y - h/2) - offset.y;

关于objective-c - 在 Cocoa/OSX 中覆盖鼠标图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8083789/

相关文章:

ios - 核心数据关系映射 : Double Quotes in Value Expression are automatically turned into single quotes

ios - swift 中的 Pragma 标记

使用 C 或 Perl(非 Objective-C)创建 Cocoa 应用程序

objective-c - 自定义形状的 NSTrackingArea

ios - Swift - 无法在 UITextField 中从用户自定义光标位置

objective-c - 得到 PN 但是申请 :application didReceiveRemoteNotification: not triggered when app icon is selected

iphone - 如何从 Cocoa Touch 填写可填写的 PDF?

macos - Mac 应用程序崩溃时,CrashReporter 对话框不显示

java - 从 Cursor 创建一个数组

html - 单击更改光标以获得带有 css 的图像映射链接