为什么draw_picture调用了那么多次?

时间:2020-10-27 15:41:27

标签: gtk vala

当我运行以下程序时:

//compile: valac --pkg gtk+-3.0 sample.vala
using Gtk;

public class Main : Object
{
    private Window window;
    private Gdk.Pixbuf pixbuf;
    private DrawingArea da1;

    public Main()
    {
        window = new Window();
        window.destroy.connect (main_quit);
        pixbuf = new Gdk.Pixbuf.from_file("sample.jpg");
        var box = new Box (Orientation.VERTICAL, 5);
        da1 = new DrawingArea();
        da1.set_hexpand(true);
        da1.set_vexpand(true);
        da1.draw.connect((context) => draw_picture(context, pixbuf));
        box.pack_start (da1, true, true, 0);
        window.add (box);
        window.show_all();
    }


    bool draw_picture(Cairo.Context cr, Gdk.Pixbuf pixbuf)
    {
        print("draw_picture\n");
        int width  = da1.get_allocated_width();
        int height = da1.get_allocated_height();

        var temp = pixbuf.scale_simple(width, height, Gdk.InterpType.BILINEAR);
        Gdk.cairo_set_source_pixbuf (cr, temp, 0, 0);
        cr.paint ();
        
        return false;
    }


    static int main(string[] args)
    {
        Gtk.init(ref args);
        var app = new Main();
        Gtk.main();

        return 0;
    }

}

启动后,我可以看到'draw_picture'被打印了2次。当我将窗口切换到终端时,它会额外显示7次。谁能解释为什么,并推荐一些解释细节的好书?

1 个答案:

答案 0 :(得分:0)

为了肯定地回答该问题,您需要查看窗口管理器的工作方式。切换到另一个窗口时发生的重绘可能是由于窗口小部件的窗口不再是活动窗口时该窗口小部件获得了:backdrop伪类。

通常,每当窗口管理器需要重新绘制包括小部件的窗口部分时,以及每当小部件的活动样式发生变化时,便会调用小部件的draw信号。

如果重新绘制小部件的成本很高,则可以在不需要时避免绘制整个图形。开罗上下文的剪辑区域将设置为需要重绘的部分。