窗口创建与控制
窗口由 WindowOption 创建,创建成功后返回当前窗口的 WindowId。
use flor::windows::WindowOption;
use flor_lys::label::label;
let window_id = WindowOption {
title: "Hello Flor".to_string(),
width: 800,
height: 600,
..WindowOption::default()
}
.open(move |_window_id| {
label("hello flor ~")
})?;
WindowOption 负责窗口的初始配置:
pub struct WindowOption {
pub title: String,
pub width: u32,
pub height: u32,
pub rem_px: f32,
pub wait_v_sync: bool,
pub show_fps: bool,
pub continuous_rendering: bool,
pub background_color: Color,
pub tooltip_delay: Duration,
}
默认值如下:
continuous_rendering 只控制事件循环是否持续触发重绘,不会改变 Flor 的界面模型。普通 GUI 应用保持默认值即可;动画、实时预览、游戏循环这类需要每帧刷新的场景再设为 true。
open 的视图函数
open 的签名是:
pub fn open<F, V>(self, view_fn: F) -> Result<WindowId, Error>
where
F: Fn(WindowId) -> V + Send + Sync + 'static,
V: IntoViewIter,
view_fn 是窗口根视图的构建函数。Flor 创建平台窗口、渲染器和窗口入口后,会把当前窗口的 WindowId 传给它,并把返回值转换为窗口根控件树。
use flor::platform::WindowId;
use flor::view::View;
use flor_lys::label::label;
fn build_view(_window_id: WindowId) -> impl View {
label("hello flor ~")
}
WindowOption::default().open(build_view)?;
如果不需要使用窗口 ID,就写成 _window_id。
open 参数里的 WindowId 怎么用
open(move |window_id| { ... }) 里的 window_id 不建议在根视图构建阶段直接调用窗口控制方法。此时窗口正在完成初始化,Flor 还在挂载根视图、注册渲染器、初始化焦点和刷新布局;在这个闭包里直接 set_size、set_window_mode、request_redraw、destroy 等,容易让初始化顺序超出预期,产生额外重绘、布局状态不同步或平台层行为问题。
这个 WindowId 更适合被捕获到控件事件里,用来在后续事件中操控当前窗口:
use flor::platform::base::WindowApi;
use flor::view::builder::EventBuilder;
use flor_lys::button::button;
WindowOption::default().open(move |window_id| {
button("关闭窗口").on_click(move || {
let _ = window_id.destroy();
})
})?;
如果只是设置初始标题、尺寸、背景色、刷新模式,应优先写在 WindowOption 字段里,而不是在 open 的闭包里再改。
WindowId
WindowId 是平台窗口的句柄封装。当前 Windows 平台实现中它是:
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct WindowId(pub isize);
它实现了 WindowApi 和 WindowOperations。调用这些方法时需要导入 trait:
use flor::platform::base::{WindowApi, WindowOperations};
use flor::platform::WindowId;
创建与生命周期
显示与窗口模式
WindowMode 包含 Normal、Minimized、Maximized、Fullscreen。当前 Windows 实现里,Fullscreen 暂时按最大化处理。
位置与尺寸
位置使用 i32,允许多显示器环境里的负坐标;尺寸使用 u32。
DPI、输入法与鼠标
重绘
普通控件状态变化会由 Flor 自动请求重绘。只有在你直接通过窗口或平台能力改了框架无法感知的外部状态时,才需要手动调用 request_redraw()。