更新 DrawingArea 的绘图函数
Update drawing function of a DrawingArea
我想更新 DrawingArea 中的 cairo 绘图。我试图通过使用新函数作为参数调用 DrawingArea::connect_draw(...)
来实现这一点。我的问题是它没有替换原来的绘图函数,而是在显示 window 时同时调用这两个函数。
这是一个例子
extern crate cairo;
extern crate gio;
extern crate gtk;
use gio::prelude::*;
use gtk::prelude::*;
fn main() {
let application = gtk::Application::new(Some("com.example"), Default::default())
.expect("Initialization failed...");
application.connect_activate(|app| {
build_ui(app);
});
application.run(&vec![]);
}
fn build_ui(application: >k::Application) {
let window = get_window(application);
let drawing_area = Box::new(gtk::DrawingArea::new)();
// Set drawing function
drawing_area.connect_draw(|_, ctx| draw(ctx, 0.5, 2.0));
// Change drawing function
drawing_area.connect_draw(|_, ctx| draw(ctx, 0.9, 1.0)); // <-- Why is this not working as expected?
window.add(&drawing_area);
window.show_all();
}
fn get_window(application: >k::Application) -> gtk::ApplicationWindow {
let window = gtk::ApplicationWindow::new(application);
window.set_default_size(500i32, 500i32);
// Set transparency
set_visual(&window, None);
window.connect_screen_changed(set_visual);
window.set_app_paintable(true);
window
}
fn draw(ctx: &cairo::Context, param1: f64, param2: f64) -> gtk::Inhibit {
ctx.scale(500f64, 500f64);
ctx.set_source_rgba(1.0, 0.2, 0.2, param1);
ctx.arc(0.5, 0.5, 0.2, 0.0, 3.1414 * param2);
ctx.fill();
Inhibit(false)
}
fn set_visual(window: >k::ApplicationWindow, _screen: Option<&gdk::Screen>) {
if let Some(screen) = window.get_screen() {
if let Some(ref visual) = screen.get_rgba_visual() {
window.set_visual(Some(visual));
}
}
}
我希望显示半个圆圈。然而,旧的、完整的圆圈仍然存在,即使我试图替换 connect_draw。我该如何正确替换它?
使用 connect_draw
函数附加另一个信号处理程序,但不会替换现有的处理程序。然而,函数 returns 一个 SignalHandlerId
然后你应该能够使用它来使用 signal_handler_disconnect
函数断开你的原始信号处理程序(参见 https://gtk-rs.org/docs/glib/signal/fn.signal_handler_disconnect.html)。
我想更新 DrawingArea 中的 cairo 绘图。我试图通过使用新函数作为参数调用 DrawingArea::connect_draw(...)
来实现这一点。我的问题是它没有替换原来的绘图函数,而是在显示 window 时同时调用这两个函数。
这是一个例子
extern crate cairo;
extern crate gio;
extern crate gtk;
use gio::prelude::*;
use gtk::prelude::*;
fn main() {
let application = gtk::Application::new(Some("com.example"), Default::default())
.expect("Initialization failed...");
application.connect_activate(|app| {
build_ui(app);
});
application.run(&vec![]);
}
fn build_ui(application: >k::Application) {
let window = get_window(application);
let drawing_area = Box::new(gtk::DrawingArea::new)();
// Set drawing function
drawing_area.connect_draw(|_, ctx| draw(ctx, 0.5, 2.0));
// Change drawing function
drawing_area.connect_draw(|_, ctx| draw(ctx, 0.9, 1.0)); // <-- Why is this not working as expected?
window.add(&drawing_area);
window.show_all();
}
fn get_window(application: >k::Application) -> gtk::ApplicationWindow {
let window = gtk::ApplicationWindow::new(application);
window.set_default_size(500i32, 500i32);
// Set transparency
set_visual(&window, None);
window.connect_screen_changed(set_visual);
window.set_app_paintable(true);
window
}
fn draw(ctx: &cairo::Context, param1: f64, param2: f64) -> gtk::Inhibit {
ctx.scale(500f64, 500f64);
ctx.set_source_rgba(1.0, 0.2, 0.2, param1);
ctx.arc(0.5, 0.5, 0.2, 0.0, 3.1414 * param2);
ctx.fill();
Inhibit(false)
}
fn set_visual(window: >k::ApplicationWindow, _screen: Option<&gdk::Screen>) {
if let Some(screen) = window.get_screen() {
if let Some(ref visual) = screen.get_rgba_visual() {
window.set_visual(Some(visual));
}
}
}
我希望显示半个圆圈。然而,旧的、完整的圆圈仍然存在,即使我试图替换 connect_draw。我该如何正确替换它?
使用 connect_draw
函数附加另一个信号处理程序,但不会替换现有的处理程序。然而,函数 returns 一个 SignalHandlerId
然后你应该能够使用它来使用 signal_handler_disconnect
函数断开你的原始信号处理程序(参见 https://gtk-rs.org/docs/glib/signal/fn.signal_handler_disconnect.html)。