创建大量Gtk小部件而不是在方法中传递上下文是否更好?

时间:2014-03-16 18:19:22

标签: c++ gtk gtkmm

我是GTK / GTK ++的新手,我来自MFC,所以我知道我有几个坏习惯可以摆脱;)

我想知道在Gtk::DrawingArea中绘制UI块的最佳方法(如在"效率最高")。这些块可以在绘图区域的任何位置绘制(我不能使用堆栈或表格)。

现在我已经创建了一个班级UIBlock,并在其中添加了Draw()方法。因此,在Gtk::DrawingArea::on_draw()的派生版本中,我调用所有UIBlock::Draw()并向其转移我为绘制文本而创建的Cairo::RefPtr<Cairo::Context>Glib::RefPtr<Pango::Layout>

所以我有类似的东西:

// MyDrawingArea.h
class MyDrawingArea : public Gtk::DrawingArea
{
protected:
    virtual bool on_draw(Cairo::RefPtr<Cairo::Context> const& cr) override;

private:
    std::vector<UIBlock> m_uiBlockList;
}

// MyDrawingArea.cpp
bool MyDrawingArea::on_draw(Cairo::RefPtr<Cairo::Context> const& cr)
{
    for(UIBlock const* uiBlock : m_uiBlockList)
    {
        uiBlock->Draw(cr, layout); // I've got a few other parameters like a bunch
                                   // of layouts for the different fonts I use,
                                   // the UI block position, etc...
    }
}

我想知道这个解决方案是否合适,或者只是从UIBlock简单地导出我的Gtk::Widget课程会更容易,更有效率。

希望我清楚我的问题;) 谢谢!

修改 正如我在drahnr的回答中所说,GooCanvas不是一个选项,因为它是not developed anymore。下一代画布API是Clutter,但它在GTK中的集成是still being worked on

所以我现在继续使用我自己的开罗解决方案。但是我仍然需要知道是否有很好的做法可以在画布上显示很多矩形和文本。这是我现在所拥有的screenshot,但是当我有几十万个矩形时,它有点慢......

1 个答案:

答案 0 :(得分:1)

您正在重新实现GooCanvas(除非您有进一步的限制,但未提及) - 它有一个GooCanvasItem,可以定期GtkWidget s(称为GooCanvasWidget)。

https://wiki.gnome.org/action/show/Projects/GooCanvas?action=show&redirect=GooCanvas