ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

如何快速实现Cushy多窗口:Open、WindowHandle、全屏与窗口缩放完全指南

如何快速实现Cushy多窗口:Open、WindowHandle、全屏与窗口缩放完全指南 如何快速实现Cushy多窗口Open、WindowHandle、全屏与窗口缩放完全指南【免费下载链接】cushyAn experimental cross-platform graphical user interface (GUI) crate for Rust.项目地址: https://gitcode.com/gh_mirrors/cu/cushyCushy 是一个用 Rust 编写的实验性跨平台 GUI 库wgpu 驱动、响应式数据模型。本指南带你快速掌握 Cushy 的多窗口编程通过Opentrait 打开窗口、用WindowHandle控制关闭与重绘、实现 Borderless 与 Exclusive 两种全屏模式并用zoom与inner_size完成窗口缩放全程只需几个简短的代码片段。核心概念先认识 4 个类型在动手之前先记住 Cushy 多窗口体系的 4 个关键类型源码见 src/app.rs 与 src/window.rs类型作用一句话理解Opentrait提供open()/run_in()“谁能被打开成窗口”App/PendingApp应用句柄多窗口的“总调度器”WindowHandle打开后返回的窗口句柄可请求关闭、重绘、失效Window/PendingWindow窗口构建器设置标题、尺寸、全屏、缩放等属性open(app)在已运行的应用中打开一个新窗口返回WindowHandlerun()/run_in(app)作为主入口运行阻塞直到应用退出。 新手最常踩的坑run()只能调用一次。想动态开第二个窗口就必须先创建PendingApp改用open()。步骤一打开第一个 Cushy 窗口单窗口程序最简单任何实现了MakeWidget的组件都能直接run()Hello, Cushy!.into_button().run()多窗口程序则从PendingApp起步这是官方多窗口示例的固定套路见 examples/window-multi.rslet mut app PendingApp::default(); // 第一个窗口用 open() 打开而不是 run() my_widgets.into_rows().centered().open(mut app)?; // 应用真正开始运行的只有一行 app.run()步骤二动态打开新窗口 WindowHandle 控制关闭WindowHandle在多窗口中是“遥控器”。在打开窗口前调用window.handle()就能拿到句柄把它捕获进闭包即可让按钮主动关闭窗口完整代码见 examples/window-multi.rslet window PendingWindow::default(); let handle window.handle(); window .with_root( This is window #1 .and(Close.into_button().on_click(move |_| { handle.request_close(); // 用句柄请求关闭 })) .into_rows(), ) .on_close(|| open_count.map_mut(|n| *n - 1)) // 关闭时回收统计 .open(mut app)?;WindowHandle的主要能力定义于 src/window.rsrequest_close()请求关闭窗口可被on_close_requested拦截redraw()请求重绘invalidate(widget)标记某个组件失效并刷新。配合共享的Dynamic计数器就能实时显示“当前打开了几个窗口、累计打开了几个”——这正是window-multi示例的玩法。跨窗口共享纹理资源Cushy 让多个窗口共享资源非常自然在open()之前加载好纹理克隆引用塞进每个新窗口即可。examples/window-multi.rs 中的做法// 加载一次所有窗口共享 let texture include_texture!(assets/ferris-happy.png) .expect(valid image);因为LazyTexture、Dynamic都是廉价克隆的共享引用N 个窗口之间传递图片、状态都不产生额外开销。全屏模式Borderless 与 Exclusive 两种玩法Window::fullscreen()接收一个DynamicOptionFullscreen定义见 src/window.rs这意味着全屏状态可以实时切换——官方示例 examples/fullscreen.rs 就把它做成了单选按钮列表Fullscreen::Borderless(Some(monitor))无边框全屏跟随显示器默认分辨率Fullscreen::Exclusive(mode)独占模式指定具体的视频模式分辨率 刷新率 色深。// 响应式切换全屏改变 fullscreen 的 Dynamic窗口立即响应 fullscreen .new_radio(Some(Fullscreen::Borderless(Some(monitor.handle().clone())))) .labelled_by(Borderless Fullscreen);显示器信息通过app.monitors()获取参考 examples/monitors.rs可以枚举所有显示器及其可用视频模式做“目标显示器 目标分辨率”的二级选择。窗口缩放zoom 因子与 inner_size 调整Cushy 的“缩放”有两层含义按需选用1️⃣zoom()—— 内容缩放因子.zoom()接收DynamicFraction与 DPI 缩放相乘后作用于整个 UI见 src/window.rs。示例 examples/window-zoom.rs 用一个滑杆在 1/4 到 4 倍之间实时缩放let zoom Dynamic::new(Fraction::ONE); zoom.map_each(|z| z.to_string()) .and(zoom.clone().slider_between(Fraction::new(1, 4), Fraction::new(4, 1))) .into_rows() .into_window() .zoom(zoom) // 滑杆一动整个窗口跟着缩放 .run()这是实现“缩放 100% / 200% / 400%”这类 UI 设置项的标准做法。2️⃣inner_size()—— 窗口尺寸.inner_size()是双向同步的Dynamic窗口被用户拉大时它更新反过来给它赋新值就会向操作系统请求调整窗口大小见 src/window.rs。window.inner_size(Dynamic::new(Size::upx(800, 600)));其他常用几何属性outer_size()/outer_position(pos, auto)可双向同步位置实现“居中年”等功能参考 examples/window-properties.rs、maximized()/minimized()/visible()/focused()全部遵循同样的“绑定一个 Dynamic双向自动同步”的模式。关闭回调on_close 与可拦截的 on_close_requested回调时机典型用途on_open窗口打开时收到WindowHandle初始化、统计窗口数on_close窗口关闭后清理资源、更新计数on_close_requested用户请求关闭时返回false可阻止关闭未保存修改提醒想实现“未保存修改时弹出确认”的效果用on_close_requested返回bool即可拦截定义见 src/window.rs配合消息框examples/message-box.rs就能做出完整的“是否保存”流程。另外open_centered()可以让窗口自动在所在显示器上居中打开实现见 src/window.rs避免新窗口出现在角落。核心 API 速查表 API位置作用widget.run()/.open(mut app)src/app.rs运行主入口 / 打开新窗口PendingApp::default()应用句柄多窗口的起点window.handle()→WindowHandlesrc/window.rs获取窗口句柄handle.request_close()/.redraw()同上关闭请求 / 重绘.fullscreen(dynamic)src/window.rs无边框 / 独占全屏.zoom(dynamic Fraction)src/window.rs内容缩放因子.inner_size(dynamic)src/window.rs双向同步窗口尺寸.on_close()/.on_close_requested()src/window.rs关闭回调 / 拦截关闭动手实践推荐示例清单按顺序运行这些官方示例效果立竿见影均位于 examples/ 目录cargo run --example window-multi—— 多窗口 共享纹理 句柄关闭cargo run --example fullscreen—— 显示器枚举 两种全屏模式实时切换cargo run --example window-zoom—— 滑杆驱动的窗口缩放cargo run --example window-properties—— 位置、尺寸、焦点等属性全同步cargo run --example window-debug—— 按钮动态开窗 关闭时更新计数。总结Cushy 的多窗口编程围绕一条清晰的主线PendingApp是起点open()开窗口WindowHandle控窗口Dynamic同步一切状态。全屏、缩放、位置这些看似繁琐的平台细节都被统一成“绑定一个响应式 Dynamic”的模式——改值即生效跨窗口共享资源也只需克隆引用。掌握 examples/window-multi.rs 这一个文件你就拥有了多窗口 Rust GUI 应用的全部骨架。【免费下载链接】cushyAn experimental cross-platform graphical user interface (GUI) crate for Rust.项目地址: https://gitcode.com/gh_mirrors/cu/cushy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表