#winapi #window-manager #multi-threading #windows

dgews

仅用于学习目的的简单多线程玩具窗口系统

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

Download history 53/week @ 2024-04-03

60 每月下载量

MIT/Apache

110KB
2K SLoC

DGEWS

DGEWS 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 时,我真的很喜欢它的结构。因此,我决定做一些与之类似的东西;
  • 图标:用户可以使用自己的图标;
  • 主题:目前只有浅色和深色主题;
  • 准备事件处理:实际上需要做一些工作,所以如果您有任何建议或想法,请不要犹豫;
  • 简单:只需浏览一下 文档 就足以掌握所有内容;
  • HasRawWindowHandleHasRawDisplayHandle 特性已实现,因此您可以与其他crate(如wgpu-rs)一起使用它们;

尚未实现(换句话说 特性

  • 尚未准备好:它仅处于 beta 模式;
  • 系统键错误:我不知道为什么,但某些系统键(如Alt键)无法正常工作。为了获得 Action::Press,您必须按两次!;
  • 不跨平台:我使用了 Windows API crate,因此没有跨平台支持 😔;

计划

  • 更好的文档:我认为它的文档“相当不错”。但仍有更多可以使其更加完善和用户友好的地方。
  • 修复错误:我正在解决类似系统密钥问题或窗口无法打开等问题。

贡献

欢迎所有愿意为文档做出贡献的人。提前感谢。请通过以下方式联系我:


我是一名高中学生,因此我认为您可能不会立即收到回复,但我会尽力尽快回复。


许可证

  1. MIT许可证
  2. Apache 2.0许可证

依赖项

~70-295KB