我正在尝试使用GTK,Cairo和Glade在Rust中构建GUI。我想用false
画一个比赛场但我不知道如何使用它。我有这个:
gtk::DrawingArea
它编译并运行,但窗口上没有显示游戏区域。
我认为我没有正确使用extern crate cairo;
extern crate gtk;
use gtk::*;
fn main() {
gtk::init().unwrap(); //init gtk before using it
let glade_src = include_str!("Glade_gui.glade"); //build the glade gui
let builder = gtk::Builder::new_from_string(glade_src);
//get widgets from the gui
let draw_area: gtk::DrawingArea = builder.get_object("zeichenbrett").unwrap();
let window: gtk::Window = builder.get_object("fenster").unwrap();
let size = (600, 600); //define the size for the image
let style_context: gtk::StyleContext = draw_area.get_style_context().unwrap(); //get the style context from the drawing area
let surface: cairo::ImageSurface =
cairo::ImageSurface::create(cairo::Format::ARgb32, size.0, size.1).unwrap(); //build a new ImageSurface to draw on
let context: cairo::Context = cairo::Context::new(&surface); //build a new cairo context from that ImageSurface to draw on
//just a blue area
context.set_source_rgb(0.0, 0.0, 1.0);
context.paint();
context.stroke();
gtk::functions::render_background(
&style_context,
&context,
0.0,
0.0,
size.0 as f64,
size.1 as f64,
); //here I thought that I drew the context cairo::Context to the drawingArea but it seems to do nothing.
window.show_all();
gtk::main();
}
功能,但我不知道如何正确使用。
以下是Glade_gui.glade文件:
render_background
答案 0 :(得分:1)
作为一个注释,我没有Rust的经验,因此我主要使用C示例。
您正在尝试在启动gtk::main
之前渲染GUI。实现GTK + GUI的正确方法是添加小部件,将其draw
信号(以及任何其他必要信号)连接到您自己的绘制回调函数,然后运行gtk::main
。
举个例子,参考文档中找到的简单的GtkDrawingArea示例here。在此示例中,g_signal_connect
用于将draw
信号连接到draw_callback
回调函数。这样,当小部件实际由gtk::main
创建时,它将在其上绘制所需的图像。
您的draw_callback
函数会将Cairo上下文作为参数。您将在该上下文中完成所有绘图,因此无需创建自己的绘图。通过在cr
的参数中使用指针draw_callback
,在文档中也证明了这一点。
您的所有绘图都需要在draw
回调函数中完成。每当需要更新时(包括创建GtkDrawingArea小部件),它都会被调用,或者您可以通过发出queue_draw
信号强制进行更新。
即使使用其他语言,C docs也可以提供很大的帮助,特别是如果您选择的语言没有全面的文档。
此外,推荐的创建GTK +应用程序的现代方法是使用GtkApplication。你可能想看一下。