【发布时间】:2009-10-06 20:22:51
【问题描述】:
我正在寻找一个看起来像这样的自定义窗口(不要介意快速 Photoshop):
我遇到的主要问题不是使窗口透明(尽管我想欢迎任何信息!),但我希望能够仅单击按钮的可见部分。例如,如果我在“5”按钮的左上角之外单击,我希望它记录对“1”按钮而不是“5”按钮的单击,即使我单击了按钮 5 的边界框。如果我点击“1”按钮的左上角“角落”之外,我希望它点击窗口下方的任何内容,而不是按钮。我还需要能够调整此窗口的大小,并且按钮中的图片应随之调整大小。
我正在考虑使用透明 NSWindow 和透明 NSButton,每个按钮包含带有 alpha 的 PNG,但我认为重叠的按钮会是一个问题。
我还听说过诸如 Bowtie、SweetFM 和其他使用 WebKit 来显示其界面的应用程序。如果这在至少 10.3 上是可能的,那会很有趣,但我也不知道它是如何工作的。
我四处寻找点击蒙版、区域或类似的东西,但我还没有找到任何东西。当我找到更多信息时,我会更新这篇文章(如果我这样做了!)。
关于如何进行的任何提示?
(请注意,我正在开发 10.4,理想情况下我还需要支持一些旧版本的 Mac OS X。)
(另外,我在 Apple 的开发网站上找到了“圆角窗口”示例,但它不再在 10.4 上运行,所以我不确定这是要走的路。)
提前致谢!
更新:
(参见更新 2,此问题现已修复)
好的,现在我遇到了一个稍微不同(但并非不相关)的问题。到目前为止我所做的是:
我选择制作一个可以用于我的每个按钮的自定义控件:
1- 继承 NSControl 并覆盖 drawRect、mouseUp、mouseDragged 和 mouseDown。这样我可以在拖动按钮(移动窗口)时获得我想要的行为。
2- 将每个按钮状态的图像(相同形状但一个变暗)加载到 NSImage 中,并在必要时使用compositeToPoint:fromRect:operation: 将它们绘制到视图中。图片是从 Photoshop 导出的 185 x 185 像素 带 alpha 的 PNG 文件。
3- 获取 NSImage 的位图表示:
NSBitmapImageRep *bitRep = [[NSBitmapImageRep imageRepWithData:[unpressedImage TIFFRepresentation]] retain];
或
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。
首先,与我的NSImage 相比,NSBitmapImageRep 看起来是水平翻转的。如果我翻转我的坐标,返回的值似乎大部分都可以(大部分形状似乎与返回的值相符),但仍有部分图像返回错误的值。
此时我一无所知,之前从未与NSBitmapImageRep 合作过,也许我只是忘记指定有关我的图像的一些格式信息,这就是这些值关闭的原因。有人可以澄清一下吗?
再次感谢!
更新 2:
好吧,没关系,我找到了问题。我使用 setColor:atX:y: 方法在 bitRep 上绘制一个彩色点,然后在我的窗口上打印它,问题很清楚:bitRep 中的 Y 坐标是反转的,但图像打印为“好“ 方向。这意味着 bitRep 具有“Windows 样式”的左上角原点坐标系,而窗口具有笛卡尔坐标系(左下角)原点。只需反转我的 Y 坐标即可解决我在获取 alpha 分量和颜色时遇到的问题。
这一定是在文档的某个地方写的,很抱歉因为我缺乏研究而打扰到你......!
【问题讨论】:
标签: objective-c cocoa nswindow