====== ImGui 基础概念 ====== 如果您是初次使用 ** ImGui ** 包,我们希望您能认真阅读此页面,以保证您具备使用此包的基本概念。而后,您才可能知道您在自己的项目中需要什么,想要什么。 总体容阅读时间约为 20 min,请酌情参考。 本页面将呈现以下内容: * [[:manual:reference:package:extend:imgui:base:main_page#典型 ImGui 程序的代码布局 | 典型 ImGui 程序的代码布局]] * [[:manual:reference:package:extend:imgui:base:main_page#显示器方法(Open GL) | 显示器方法(Open GL)]] * [[:manual:reference:package:extend:imgui:base:main_page#应用(application)简要 | 应用(application)简要]] * [[:manual:reference:package:extend:imgui:base:main_page#向量(vec2/vec4) | 向量(vec2/vec4)]] * [[:manual:reference:package:extend:imgui:base:main_page#字体(font)简要 | 字体(font)简要]] * [[:manual:reference:package:extend:imgui:base:main_page#窗口(window)简要 | 窗口(window)简要]] * [[:manual:reference:package:extend:imgui:base:main_page#控件(widget)简要 | 控件(widget)简要]] * [[:manual:reference:package:extend:imgui:base:main_page#布局和组(group) | 布局和组(group)]] * [[:manual:reference:package:extend:imgui:base:main_page#画板(canvas) | 画板(canvas)]]
while !app.is_closed()
app.prepare()
...
app.render()
end
在 **app.prepare()** 和 **app.render()** 间设计的布局的每个窗口(包括每个控件),都将以每一帧为单位染至**应用(application)**上。
-----
\\
===== 显示器方法(Open GL) =====
Open GL 是 Dear ImGui 的后端,其方法与 Dear ImGui 无关。
在 ImGui 中保留并提供了对显示器的方法:
^**方法** ^**描述** ^
|**number** get_monitor_count() |获取系统使用显示器数量 |
|**number** get_monitor_width(number monitor_id) |获取指定显示器的宽度(像素) |
|**number** get_monitor_height(number monitor_id) |获取指定显示器的高度(像素) |
显示器 id 由系统分配。
例如:win10 下,显示器编号为 1~n,则**在 ImGui 中显示器 id 对应为 0~n-1**。
**单显示器下显示器 id 为 0。**
-----
\\
===== 应用(application)简要 =====
**application** 分为两种:
^application 申明方法 ^描述 ^
|[application] **fullscreen_application**(number monitor_id, string title) |创建全屏应用并返回应用对象 |
|[application] **window_application**(number width, number height, string title) |创建窗口应用并返回应用对象 |
创建全屏应用需手动指定显示器 id。
创建窗口应用需指定长宽,需要创建与屏幕成比例的窗口,可以配合显示器方法(获取显示器长宽)使用。
**application** 支持设置内部所有窗口(window)的主题风格:
^设置主题方法 ^描述 ^
|void **style_color_classic**() |切换到经典主题 |
|void **style_color_light**() |切换到亮色主题 |
|void **style_color_dark**() |切换到暗色主题 |
-----
\\
===== 向量(vec2/vec4) =====
在 Dear ImGui 中,有两类向量:
* vec2:二维向量,常用于表示坐标或长宽
* vec4:四维向量,常用于表示有三通道和透明度的色彩(RGBA)
import imgui
import imgui_font
var font0 = add_font_extend_cn(imgui_font.source_han_sans,25)
var font1 = add_font_default(25)
...
while !app.is_closed
app.prepare()
push_font(font0)
... # 此处控件使用 font0 字体
pop_font()
push_font(font1)
... # 此处控件使用 font1 字体
app.render()
end
-----
\\
===== 窗口(window)简要 =====
ImGui 的提供的窗口仅在**应用**中生效,即:应用内窗口。
窗口是控件的载体,每个应用内可以涵有若干窗口。
一般来说,通过如下的方式来设置窗口
^方法 ^描述 ^
|void **set_window_pos**([vec2] pos) |设置当前窗口位置 |
|void **set_window_size**([vec2] size) |设置当前窗口大小 |
|void **begin_window**(string title_and_id, boolean is_open, array flags) |开始新窗口布局 |
|void **end_window**() |结束窗口布局 |
对于以上方法做出解释。
例如,在 app 内绘制一个 window,然后渲染:
while !app.is_closed
app.prepare()
begin_window("my_window##mw1", mw1_isopen, {})
set_window_pos(vec2(0,0))
set_window_size(vec2(get_widow_width(app),get_widow_height(app)))
...
end_window()
app.render()
end
...
begin_window(...)
if button("click me!")
# do something
...
end_window()
控件种类繁多,不在此一一赘述。如有需要可以参考 [[:manual:reference:package:extend:imgui:widget:main_page |ImGui 控件]]文档。
\\
标识符:一般用于右键菜单等,默认情况下标识符就是控件名,**但有些控件无 ID 时就要特别标示**
一般控件名可使用''title##id''的形式指定控件的标识符
^方法 ^描述 ^
|void **push_id**(string title_and_id) |创建新标识符 |
|void **pop_id**() |结束标识符 |
-----
\\
===== 布局和组(group) =====
ImGui支持使用''begin_group()''和''end_group()''一对方法标签,将若干控件组合为一个**组(group)**,并对其实施统一的布局行为。
以下改变布局的行为,仅对组内控件生效:
^方法 ^描述 ^
|void **begin_group**() |开始新组 |
|void **end_group**() |结束组 |
|void **separator**() |横向分割线 |
|void **same_line**() |设置下一个控件为同一行 |
|void **spacing**() |插入空格 |
|void **indent**() |缩进 |
|void **unindent**() |反缩进 |
另外还有树形节点,您可以理解为组(group)的树状形式:
^方法 ^描述 ^
|boolean **tree_node**(string label) |创建新的树节点 |
|void **tree_pop**() |结束树节点 |