#icons #menu #applications #clipboard #context #tray #async

winctx

Windows上Rust的轻量级窗口上下文

19次发布

0.0.19 2024年2月11日
0.0.18 2023年12月18日

#269 in 异步

Download history 24/week @ 2024-04-19 537/week @ 2024-04-26

308 每月下载量

MIT/Apache

145KB
2.5K SLoC

winctx

github crates.io docs.rs build status

Windows上Rust的轻量级窗口上下文。

我阅读了msdn,所以你不必.

The showcase popup menu

这个crate提供了一个简洁的方法来设置和运行窗口。在Windows上,窗口更像是一个通用的应用程序框架,实际上并不需要任何可见的元素,但对于在Windows上执行许多可能想要执行的生产性任务来说却是必要的。

以下是一些例子:

因为这个crate提供了一些额外的API,因为它们也非常有用

这个crate是我从我的项目之间复制和粘贴的代码的组合和清理,所以它对我个人认为有用的东西有很强的意见。并非所有的事情都是可能的,但如果您缺少某些内容,并且喜欢Windows编程,请随时提出问题或发送pull request。


示例

这个crate的主要目的是

  • 定义一个窗口及其功能。即它是否应该有上下文菜单或接收剪贴板事件。
  • 处理窗口传入的事件

基本循环看起来像这样

use std::pin::pin;

use tokio::signal::ctrl_c;
use winctx::{Event, CreateWindow};

const ICON: &[u8] = include_bytes!("tokio.ico");

let mut window = CreateWindow::new("se.tedro.Example")
    .window_name("Example Application");

let icon = window.icons().insert_buffer(ICON, 22, 22);

let area = window.new_area().icon(icon);

let menu = area.popup_menu();

let first = menu.push_entry("Example Application").id();
menu.push_separator();
let quit = menu.push_entry("Quit").id();
menu.set_default(first);

let (sender, mut event_loop) = window
    .build()
    .await?;

let mut ctrl_c = pin!(ctrl_c());
let mut shutdown = false;

loop {
    let event = tokio::select! {
        _ = ctrl_c.as_mut(), if !shutdown => {
            sender.shutdown();
            shutdown = true;
            continue;
        }
        event = event_loop.tick() => {
            event?
        }
    };

    match event {
        Event::MenuItemClicked { item_id, .. } => {
            println!("Menu entry clicked: {item_id:?}");

            if item_id == quit {
                sender.shutdown();
            }
        }
        Event::Shutdown { .. } => {
            println!("Window shut down");
            break;
        }
        _ => {}
    }
}

依赖项

~14–23MB
~302K SLoC