====== ImGui 基础概念 ====== 如果您是初次使用 ** ImGui ** 包,我们希望您能认真阅读此页面,以保证您具备使用此包的基本概念。而后,您才可能知道您在自己的项目中需要什么,想要什么。 总体容阅读时间约为 20 min,请酌情参考。 本页面将呈现以下内容: * [[wiki:reference:package:extend:imgui:base:main_page#典型 ImGui 程序的代码布局 | 典型 ImGui 程序的代码布局]] * [[wiki:reference:package:extend:imgui:base:main_page#显示器方法(Open GL) | 显示器方法(Open GL)]] * [[wiki:reference:package:extend:imgui:base:main_page#应用(application)简要 | 应用(application)简要]] * [[wiki:reference:package:extend:imgui:base:main_page#向量(vec2/vec4) | 向量(vec2/vec4)]] * [[wiki:reference:package:extend:imgui:base:main_page#字体(font)简要 | 字体(font)简要]] * [[wiki:reference:package:extend:imgui:base:main_page#窗口(window)简要 | 窗口(window)简要]] * [[wiki:reference:package:extend:imgui:base:main_page#控件(widget)简要 | 控件(widget)简要]] * [[wiki:reference:package:extend:imgui:base:main_page#布局和组(group) | 布局和组(group)]] * [[wiki: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()
控件种类繁多,不在此一一赘述。如有需要可以参考 [[wiki: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() |结束树节点 |