我期待让这将是这个样子(不去管快速的Photoshop)的自定义窗口:如何用非矩形按钮创建透明窗口?
alt text http://i35.tinypic.com/20ff803.png
主要的问题我已经是不使窗口透明(虽然我想任何信息是受欢迎的!),但我希望能够只点击按钮的可见部分。例如,如果我点击“5”按钮左上方的外部,即使点击了按钮5的边框,我希望它在“1”按钮上注册而不是“5”按钮。如果我点击“1”按钮的左上方“角落”的外侧,我希望它可以点击我窗口下方的任何内容,而不是按钮上的内容。我还需要能够调整这个窗口的大小,并且按钮中的图片应该与它们一起调整大小。
我想使用与含有的PNG用α为每个按钮透明NSButtons透明NSWindow的,但我认为重叠按钮将是一个问题。
我也听说过类似蝴蝶结,SweetFM并使用WebKit的施展接口的应用程序等。如果这是至少有可能的10.3,这将是有趣的,但我不知道如何也可以。
我环顾四周,点击面具,地区或类似的东西,但我还没有发现任何东西。我会更新这篇文章,因为我发现更多的信息(如果我做的!)。
对如何进行任何提示?
(请注意,我在10.4和理想我需要支持一些老版本的Mac OS X的太工作。)
(另外,我发现了“圆窗”例如苹果的开发。网站但它不会在10.4,所以我不知道这是要走的路提前跑了。)
谢谢!
UPDATE:
(见更新2,这个问题已经得到解决)
OK,现在我有一个稍微不同的(但不无关系)的问题。我所做的,到目前为止是这样的:
我选择了做,我就可以用我的每个按键的自定义控制:
1子类的NSControl并重写drawRect中,mouseUp事件,和的mouseDragged鼠标按下。通过这种方式,我可以在拖动按钮(移动窗口)时获得所需的行为。
2-将每个按钮的图像状态(相同的形状,但其中一个变暗)加载到NSImages中,并在必要时使用compositeToPoint:fromRect:operation:
将它们绘制到视图中。这些图像是185 X 185像素与从Photoshop出口阿尔法PNG文件。
3-获取NSImage中的位图表示:
NSBitmapImageRep *bitRep = [[NSBitmapImageRep imageRepWithData:[unpressedImage TIFFRepresentation]] retain];
OR
NSBitmapImageRep *bitRep = [[unpressedImage representations] objectAtIndex:0];
似乎都给予同样的结果。我试图将这个位图代表合成到我的窗口,看看图像是否与原始尺寸相同并且看起来不错(你会看到为什么我在枚举之后做了这件事......)。
4-在鼠标事件的方法,我用位图表示获取alpha分量的特定点:
NSPoint mouse = [self convertPoint:[theEvent locationInWindow] fromView:nil]; // Returns the correct x and y positions on the control (i.e: between 0 and 185 for each axis).
NSColor *colorUnderMouse = [[[unpressedImage representations] objectAtIndex:0] colorAtX:mouse.x y:mouse.y];
float alpha = [colorUnderMouse alphaComponent];
然后,我打印的Alpha值的控制台,但我得到很奇怪的结果。在鼠标下获取alpha组件和颜色看起来很乍看起来(返回的颜色和alpha位于我的位图中),但看起来颜色不是在bitRep
中的正确位置拍摄的, bitRep
失真(当我在窗口上合成bitRep
时,它不会失真,这很奇怪)。再一次,我仔细检查了x和y鼠标坐标在(0,185)范围内,NSBitmapImageRep
的大小也是185 x 185。
首先看起来NSBitmapImageRep
与我的NSImage
相比水平翻转。如果我翻转我的坐标,返回的值似乎大部分都是正确的(大部分形状似乎与返回的值相符),但仍有部分图像返回错误的值。
我在这一点上毫无头绪,从未与NSBitmapImageRep
一起工作过,也许我只是忘记指定一些关于我的图像的格式信息,这就是为什么值是关闭的。有人可以澄清这一点吗?再次
谢谢!
更新2:
好没关系,我发现这个问题。我使用setColor:atX:y:方法在打印到窗口之前在bitRep上绘制了一个彩色点,并且问题在白天清晰显示:在bitRep中Y坐标反转,但图像打印的是“good “定位。这意味着bitRep具有“Windows风格”的左上角原点坐标系,而窗口具有笛卡尔坐标系(左下)原点。简单地颠倒我的Y坐标可以解决我获得alpha分量和颜色的问题。
这一定是写在文档的某个地方,对不起,因为我缺乏研究而打扰你......!
谢谢,这将是该中心按钮的可能性,但与外面的按钮,会比较困难,需要一堆的边界检查代码...如果我改变什么我的按钮的位置由于某种原因?(这不是一个个人项目,所以这可能会有所改变,不幸的是)然后我不得不重写大部分的边界检查代码......有没有办法用某种掩码来做到这一点?说“让点击通过,如果位图透明在这一点上”? – Form 2009-10-06 20:40:47
我不认为你可以像你想的那样使用面具(透明度检测等)。这些都是非常基本的形状(内圈下方的外部按钮的部分圆圈)。您可以在代码中访问控件的当前坐标和尺寸,并使用它们来计算命中范围,以便不对任何东西进行硬编码。使用中心按钮位于最佳位置的事实。 – 2009-10-06 21:27:23
它可以使用透明度(alpha)检测,它工作得很好,虽然我现在使用的方法是10.4+,但有一种方法可以使用除colorAtX之外的其他方法来执行此操作:y:只要您有权访问就像mahboudz指出的那样。 – Form 2009-10-09 13:28:26