cocoa 自定义 View,如何擦除背景一小块,露出下面的内容?

2014-12-02 21:57:01 +08:00
 bitweaver
我写的是osx桌面程序。
我试过两个方法
1、[[NSGraphicsContext currentContext] setCompositingOperation:NSCompositeDestinationOut];
[NSBezierPath fillRect:win];
2、或者NSRectFillUsingOperation(win, NSCompositeDestinationOut);
还有Copy,Clear等Composite属性都试过了,擦完以后只剩一块黑色背景,而不是我期望的透明背景。
后面我还尝试在画矩形前设置一下颜色
[[NSColor clearColor] set];
同样是黑色。
2670 次点击
所在节点    问与答
6 条回复
ashong
2014-12-03 00:55:50 +08:00
setClip
WildCat
2014-12-03 07:08:13 +08:00
@ashong 正解!
bitweaver
2014-12-03 08:15:41 +08:00
@ashong 你的意思是让我在填充背景的时候设置裁剪区域,把需要擦除的地方空出来吗?还是其他什么方法,能详细说明一下吗?
ashong
2014-12-03 16:41:37 +08:00
@bitweaver
[[NSBezierPath bezierPathWithRect:NSMakeRect(x,y,w,h)] setClip];

or

[NSBezierPath clipRect:NSMakeRect(x,y,w,h)];
ashong
2014-12-03 16:54:09 +08:00
上面是设置rect为剪裁区域, 你的需求时掏洞, 应该是这样的

NSBezierPath* path = [NSBezierPath bezierPathWithRect: outerRect];
[path appendBezierPathWithRect: innerRect];

[path setWindingRule: NSEvenOddWindingRule];
[path setClip];
bitweaver
2014-12-03 17:10:31 +08:00
@ashong 你的代码解释地很清楚,多谢耐心指教。但是这种填充的方案并不是我的首选方案。如果你看了一下stackoverflow上的问题描述,其实我不光想擦除大方框内的背景,四个控制点的背景我也想擦掉。如果写path,还是比较麻烦的。同时我也做了一个实验,在位图上作画,结果和在屏幕上是不一样的,NSCompositeClear是可以擦掉source轮廓内所有内容的。好像问题有了一些转机。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/151063

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX