如何使用gtk :: DrawingArea?

时间:2018-03-01 23:29:38

标签: rust gtk

我正在尝试使用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

1 个答案:

答案 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。你可能想看一下。