gpt4 book ai didi

macos - 不使用 Cocoa 创建 OS X 窗口

转载 作者:行者123 更新时间:2023-12-03 16:16:06 25 4
gpt4 key购买 nike

出于好奇,我开始尝试弄清楚 Cocoa 是如何创建窗口的。我发现的所有库都以 Cocoa 为核心,但我似乎在网上找不到任何东西。

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

我想我真正想要的是一种与 Quartz Compositor 交互的方法。

有什么方法可以让我看看真实窗口创建代码吗?

最佳答案

我没有太多细节可以提供给您,但我也许可以为您指明方向。

再往下一层,就是 Quartz Window Services。这就是 NSWindow 和 Carbon 的窗口管理器的基础。

它偶尔会被偷看,即使是在公共(public) API 中。您可以ask any window for its window number (和 likewise in Carbon ),这样,您就可以使用 the public Quartz Window Services API 中的任何内容。不过,这并不能帮助您走得太远:除了截屏之外,您无能为力。

如果你用 Quartz 创建一个窗口,它会(可能——我从未尝试过)是空白的。标题栏和背景是分开绘制的。

为此,NSWindow 有第二个 View ivar,用于称为框架 View 的 View ,该 View 可能使用 HITheme。 (令人惊讶的是,它的数量甚至是公开的——例如,有一个HIThemeDrawWindowFrame!而且它是公开的!)窗口管理器可能会做类似的事情。

[已添加] Here's a test app that draws a window using HITheme (在常规 NSView 内部)。

Screenshot of the real window containing the fake window.

正如您所看到的,它并不完美:除其他外,阴影半径和标题栏高度是硬编码的。但这只是一个开始,而且是一次不错的演示。

快速摘要:

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

关于macos - 不使用 Cocoa 创建 OS X 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18499848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com