在没有Cocoa的情况下创建OS X窗口

Jus*_*tin 3 macos cocoa nswindow

出于好奇,我开始试图找出Cocoa如何创建窗户.我发现的所有库都使用Cocoa作为核心,我似乎无法在网上找到任何东西.

我尝试使用Carbon,但它没有做任何事情,只是给我一个关于未被声明的函数的警告.

我想我真正想要的是一种与Quartz Compositor接口的方法.

有什么方法可以让我看一下真正的窗口创建代码吗?

Pet*_*sey 11

我没有太多细节可以给你,但我可以指出你的方向.

有一个级别,这是Quartz Window Services.这就是NSWindow和Carbon的Window Manager所依据的.

即使在公共API中,偶尔也会窥视它.您可以向任何窗口询问其窗口编号(以及同样在Carbon中),并且可以使用公共Quartz Window Services API任何内容.但是,这并没有让你走得太远:除了截屏之外,你无法做到这一点.

但是,如果您要使用Quartz创建一个窗口,那么(可能 - 我从未尝试过这个)将是空白的.标题栏和背景分别绘制.

要做到这一点,NSWindow有第二个视图ivar为视图称为框架视图,可能使用HITheme.(惊人的数量甚至是公开的 - 例如,有一个HIThemeDrawWindowFrame!它是公开的!)窗口管理器可能做类似的事情.

[已添加] 这是一个使用HITheme绘制窗口的测试应用程序(在常规NSView中).

包含假窗口的真实窗口的屏幕截图.

正如您所看到的,它并不完美:除了其他方面,阴影半径和标题栏高度都是硬编码的.但这是一个开始,并且是一个体面的示范.

快速摘要:

  • HIThemeDrawWindowFrame目前只是绘制标题栏和红绿灯.没有标题文本(它不带字符串,因此无法绘制它),也没有窗口背景,框架轮廓或阴影.
  • 要绘制窗口背景,请使用窗口背景画笔作为上下文的填充颜色HIThemeSetFill.然后,使用HIThemeGetWindowShape(请注意:尽管名称,您需要使用CFRelease此形状获得的形状),然后使用,将该形状设置为上下文的当前路径,以获取窗口结构区域的HIS 形状HIShapeReplacePathInCGContext.那么,CGContextFillPath正常.
  • 如果您想在窗口后面留下阴影,则需要将所有上述内容包装在透明层中.特别是,如果你不这样做,那么红绿灯会在每个按钮后面都有自己的阴影,看起来非常奇怪.
  • 要绘制标题文本,请使用HIThemeDrawTextBox.您应该能够使用HIThemeGetWindowShape,但是,从Lion开始,它将返回一个空的形状.