跳到主要内容

窗口初始化

现在我们将介绍如何用winit初始化窗口。

首先我们需要将winit加入到依赖中

# Cargo.toml
# ...
[dependencies]
winit = "0.29"

然后创建窗口

#![windows_subsystem = "window"]

fn main() {
let event_loop = winit::event_loop::EventLoop::new().unwrap();
let window = winit::window::WindowBuilder::new()
.with_title("标题")
.build(&event_loop).unwrap();

event_loop.run(|event, target| match event {
_ => (),
}).unwrap();

Ok(())
}

完事,走人。

没错,只有短短三行,我们就完成了窗口初始化,念及此我不禁感叹winit的伟大。

还是要解释一下上面的代码的,winit中的类型winit::event_loop::EventLoop是winit中用来传递窗口事件的类型,本身除了EventLoop::run以外没有什么特别值得关注的函数。值得注意的是EventLoop可以传入用户自定义的事件,详情请阅读EventLoop的文档

winit::window::Window便是窗口的主体了,主要负责保管窗口句柄,窗口大小,光标位置等的数据,具体可以设置以及获取的数据请参见Window的文档WindowBuilder的文档。值得一提的是Window实现了HasRawWindowHandle,所以可以直接将&Window作为各类图形库的窗口句柄输入。

EventLoop::run接受F: FnMut(Event<T>, &EventLoopWindowTarget),作为回调函数。第一个参数显然是窗口发送的事件,第二个参数是允许控制窗口状态和进行窗口操作的对象。在其中,你可以关闭窗口,设置窗口的等待状态,甚至创建新的窗口。我们暂时没有使用它,但是在下一章中我们会用它对一些窗口事件做出响应。

提示: 开头的#![windows_subsystem = "window"]标签将会在Windows平台编译时将入口点改为WINMAIN,因而使得程序启动时不会弹出一个CMD。不需要的读者可以自行删去这一行。其他平台不会受到该标签的影响。

下一节,我们将会介绍如何处理窗口发送的事件,并且确定程序循环的主体。