如何将GTK2像素图移植到GTK3 _

问题描述 投票:0回答:1

我正在尝试将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,看起来像这样:

enter image description here

在图像上(取自GTK2版本),它是左上角的小部件,一个计时器,每秒重绘一次,这就是为什么它不是单个位图而是一系列位图的原因。

[从GTK3文档开始,像素图不见了,据说应该改用开罗。问题是,我发现将位图写入开罗上下文的唯一方法是set_source_pixbuf,但它无法完成我想要的操作...

有人知道如何使用GTK3实现相同的行为吗?

感谢您的帮助!

gtk3 gtk2
1个回答
0
投票

这是关于此主题的官方GTK 2对3迁移指南:https://developer.gnome.org/gtk3/stable/ch26s02.html#id-1.6.3.4.5

[您没有提到您尝试使用set_source_pixbuf的原因,或者为什么它不起作用,但您是否尝试像此处给出的示例那样用pixbuf填充表面?

或者,您可能会发现,使用一系列彼此相邻放置的GtkImage小部件,并适当地将pixbuf设置为其来源,会更容易。

© www.soinside.com 2019 - 2024. All rights reserved.