GTK 中的坐标系统 [src]
所有 GTK 的坐标系统都以左上角为原点,X 轴向右,Y 轴向下。这符合 X11、Wayland 和cairo 中使用的惯例,但与 OpenGL 和 PostScript 不同,后者的原点位于左下角,Y 轴向上。
窗口中的每个小组件都有它自己使用来放置其子小组件和解释事件的坐标系统。大多数情况下,可以安全地忽略此事实。此部分将解释在少数重要情况下所涉及的详细信息。
盒模型
在渲染时,GTK 尽可能遵循 CSS 盒模型。
正在使用的 CSS 样式表决定各小组件的边距、边框和内边距区域的大小(和外观)。内容区域的大小由 GTK 的布局算法使用各小组件的 Gtk.WidgetClass.measure
和 Gtk.WidgetClass.size_allocate
虚拟函数决定。
您可以阅读 CSS 规范 或 Mozilla 文档 了解有关 CSS 盒模型的更多信息。
要进一步了解 GTK CSS 与网络 CSS 的区别,请参阅 CSS 概述。
小组件
CSS 盒模型中的内容区域是小组件认为属于其自己的区域。
小组件的坐标系统的原点是内容区域的左上角,它的大小是小组件的大小。可以通过 gtk_widget_get_width()
和 gtk_widget_get_height()
查询此大小。GTK 允许通过一般的 3D 转换对小组件进行放置(虽然大多数情况下,此转换将是一个简单的 2D 平移)。可使用 gtk_widget_compute_transform()
获取从一个小组件的坐标系统到另一坐标系统的转换。
除了大小外,小组件还可以选择具有基线以放置文本。诸如 GtkBox
之类的容器可能会在对齐基线后放置其子元素。gtk_widget_get_baseline()
返回小组件坐标中基线的很偏移量。
当小组件 API 期望位置或区域时,它们需要在此坐标系统中表示,通常称为小组件坐标。GTK 提供了一些用于在不同小组件的坐标系统中进行转换的 API,例如 gtk_widget_compute_point()
或 gtk_widget_compute_bounds()
。这些方法有时会失败(要么是因为小组件之间没有共同的祖先,要么是因为发生了奇异转换),并且调用方需要处理此类意外情况。
偶尔相关的另外一个区域是部件的界限,它是部件呈现通常被限制到的区域(在技术上,部件可以绘制在这个区域的外部,除非通过 GtkWidget:overflow
属性强制剪切)。从CSS术语角度看,部件的界限对应于边框区域。
在GTK的布局算法期间,父部件需要测量每个可见子元素,并至少分配给他们与所测量的大小一样大的大小。这些功能会负责遵守CSS框模型和控件属性(例如对齐和边距)。这在父坐标系统中会发生。
请注意,部件的文本方向并不会影响其坐标系统,而仅仅是决定文本是在 X 坐标增加还是减少的方向流动。
事件
事件控制器和手势会报告附着到的部件的坐标系统中的位置。
如果您要处理与GdkEvent
表单中的原始事件,这些事件带有与其关联的位置(例如指针位置),则此类位置会以曲面坐标来表示,其原点位于GdkSurface
的左上角。
要从曲面坐标换算成部件坐标,您必须将曲面左上角的偏移量应用到顶层部件的左上角,而这种偏移量可以使用 gtk_native_get_surface_transform()
来获取。