GtkGLArea

说明 [src]

class Gtk.GLArea : Gtk.Widget
  implements Gtk.Accessible, Gtk.Buildable, Gtk.ConstraintTarget {
  /* No available fields */
}

GtkGLArea 是一款可使用 OpenGL 绘制的窗口小部件。

An example GtkGLArea

GtkGLArea 设置了自己的 GdkGLContext,并创建一个自定义 GL 框架缓冲区以便窗口小部件将 GL 渲染到其上。它还确保渲染时此框架缓冲区为默认 GL 渲染目标。已完成的渲染将作为一个纹理整合到更大的 GTK 场景图中。

为进行绘制,您必须连接到 GtkGLArea::render 信号,或对 GtkGLArea 进行子类化并覆盖 GtkGLAreaClass.render 虚拟函数。

GtkGLArea 窗口小部件确保将 GdkGLContext 与窗口小部件的绘图区域关联起来,并在绘图区域的大小和位置发生变化时予以更新。

使用 GtkGLArea 绘图

GtkGLArea 中使用 OpenGL 命令进行绘制的最简单方法是创建窗口小部件实例并连接至 GtkGLArea::render 信号

GtkGLArea 准备好让您对其内容进行绘制时,将调用 render() 函数

框架缓冲区的初始内容为透明。

static gboolean
render (GtkGLArea *area, GdkGLContext *context)
{
  // inside this function it's safe to use GL; the given
  // GdkGLContext has been made current to the drawable
  // surface used by the `GtkGLArea` and the viewport has
  // already been set to be the size of the allocation

  // we can start by clearing the buffer
  glClearColor (0, 0, 0, 0);
  glClear (GL_COLOR_BUFFER_BIT);

  // draw your object
  // draw_an_object ();

  // we completed our drawing; the draw commands will be
  // flushed at the end of the signal emission chain, and
  // the buffers will be drawn on the window
  return TRUE;
}

void setup_glarea (void)
{
  // create a GtkGLArea instance
  GtkWidget *gl_area = gtk_gl_area_new ();

  // connect to the "render" signal
  g_signal_connect (gl_area, "render", G_CALLBACK (render), NULL);
}

如果您需要初始化 OpenGL 状态(例如缓冲对象或着色器),则应该使用 GtkWidget::realize 信号;您可以使用 GtkWidget::unrealize 信号进行清理。由于 GdkGLContext 创建和初始化可能会失败,您需要使用 gtk_gl_area_get_error() 检查错误。

下面是安全初始化 GL 状态的示例。

static void
on_realize (GtkGLarea *area)
{
  // We need to make the context current if we want to
  // call GL API
  gtk_gl_area_make_current (area);

  // If there were errors during the initialization or
  // when trying to make the context current, this
  // function will return a GError for you to catch
  if (gtk_gl_area_get_error (area) != NULL)
    return;

  // You can also use gtk_gl_area_set_error() in order
  // to show eventual initialization errors on the
  // GtkGLArea widget itself
  GError *internal_error = NULL;
  init_buffer_objects (&error);
  if (error != NULL)
    {
      gtk_gl_area_set_error (area, error);
      g_error_free (error);
      return;
    }

  init_shaders (&error);
  if (error != NULL)
    {
      gtk_gl_area_set_error (area, error);
      g_error_free (error);
      return;
    }
}

如果您需要更改创建 GdkGLContext 的选项,应使用 GtkGLArea::create-context 信号。

层级

hierarchy this GtkGLArea implements_0 GtkAccessible this--implements_0 implements_1 GtkBuildable this--implements_1 implements_2 GtkConstraintTarget this--implements_2 ancestor_0 GtkWidget ancestor_0--this ancestor_1 GInitiallyUnowned ancestor_1--ancestor_0 ancestor_2 GObject ancestor_2--ancestor_1

构造函数

gtk_gl_area_new

创建新的 GtkGLArea 窗口小部件。

实例方法

gtk_gl_area_attach_buffers

将缓冲区绑定到帧缓冲区。

gtk_gl_area_get_allowed_apis

获取允许的 API。

自:4.12

gtk_gl_area_get_api

获取当前正在使用的 API

自:4.12

gtk_gl_area_get_auto_render

返回该区域是否处于自动渲染模式。

gtk_gl_area_get_context

检索 area 使用的 GdkGLContext

gtk_gl_area_get_error

获取在 area 上设置的当前错误。

gtk_gl_area_get_has_depth_buffer

返回该区域是否具有深度缓冲区。

gtk_gl_area_get_has_stencil_buffer

返回该区域是否具有模板缓冲区。

gtk_gl_area_get_required_version

检索 OpenGL 的所需版本。

gtk_gl_area_get_use_es

返回 GtkGLArea 是否应使用 OpenGL ES

已弃用:4.12

gtk_gl_area_make_current

确保 area 使用的 GdkGLContextGtkGLArea 关联。

gtk_gl_area_queue_render

将当前渲染的数据(如果有)标记为无效,并对窗口小部件排队重绘。

gtk_gl_area_set_allowed_apis

设置用于创建上下文的允许的 API。

自:4.12

gtk_gl_area_set_auto_render

设置 GtkGLArea 是否处于自动渲染模式。

gtk_gl_area_set_error

在区域中设置错误,该错误将显示在 GL 渲染的位置。

gtk_gl_area_set_has_depth_buffer

设置 GtkGLArea 是否应使用深度缓冲区。

gtk_gl_area_set_has_stencil_buffer

设置 GtkGLArea 是否应使用模板缓冲区。

gtk_gl_area_set_required_version

设置在为窗口小部件创建上下文时要使用的 OpenGL 的所需版本。

gtk_gl_area_set_use_es

设置 area 是否应创建 OpenGL 或 OpenGL ES 上下文。

已弃用:4.12

GtkWidget (162) 继承的方法

有关完整的方法列表,请参见 GtkWidget

GObject (43) 继承的方法

有关完整的方法列表,请参见 GObject

GtkAccessible (19) 继承的方法
gtk_accessible_announce

请求用户的屏幕阅读器播报给定的消息。

自:4.14

gtk_accessible_get_accessible_parent

检索无障碍对象的无障碍父对象。

自:4.10

gtk_accessible_get_accessible_role

检索无障碍对象的无障碍角色。

gtk_accessible_get_at_context

检索给定无障碍对象的实现。

自:4.10

gtk_accessible_get_bounds

查询此无障碍对象的坐标和尺寸。

自:4.10

gtk_accessible_get_first_accessible_child

检索无障碍对象的第一个无障碍子对象。

自:4.10

gtk_accessible_get_next_accessible_sibling

检索无障碍对象的下一个无障碍兄弟姐妹。

自:4.10

gtk_accessible_get_platform_state

查询平台状态,例如焦点。

自:4.10

gtk_accessible_reset_property

将无障碍属性重置为其默认值。

gtk_accessible_reset_relation

将无障碍关系重置为其默认值。

gtk_accessible_reset_state

将无障碍状态重置为其默认值。

gtk_accessible_set_accessible_parent

设置辅助功能对象的父项和兄弟项。

自:4.10

gtk_accessible_update_next_accessible_sibling

更新下一个辅助功能兄弟项。

自:4.10

gtk_accessible_update_property

更新辅助功能属性列表。

gtk_accessible_update_property_value

更新辅助功能属性数组。

gtk_accessible_update_relation

更新辅助功能关系列表。

gtk_accessible_update_relation_value

更新辅助功能关系数组。

gtk_accessible_update_state

更新辅助功能状态列表。

gtk_accessible_update_state_value

更新辅助功能状态数组。

GtkBuildable 继承的方法 (1)
gtk_buildable_get_buildable_id

获取 buildable 对象的 ID

属性

Gtk.GLArea:allowed-apis

允许的 API。

自:4.12

Gtk.GLArea:api

目前正在使用的 API

自:4.12

Gtk.GLArea:auto-render

如果设置为 TRUE,则每次绘制微件时都将发出 ::render 信号。

Gtk.GLArea:context

GtkGLArea 微件使用的 GdkGLContext

Gtk.GLArea:has-depth-buffer

如果设置为 TRUE,则该微件将为目标帧缓冲区分配并启用深度缓冲区。

Gtk.GLArea:has-stencil-buffer

如果设置为 TRUE,则该微件将为目标帧缓冲区分配并启用模板缓冲区。

Gtk.GLArea:use-es

如果设置为 TRUE,则该微件将尝试使用 OpenGL ES 而不是 OpenGL 来创建 GdkGLContext

已弃用:4.12

GtkWidget 继承的属性 (34)
Gtk.Widget:can-focus

该微件或其任何后代是否可以接受输入焦点。

Gtk.Widget:can-target

该微件是否可以接收指针事件。

Gtk.Widget:css-classes

应用于此微件的 css 类列表。

Gtk.Widget:css-name

此微件在 CSS 树中的名称。

Gtk.Widget:cursor

widget 使用的光标。

Gtk.Widget:focus-on-click

用鼠标单击时,该微件是否应获取焦点。

Gtk.Widget:focusable

此微件本身是否将接受输入焦点。

Gtk.Widget:halign

如果该微件获得额外的空间,则如何分配水平空间。

Gtk.Widget:has-default

该微件是否是默认微件。

Gtk.Widget:has-focus

该微件是否具有输入焦点。

Gtk.Widget:has-tooltip

启用或禁用在 widget 上发出的 GtkWidget::query-tooltip 信号。

Gtk.Widget:height-request

用于替代该微件的高度请求。

Gtk.Widget:hexpand

是否按水平方向扩展。

Gtk.Widget:hexpand-set

是否使用 hexpand 属性。

Gtk.Widget:layout-manager

用来计算小组件的首选大小并分配其子组件的 GtkLayoutManager 实例。

Gtk.Widget:margin-bottom

在微件底部的边距。

Gtk.Widget:margin-end

在微件结尾的边距,按水平方向。

Gtk.Widget:margin-start

在微件开始处的边距,按水平方向。

Gtk.Widget:margin-top

在微件顶部的边距。

Gtk.Widget:name

微件的名称。

Gtk.Widget:opacity

微件请求的不透明度。

Gtk.Widget:overflow

如何处理微件内容区域外部的内容。

Gtk.Widget:parent

此微件的父级微件。

Gtk.Widget:receives-default

当获取焦点时,该微件是否将接收默认操作。

Gtk.Widget:root

包含此小组件的小组件树的 GtkRoot 小组件。

Gtk.Widget:scale-factor

小组件的缩放比例。

Gtk.Widget:sensitive

该小组件能否响应输入。

Gtk.Widget:tooltip-markup

将提示文本设置为指定字符串,该字符串使用 Pango 标记进行标记。

Gtk.Widget:tooltip-text

将提示文本设置为指定的字符串。

Gtk.Widget:valign

如果小组件获取额外空间,则如何分配垂直空间。

Gtk.Widget:vexpand

是否垂直展开。

Gtk.Widget:vexpand-set

是否使用 vexpand 属性。

Gtk.Widget:visible

小组件是否可见。

Gtk.Widget:width-request

覆盖小组件的宽度请求。

GtkAccessible(1)继承的属性
GtkAccessible:accessible-role

给定 GtkAccessible 实现的可访问角色。

信号

Gtk.GLArea::create-context

小组件正被实现时发出。

Gtk.GLArea::render

每次都发出 GtkGLArea 的内容应该被重新绘制。

Gtk.GLArea::resize

小组件实现后发出一次,然后每次小组件在实现时改变就发出一次。

GtkWidget(13)继承的信号
GtkWidget::destroy

通知所有小组件引用持有者释放他们持有的引用。

GtkWidget::direction-changed

小组件的文本方向改变时发出。

GtkWidget::hide

widget 隐藏时发出。

GtkWidget::keynav-failed

键盘导航失败时发出。

GtkWidget::map

widget 准备映射时发出。

GtkWidget::mnemonic-activate

通过助记符激活小组件时发出。

GtkWidget::move-focus

焦点移动时发出。

GtkWidget::query-tooltip

小组件的提示准备显示时发出。

GtkWidget::realize

widgetGdkSurface 关联时发出。

GtkWidget::show

widget 显示时发出。

GtkWidget::state-flags-changed

小组件状态改变时发出。

GtkWidget::unmap

widget 准备取消映射时发出。

GtkWidget::unrealize

widget 关联的 GdkSurface 被销毁时发出。

GObject(1)继承的信号
GObject::notify

当对象的一个属性通过 g_object_set_property()、g_object_set() 等方式设置值时,会在对象上发出通知信号。

类结构

struct GtkGLAreaClass {
  gboolean (* render) (
    GtkGLArea* area,
    GdkGLContext* context
  );
  void (* resize) (
    GtkGLArea* area,
    int width,
    int height
  );
  GdkGLContext* (* create_context) (
    GtkGLArea* area
  );
  
}

GtkGLAreaClass 结构仅包含私有数据。

类成员
render: gboolean (* render) ( GtkGLArea* area, GdkGLContext* context )

GtkGLArea::render 信号的类闭包。

resize: void (* resize) ( GtkGLArea* area, int width, int height )

GtkGLArea::resize 信号的类闭包。

create_context: GdkGLContext* (* create_context) ( GtkGLArea* area )

GtkGLArea::create-context 信号的类闭包。

虚拟方法

Gtk.GLAreaClass.create_context

GtkGLArea::create-context 信号的类闭包。

Gtk.GLAreaClass.render

GtkGLArea::render 信号的类闭包。

Gtk.GLAreaClass.resize

GtkGLArea::resize 信号的类闭包。