简单 Cairo/Quartz C++ 示例

Simple Cairo/Quartz C++ example

我需要在 MacOS 上创建和 运行 一个简单的交互式 C++ Cairo(图形)应用程序,这大概意味着使用 Quartz 后端。

我觉得问这个问题真的很傻,但我似乎无法在网上找到一个简单的例子。一切都使用 Cocoa (这是 ObjectiveC)或 Swift.

这是我目前所拥有的,它链接正确但什么也没做...但这是因为我肯定遗漏了一些东西:

#include <cairo/cairo-quartz.h>
#include <cairo/cairo.h>

int main()
{
    cairo_surface_t* surface = cairo_quartz_surface_create (
              CAIRO_FORMAT_RGB24
            , 640
            , 480
            );

    cairo_t* cr = cairo_create(surface);

    // What next?  How do I get the window to show up?
    // What do I use for my event loop?
}

构建命令:

clang++ $(pkg-config --cflags --libs cairo) main.cpp

(显然这假设你已经正确安装了 Cairo)

Cairo 不知道 windows 或事件循环。它只知道如何绘制到“表面”,其中表面有点圆形地定义为“Cairo 可以绘制的东西”。它可以创建各种与系统无关的表面,如内存位图、PDF 和 PostScript 文件,它可以将表面包裹在一些与系统相关的绘图目标周围,如 Quartz CGContext、Windows HDC,或 X11 Drawable.

如果要创建交互式应用程序,则需要使用其他一些系统来创建屏幕上的绘图目标并响应用户输入。然后就可以将系统的屏幕绘图目标包裹在一个cairo_surface_t中,使用Cairo进行绘图。

因此,您可以使用原生 macOS Cocoa 框架进行交互,并使用 cairo_quartz_surface_create_for_cg_contextcairo_surface_t 包裹在 macOS 原生 CGContext 周围。 Cocoa 应用程序往往会在 macOS 上提供最佳用户体验。

或者你可以使用跨平台的Qt系统进行交互,用cairo_qt_surface_create把一个cairo_surface_t套在一个QPainter上。 Qt 是一个 C++ 系统,因此这可能是您最简单的解决方案。

或者您可以将 SDL 与 cairosdl 助手一起使用。

或者,对于提供对简单 RGB 位图的访问的任何框架,您可以使用 cairo_image_surface_create_for_data 将位图包裹 cairo_surface_t

或者,对于任何可以导入简单 RGB 位图的框架,您可以使用 cairo_image_surface_create 创建位图,然后使用系统的 API 将其交给系统。