简单 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_context
将 cairo_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 将其交给系统。
我需要在 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_context
将 cairo_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 将其交给系统。