当前位置:  开发笔记 > 前端 > 正文

如何使用非矩形按钮创建透明窗口?

如何解决《如何使用非矩形按钮创建透明窗口?》经验,为你挑选了0个好方法。

我想制作一个看起来像这样的自定义窗口(不要介意快速的Photoshop):

alt text http://i35.tinypic.com/20ff803.png

我的主要问题是不要让窗口透明(虽然我猜任何信息都是受欢迎的!),但我希望能够只点击按钮的可见部分.例如,如果我点击只是"5"键的左上角外,我希望它的"1"按钮,而不是"5"的按钮点击,即使我在按钮5的边框点击.如果我点击"1"按钮的左上角""",我希望它点击窗口下方的任何内容而不是按钮上的内容.我还需要能够调整此窗口的大小,按钮中的图片应该随之调整大小.

我正在考虑使用透明的NSWindow,透明的NSButtons包含每个按钮的带有alpha的PNG,但我认为重叠按钮将是一个问题.

我也听说过Bowtie,SweetFM等应用程序以及其他使用WebKit显示其界面的应用程序.如果这是至少10.3的可能性,这将是有趣的,但我不知道这将如何工作.

我四处寻找点击面具,区域或类似的东西,但我还没有找到任何东西.我将更新这篇文章,因为我发现更多信息(如果我这样做!).

关于如何进行的任何提示?

(请注意,我正在使用10.4,理想情况下我也需要支持一些旧版本的Mac OS X.)

(另外,我在Apple的开发网站上找到了"圆形窗口"示例,但它不再在10.4上运行,所以我不确定这是不是可行的方法.)

提前致谢!

更新:

(见更新2,此问题现已修复)

好的,现在我的问题略有不同(但并非无关).到目前为止我做的是:

我选择制作一个自定义控件,我可以用于每个按钮:

1-子类NSControl并覆盖drawRect,mouseUp,mouseDragged和mouseDown.这样我可以在拖动按钮时移动我想要的行为(移动窗口).

2-将每个按钮状态(相同形状但一个变暗)的图像加载到NSImages中,并compositeToPoint:fromRect:operation:在必要时将它们绘制到视图中.这些图像是185 x 185像素的PNG文件,从Photoshop导出alpha.

3-获取NSImage的位图表示:

NSBitmapImageRep *bitRep = [[NSBitmapImageRep imageRepWithData:[unpressedImage TIFFRepresentation]] retain];

要么

NSBitmapImageRep *bitRep = [[unpressedImage representations] objectAtIndex:0];

两者似乎都给出了相同的结果.我尝试将这个位图rep合成到我的窗口上以查看图像是否具有相同的大小并且看起来像原始图像并且一切看起来都很好(你会明白为什么我在这个枚举之后就这样做了......).

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分量和鼠标下的颜色乍看起来工作(返回的颜色和阿尔法都在我的位图),但它看起来喜欢的颜色是不是在正确的点取bitRep,或包含在图像bitRepIS扭曲(bitRep虽然我在窗户上合成时没有扭曲,这很奇怪).我再次仔细检查x和y鼠标坐标是否在(0,185)范围内,并且尺寸NSBitmapImageRep也是185 x 185.

首先,看起来NSBitmapImageRep水平翻转与我相比NSImage.如果我翻转我的坐标,返回的值似乎大部分都可以(大部分形状似乎与返回的值一致)但是仍然有部分图像返回错误的值.

我在这一点上一无所知,NSBitmapImageRep之前从未使用过,也许我只是忘了指定一些关于我的图像的格式信息,这就是为什么这些值都没有了.有人可以澄清一下吗?

再次感谢!

更新2:

好吧没关系,我发现了这个问题.我用的setColor:ATX:Y:打印方法,它在我的窗口前,吸取bitRep彩色的点和问题是一清二楚:Y坐标的bitRep反转,但图像印有"好"方向.这意味着bitRep具有"Windows风格"的左上角原点坐标系,而窗口具有笛卡尔坐标系(左下角)原点.简单地反转我的Y坐标修复了我获得alpha分量和颜色的问题.

这一定是写在文档的某个地方,很遗憾因为我缺乏研究而困扰你......!

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有