17 个版本
0.1.5 | 2022年11月9日 |
---|---|
0.1.4 | 2022年10月29日 |
0.0.15 | 2022年10月18日 |
0.0.14 | 2022年9月22日 |
#23 in #window-manager
60 每月下载量
110KB
2K SLoC
DGEWS
DGEWS 是一个仅用于学习目的的简单多线程玩具窗口系统。
[dependencies]
dgews="0.1.4"
DGEWS 是一个仅适用于 Windows 用户的标准窗口管理器。它非常简单直接,因此任何人都可以理解,有时甚至可以从中 学习 一些东西。实际上,我的目标是学习编写实用crate的周期以及它们的开发。
用法
DGEWS 使用 C++ Win32 API 库包装器 winapi 来构建其窗口。因此,除了 Windows OS 用户外,其他人不能使用这个crate。目前,这个crate还不稳定,有时会崩溃,因此最好不要在生产环境中使用它(尽管我认为当 winit crate 可以使用时,没有人会使用它)。但是,如果有人想在他们的项目中使用其一些功能,只需将其作为我所说的仅用于教育目的即可。
示例
Manager 是此crate的核心:它处理所有内容,用户从其中检索事件消息。此外,使用它创建窗口或窗口。 run() 方法接受一个闭包,必须在每个事件中调用,用户将获得事件、管理器本身以及主事件循环的控制流。
extern crate dgews;
use dgews::prelude::*; // prelude module contains everything
fn main() {
let mut manager = Manager::new(WindowBuilder::default()
.with_title("DGEWS Window")
.with_dimensions(800, 640)
.with_theme(Theme::Dark)
.with_resizable(true))
.add_window("Hooray", WindowBuilder::new()
.with_title("Finally")
.with_dimensions(400, 300)
.with_theme(Theme::Dark)
.with_pos(700, 700));
manager.run(|events, control_flow, manager| {
match events {
Events::WindowEvents { id, event } => match event {
WindowEvents::Create => println!("[INFO]: a new window with id: {} has been created", id),
WindowEvents::Close => {
println!("[INFO]: a window with id: {} has been closed", id);
*control_flow = ControlFlow::Exit; // to exit with panicing, use ControlFlow::ExitWithCode(<your number>) instead.
},
WindowEvents::SetFocus => println!("[INFO]: window with id: {} gained the focus", id),
WindowEvents::LostFocus => println!("[INFO]: window with id: {} Lost the focus", id),
_=> {}
},
Events::MouseEvents { id: _, event } => match event {
MouseEvents::MouseMove { x, y, last_x, last_y, dx, dy } => {
println!("[INFO]: mouse moved in the window with id {}: x={}, y={}, last_x={}, last_y={} dx={} dy={};", manager.window().unwrap().get_id(), x, y, last_x, last_y, dx, dy);
},
_=> {}
}
_=> *control_flow = ControlFlow::Continue,
}
if manager.get_key(Key::ESCAPE) == Action::Release {
println!("[INFO]: program is exiting");
*control_flow = ControlFlow::Exit;
}
});
}
特性
当前特性
- 多线程:窗口有自己的线程,并从那里发送消息,因此当用户交互时,窗口将不断刷新,无需等待用户完成事件;
- Winit 风格:当我第一次看到 winit crate 时,我真的很喜欢它的结构。因此,我决定做一些与之类似的东西;
- 图标:用户可以使用自己的图标;
- 主题:目前只有浅色和深色主题;
- 准备事件处理:实际上需要做一些工作,所以如果您有任何建议或想法,请不要犹豫;
- 简单:只需浏览一下 文档 就足以掌握所有内容;
- HasRawWindowHandle 和 HasRawDisplayHandle 特性已实现,因此您可以与其他crate(如wgpu-rs)一起使用它们;
尚未实现(换句话说 特性)
- 尚未准备好:它仅处于 beta 模式;
- 系统键错误:我不知道为什么,但某些系统键(如Alt键)无法正常工作。为了获得 Action::Press,您必须按两次!;
- 不跨平台:我使用了 Windows API crate,因此没有跨平台支持 😔;
计划
- 更好的文档:我认为它的文档“相当不错”。但仍有更多可以使其更加完善和用户友好的地方。
- 修复错误:我正在解决类似系统密钥问题或窗口无法打开等问题。
贡献
欢迎所有愿意为文档做出贡献的人。提前感谢。请通过以下方式联系我:
- 我的Outlook邮箱地址:[email protected];
- 或谷歌邮箱地址:[email protected];
- 以及我的Telegram ID:@MrTitanHearted;
我是一名高中学生,因此我认为您可能不会立即收到回复,但我会尽力尽快回复。
许可证
依赖项
~70-295KB