NSScreen的可见框架太大

时间:2011-04-23 11:25:09

标签: objective-c cocoa macos applescript

我需要屏幕的边界才能知道最小和最大的x / y坐标。我的屏幕分辨率是1440x900。当我向NSScreen询问可见帧时,即

NSRect frame = [[NSScreen mainScreen] visibleFrame]

我得到以下x / y值:

xMin = NSMinX(frame) // 74
yMin = NSMinY(frame) // 0
xMax = NSMaxX(frame) // 1440
yMax = NSMaxY(frame) // 878

我在左侧有Dock,因此我的xMin大于0且yMin为0.但是,问题是yMax。据我所知,菜单栏高44像素,因此yMax应为900 - 44 = 856像素。根据NSScreen,菜单栏最多可以使用22个像素。那怎么样?


关于我的用例的更多信息:我通过Applescript调整窗口位置和窗口大小。要知道允许哪些值,即在可见帧内,我需要检查NSScreen的可见帧。但是,NSScreen从左下角开始计算像素,而Applescript从左上角开始计算。在构建NSScreen从左上角返回坐标的方法的过程中,我遇到了这个问题。

变换后的可见帧的yMin为22,因此距上界22个像素。我直接尝试了Applescript并发现,44以下的每个yMin都会被调整为44,因为菜单栏占用的空间从0到43像素。


我希望我的解释不会太混乱。最后问题是实验显示菜单栏高44像素,而NSScreen只留下22个像素的菜单栏(因为它的高度是900像素屏幕上的878像素)。


编辑:菜单栏的高度为 22像素。这是一个发现者的问题,他如何处理有关他的边界财产的事件。

1 个答案:

答案 0 :(得分:2)

菜单栏为22像素。作为测试打开TextEdit,将其窗口推到屏幕顶部,然后运行这个AppleScript,你会看到它是22。

tell application "TextEdit"
    bounds of window 1
end tell

您遇到的问题是Finder如何测量窗户。 10.6事情发生了变化。似乎窗口的标题栏没有被Finder考虑,因此窗口的明显0位置不是左上角,而是从该位置向下的一些像素。我还编写窗口位置脚本,注意我的代码必须在10.5和10.6之间不同。例如,打开Finder窗口并将其推到屏幕顶部,然后运行此代码......它显示44。

tell application "Finder"
    bounds of window 1
end tell

要证明它是Finder,请在同一个Finder窗口中运行此脚本。请注意System Events与Finder的信息。请记住,在10.5及更早版本中,Finder没有表现出这种差异。

tell application "System Events"
    tell process "Finder"
        set s to size of window 1
        set p to position of window 1
        return {p, s}
    end tell
end tell