【问题标题】:OS X from Carbon to Cocoa window creation?OS X 从 Carbon 到 Cocoa 窗口创建?
【发布时间】:2012-09-07 05:21:04
【问题描述】:

编辑:这个问题已在 cmets 中间接回答(使用 GLUT 来避免两者的需要),但由于它没有作为答案发布,尽管我的问题已解决,但我不能“接受”它。强>

我有一个用 C++ 编写的跨平台 OpenGL 应用程序,它(在 Mac OS X 上)使用 Carbon 来创建窗口和消息泵(想想……NeHe 第 1 课)。最近使用 C++11 功能对我的代码进行的更改使其与 XCode 捆绑的 GCC 不兼容。

我所有使用 MacPorts、HomeBrew 等系统的尝试都因不同的原因而失败(主要是因为我需要编译 32 位以支持 Carbon)。我本来想问是否有人有更好的解决方案来在 Mac OS X 10.8 中安装更新的 G++。

这似乎是一个短视的解决方案(在某些时候,我需要升级到 Cocoa 和 64 位)所以我的问题已经演变为询问让我现有的(非常大的)应用程序利用 Cocoa 的最简单方法是什么为了这个任务而不是 Carbon?

我在自己单独的 .cpp/.h 文件中拥有所有“碳代码”,该文件只有两个功能,一个是创建 OpenGL 窗口,另一个是使用 ReceiveNextEvent 的消息泵。


编辑: 更清楚地说,我正在寻找最好的方法来设计(或多或少)替代我现有的 Carbon 窗口创建和消息泵功能,但在 Cocoa 中。我知道作为一个不同的 API,使用不同的语言概念,简单的一对一命令替换是不够的。我现有的代码有一个适用于 Mac 的源代码文件,该文件有两个函数,它们执行我调用的核心任务(使用 Carbon),InitWindow 和 DoEvents。它们分别创建窗口,并循环处理未决事件。我的目标是用使用 Cocoa 的源代码文件替换这个源代码文件,公开相同的功能,因此我的核心代码几乎没有修改。

实现我的目标的最佳方式是什么?我不熟悉 Cocoa,Obj-C 对我来说是陌生的。

【问题讨论】:

  • 不要使用碳。无论如何,它已经过时且已被弃用。您可以使用本机 NSOpenGLView,也可以使用 SDL,但您必须使用 NSOpenGLView 完成我的工作,因为您必须自己实现很多东西。
  • 我只需要一个简单的“插入”替换我在 Cocoa 中的 Carbon 代码。 SDL 对于我需要的东西来说太过分了。
  • 不幸的是,将项目从碳替换为可可并非易事,因为可可不是碳替代品。
  • 这应该不是一项不可逾越的任务,因为我只使用了几个 Carbon 命令,而且我的需求很少。本质上是 Carbon 中的“CreateNewWindow”、“ReceiveNextEvent”(以及与这两者交互所需的任何其他 API)。如果我正在创建一个 GUI 应用程序,或者有更多这些非常简单的需求,我可以理解这是一项艰巨的任务,但这应该是相当简单的。我只是不熟悉 Cocoa 和 Obj-C 界面,所以不确定如何进行这项手术。
  • 您是否考虑过通过 GLUT 而不是使用纯 C++ 来实现它?听起来比通过学习Objective-C使用可可更有效的方法

标签: c++ macos cocoa opengl macos-carbon


【解决方案1】:

使用 Cocoa 64 位绝对是个好主意。如果您也想让您的用户满意,我建议您使用一些原生 UI。

最简单的做法是创建一个NSWindow,其中包含NSOpenGLView。您可以在 Interface Builder 或代码中执行此操作。最好通过使用 Xcode 的模板(文件 > 新项目 > Cocoa 应用程序)创建一个新的 Cocoa 应用程序来做到这一点。默认情况下,这会给你一个窗口。您可以在 Interface Builder 中打开它并向其添加 NSOpenGLView。您可以使视图成为NSOpenGLView 的自定义子类,并将您的事件处理添加到其中。有关 Cocoa 如何调度事件的更多信息,请参阅NSResponder 的文档。

【讨论】:

  • 不需要任何“本机 UI”,因为没有 UI 可言。我需要知道为我的 Carbon 代码设计一个简单的“插入式”替换的最佳方法。我有一个超过十万行代码的现有应用程序,在 C++ 中需要替换 Carbon(仅用于创建窗口和管理按键)。使用 Xcode 或类似工具可能会提供一些模板应用程序,但这不是问题。我需要一个替代品来替换我已经拥有的东西,以及一种将它链接到我现有的 C++ 代码的方法。
  • 我建议的哪一部分你不明白?它可以做你想做的事。 NSOpenGLView 是在 Cocoa 应用程序的窗口中显示 OpenGL 的方式。我知道没有其他方法。此外,如果您想处理事件,您的视图将接收它们并可以处理它们。这就是 Cocoa 中事件处理的工作方式。没有其他方法可以接收我所知道的事件。你不需要使用 Xcode。您可以使用 make 文件,或者如果这是您的偏好的话。但如果你想让它成为一个 Cocoa 应用程序,使用 NSWindowNSOpenGLView 是答案,正如上面其他几个人所说的那样。
  • 不乏理解,您提出了很多建议(使用 Xcode 创建项目、使用界面生成器等),但这些都不是我的问题的实际答案,这涉及到一个现有的、非常大的跨平台 C++ 项目,我希望将几个 Carbon 命令换成 Cocoa 的命令。 NSOpenGLView 的推荐是一个很好的,但不是我真正要问的。我可以从 NeHe 示例中看到如何在 Cocoa 中制作 OpenGL 窗口。我看不到将其插入现有 C++ 项目的最佳方法。
  • 我想做的事情就是这样简单:/* Include Some Stuff*/ main(arg….) { /* Init Some Stuff */ CreateMacWindow("Hello World", 800, 600); /* Run My Code */ } void CreateMacWindow(……) { /* Call Cocoa Functions to create a Mac "window" */ /* Add "OpenGL View" to the window */ } 这就是我的应用程序在 Windows、Linux、Mac(使用 Carbon)和其他操作系统中的工作方式,我正在尝试与 Cocoa 获得相同(或多或少),所以我不必有太多特定于平台的更改。如果我能做到以上几点,那就是我所需要的。
  • Cocoa 不能完全按照你的方式工作。您可以使用NSWindow* myWindow = [[NSWindow alloc] initWithContentRect:::]; 分配NSWindow。您可以使用[myWindow setContentView:myOpenGLView]; 向其添加NSOpenGLView,然后您的自定义NSOpenGLView 子类可以处理这些事件。您可以直接从 Objective-C 调用 C++。您唯一需要做的就是使用“.mm”扩展名而不是“.m”来命名您的文件,它们将是“Objective-C++”。但是要获取事件,我相信您需要运行一个 NSRunLoop,最好只创建一个NSApplication。不这样做更难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多