我正在尝试将Ruby应用程序从GTK2移植到GTK3,但是我没有找到将GdkPixbufs绘制到窗口的方法。对于GTK2,我使用下面的简单代码将11个位图绘制到嵌入在父窗口中的GtkImage中:
def counter_setup
@dpix = Gdk::Pixmap.new(@counter.window, 11*DIGIT_WIDTH, DIGIT_HEIGHT, -1)
@digits = []
10.times { |i| @digits[i] = GdkPixbuf::Pixbuf.new(file: Cfg.icons_dir+"#{i}digit.png", width: DIGIT_WIDTH, height: DIGIT_HEIGHT) }
@digits[10] = GdkPixbuf::Pixbuf.new(file: Cfg.icons_dir+"unlitdigit.png", width: DIGIT_WIDTH, height: DIGIT_HEIGHT)
@digits[11] = GdkPixbuf::Pixbuf.new(file: Cfg.icons_dir+"colondigit.png", width: DIGIT_WIDTH, height: DIGIT_HEIGHT)
@digits[12] = GdkPixbuf::Pixbuf.new(file: Cfg.icons_dir+"minusdigit.png", width: DIGIT_WIDTH, height: DIGIT_HEIGHT)
reset_counter
end
def reset_counter
11.times do |i|
if i == 2 || i == 8
@dpix.draw_pixbuf(nil, @digits[11], 0, 0, i*DIGIT_WIDTH, 0, DIGIT_WIDTH, DIGIT_HEIGHT, Gdk::RGB::DITHER_NONE, 0, 0)
elsif i == 5
@dpix.draw_pixbuf(nil, @digits[12], 0, 0, i*DIGIT_WIDTH, 0, DIGIT_WIDTH, DIGIT_HEIGHT, Gdk::RGB::DITHER_NONE, 0, 0)
else
@dpix.draw_pixbuf(nil, @digits[10], 0, 0, i*DIGIT_WIDTH, 0, DIGIT_WIDTH, DIGIT_HEIGHT, Gdk::RGB::DITHER_NONE, 0, 0)
end
end
@counter.set(@dpix, nil)
end
counter_setup方法从文件构建pixbuff,并从GtkImage(@ counter.window)创建一个pixmap。 reset_counter在窗口中并排显示每个pixbuf,看起来像这样:
在图像上(取自GTK2版本),它是左上角的小部件,一个计时器,每秒重绘一次,这就是为什么它不是单个位图而是一系列位图的原因。
[从GTK3文档开始,像素图不见了,据说应该改用开罗。问题是,我发现将位图写入开罗上下文的唯一方法是set_source_pixbuf,但它无法完成我想要的操作...
有人知道如何使用GTK3实现相同的行为吗?
感谢您的帮助!
这是关于此主题的官方GTK 2对3迁移指南:https://developer.gnome.org/gtk3/stable/ch26s02.html#id-1.6.3.4.5
[您没有提到您尝试使用set_source_pixbuf
的原因,或者为什么它不起作用,但您是否尝试像此处给出的示例那样用pixbuf填充表面?
或者,您可能会发现,使用一系列彼此相邻放置的GtkImage小部件,并适当地将pixbuf设置为其来源,会更容易。