如何解决为什么draw_picture调用了那么多次?
当我运行以下程序时:
//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,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);
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次。谁能解释为什么,并推荐一些解释细节的好书?
解决方法
为了肯定地回答该问题,您需要查看窗口管理器的工作方式。切换到另一个窗口时发生的重绘可能是由于窗口小部件的窗口不再是活动窗口时该窗口小部件获得了:backdrop
伪类。
通常,每当窗口管理器需要重新绘制包括小部件的窗口部分时,以及每当小部件的活动样式发生变化时,便会调用小部件的draw
信号。
如果重新绘制小部件的成本很高,则可以在不需要时避免绘制整个图形。开罗上下文的剪辑区域将设置为需要重绘的部分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。