2013-02-17 1 views
0

Я хотел нарисовать фигуру, над ней я хотел нарисовать меньшую прозрачную форму.Настройка режима композитного рисования, вызывающего черные дыры/патчи на NSWindow

-(void) drawRect:(NSRect)dirtyRect 
{ 
    //clear everything 
    { 
     [[NSColor whiteColor] set]; 
     [[NSBezierPath bezierPathWithRect:dirtyRect] fill]; 
    } 


    NSBezierPath *thePath = [NSBezierPath bezierPathWithOvalInRect: self.bounds]; 
    [thePath setLineWidth: 30]; 
    [[NSColor blueColor] set]; 
    [thePath stroke]; 

    [[NSGraphicsContext currentContext] setCompositingOperation: NSCompositeCopy]; 
    [[NSColor clearColor] set]; 
    [thePath setLineWidth: 4]; 
    [thePath stroke]; 
} 

As a result of above program I'm getting the Blue Oval and a black Oval at the center of blue Oval.

Я также пробовал с NSImage Форст, а затем на виду, но по-прежнему получать тот же результат.

-(void) drawRect:(NSRect)dirtyRect 
{ 
    //clear everything 
    { 
     [[NSColor whiteColor] set]; 
     [[NSBezierPath bezierPathWithRect:dirtyRect] fill]; 
    } 


    NSImage* image = [[NSImage alloc] initWithSize:self.frame.size]; 

    [image lockFocus]; 

    //clear everything 
    { 
     [[NSColor whiteColor] set]; 
     [[NSBezierPath bezierPathWithRect:dirtyRect] fill]; 
    } 

    NSBezierPath *thePath = [NSBezierPath bezierPathWithOvalInRect: self.bounds]; 
    [thePath setLineWidth: 30]; 
    [[NSColor blueColor] set]; 
    [thePath stroke]; 

    [[NSGraphicsContext currentContext] setCompositingOperation: NSCompositeCopy]; 
    [[NSColor clearColor] set]; 
    [thePath setLineWidth: 4]; 
    [thePath stroke]; 

    [image unlockFocus]; 

    [image drawInRect:self.frame fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0]; 
} 

ответ

2

Оваль появляется черным, потому что по умолчанию непрозрачные окна. Вы успешно обрезали овальную дорожку в своем окне, но поскольку окно непрозрачно, без промышленного лазера, чтобы обрезать один и тот же овал на вашем мониторе, ваш Mac должен показать вместо этого цвет. Цвет, который он показывает, это цвет clearColor: черный.

Решение состоит в том, чтобы установить opaque на NO.

По умолчанию YES, что приятно и эффективно, но (ну, собственно, , потому что) это предотвращает показ содержимого других окон. Установка его на NO позволит вам увидеть, что находится за окном через тонкую овальную дорожку. (Это будет работать лучше, если вы заполните овал, давая себе окно большего размера в ... э-э ... окно.)

This is how it looks with the window's opaque turned off.

(Почему это выглядит трек наполнен серый? Это функция окна тень, которую вы видите там. Когда вы попробуете это по-настоящему, вы сможете увидеть другие окна в своей системе через дорожку при перемещении окна вокруг.)

+0

Спасибо за превосходное объяснение. Просто хотел знать, есть ли способ рисовать прозрачную форму по сплошной форме, и результат не должен отображать тени окна или черные дыры. – Omkar

+0

@Omkar: «прозрачный» и «не следует отображать тени окна» не согласуются, поскольку прозрачность позволяет вам увидеть, что находится за окном, а тень за окном. Вы можете отключить тень окна, но тогда он также не будет виден вокруг окна. –

Смежные вопросы