首页 > 解决方案 > 如何创建带有 alpha 掩码的自定义 NSCursor?

问题描述

NSCursor当我在alpha 通道中创建自定义时,Objective-C蒙版出现XOR在下面的屏幕上。我期望 alpha 通道值为零是透明的,而不是XOR下面的图形。我确定我的掩码数据在透明和不透明的ARGB地方是正确的。我究竟做错了什么?A=0A=255

static void maincustomcursor(bigmap *thedata, point hotspot)
{
    NSPoint thepoint;
    NSImage *newimage;
    NSCursor *thecursor;
    CGImageRef theimage;
    CGBitmapInfo theinfo;
    CGContextRef thecont;
    CGColorSpaceRef thecolor;
    int width, height, across;

    width = (*thedata).width;
    height = (*thedata).height;
    if (width != smalliconsize || height != smalliconsize) return;
    if (hotspot.h < 0) hotspot.h = 0;
    if (hotspot.h >= smalliconsize) hotspot.h = smalliconsize - 1;
    if (hotspot.v < 0) hotspot.v = 0;
    if (hotspot.v >= smalliconsize) hotspot.v = smalliconsize - 1;
    thepoint = NSMakePoint(hotspot.h, hotspot.v);
    across = (*thedata).rowbytes;
    thecolor = CGColorSpaceCreateDeviceRGB();
    theinfo = (CGBitmapInfo)kCGImageAlphaPremultipliedFirst;
    thecont = CGBitmapContextCreate((*thedata).baseaddr, width, height, 8, across, thecolor, theinfo);
    theimage = CGBitmapContextCreateImage(thecont);
    newimage = [[NSImage alloc] initWithCGImage:theimage size:NSZeroSize];
    thecursor = [[NSCursor alloc] initWithImage:newimage hotSpot:thepoint];
    [thecursor set];
    [thecursor release];
    [newimage release];
    CGImageRelease(theimage);
    CGContextRelease(thecont);
    CGColorSpaceRelease(thecolor);
}

标签: nscursor

解决方案


好的,我想通了。当 alpha 通道 = 0 时,您需要确保红色、绿色和蓝色也为零。如果 alpha 通道为零并且红色、绿色和蓝色为 255,那么我看到的是像素的异或。这可能与实现游标的古老方式有关,根据位掩码使用 clear、white、black 和 xor。


推荐阅读