如何在Mac上的Carbon中用C ++打开一个新窗口?

时间:2017-01-13 12:41:29

标签: c++ macos-carbon

我没有找到文档,所以我希望代码相当于:

#include <carbon.h>

int main() {
    carbon::Window win1 = carbon::openWindow(10,10,640,480);
    win1.setVisible(true);
    return 0;
}

问题是,通过对谷歌和Stack Overflow的研究,我没有找到做到这一点所必需的元素。

1 个答案:

答案 0 :(得分:3)

  

问题是,随着谷歌和堆栈溢出的研究我没有找到这样做的必要元素

Carbon是一个旧框架,旨在帮助开发人员从经典MacOS(即版本9.x及更低版本)过渡到MacOS X.正如AlgirdasPreidžius在评论中指出的HIToolbox.framework,这是Carbon的一部分您用来创建窗口等的是deprecated in MacOS X 10.7。现在尝试使用这些框架毫无意义。

暂且不谈,您的示例说明了对使用图形用户界面的程序所需内容的基本误解。这是你的代码:

int main() {
carbon::Window win1 = carbon::openWindow(10,10,640,480);
win1.setVisible(true);
return 0;
}

即使Carbon API恰好匹配你所拥有的(它甚至不接近),你的程序似乎什么都不做。它会创建一个窗口并可能显示它,但它会立即退出,这样窗口可能永远不会出现在屏幕上,或者可能会在屏幕上闪烁并消失得如此之快以至于你可能看不到它。带有图形界面的程序花费大部分时间等待用户做某事,比如移动鼠标或按下鼠标按钮或按键盘上的键或插入软盘(记住,我们在这里说旧学校)。为此,任何GUI应用程序的核心都是事件循环。在它被称为“MacOS”之前的早期,Macintosh操作系统一次只能运行一个程序,并且该程序必须轮询操作系统以获取每个新事件,因此应用程序的核心看起来像这样:

EventRecord theEvent;
EventMask eventMask = everyEvent;
while (!quitting) {
    GetNextEvent(eventMask, &eventRecord);
    switch (eventRecord.what) {
        case keyDown: {
            // do something with the key in the event
        }
        case keyUp: {
            // do something with the key in the event
        }
        case autoKey: {
            // do something with the key in the event
        }
        case mouseDown: {
            // do something with the mouse position in the event
        }
        case mouseUp: {
            // do something with the mouse position in the event
        }
        // ...and so on...
    }
}

那是事件循环。在更高版本中,操作系统已更改为允许多个应用程序同时运行,因此事件循环基于名为WaitNextEvent()而非GetNextEvent()的函数,主要区别在于WNE将阻止没有活动可用。当Carbon出现时,样式再次改变 - 这次事件循环由操作系统处理,程序只是为他们感兴趣的所有事件注册回调函数(这几乎是Microsoft Windows应用程序的工作原理) ,并且那些处理程序会在需要时被调用。

所有这些只是为了解释GUI应用程序的内容远远超过您所指示的内容 - 您不仅要创建一个窗口,还必须处理它。你的意图并不清楚你的问题,但无论你想做什么,Carbon几乎肯定不是答案。如果要创建基本应用程序,在Xcode中创建新的macOS项目将为您提供所需的一切。如果你想在你的应用程序中使用C ++,要知道你可以很容易地将C ++与Objective-C混合在一起,并且与Swift代码的集成也应该非常简单。