【发布时间】:2014-09-03 21:11:57
【问题描述】:
我在 Ubuntu 12.04 LTS 32 位上使用带有 gtkmm3 的 GNU 工具链的 C++11。 我一直在尝试Programming with gtkmm 3 中 gtkmm3 的一些示例。
基于那里的17.2.1.Example,我从Gtk::DrawingArea(这里的MyDrawingArea)继承并覆盖on_draw()事件处理程序,如下所示:
MyDrawingArea.hpp
...
protected:
bool on_draw ( const Cairo::RefPtr<Cairo::Context>& cr ) override;
MyDrawingArea.cpp (又快又脏,只是为了概念演示)
double y{ 10 };
double x{ 10 };
bool MyDrawingArea::on_draw( const Cairo::RefPtr<Cairo::Context>& cr )
{
this->get_window( )->freeze_updates( );
cr->set_line_width( 3.0 );
cr->set_source_rgb( 1, 0, 0 );
cr->move_to( x, y );
cr->line_to( x * 2, y * 2 );
cr->stroke( );
this->get_window( )->thaw_updates( );
x += 50;
y += 50;
return true;
}
此代码绘制一条对角线。当我通过应用程序中的事件处理程序调用MyDrawingArea.queue_draw() 时,我希望它的位置发生变化。这有效:
事件 1: 活动二:
我的问题是,很明显,on_draw() 事件处理程序会在每次重新绘制窗口时触发。简单地移动应用程序的主窗口(包含MyDrawingArea)会导致on_draw() 触发,并且该行将呈现在新位置。
如何控制我的on_draw() 事件中的代码何时运行,以便仅当我在应用程序代码中调用MyDrawingArea.queue_draw() 时重新呈现该行,但在其他时间保持之前的状态? (我不认为我在问如何防止on_draw() 被解雇,但也许这就是必须发生的事情?)
只需设置一个标志,通知我的事件已进行调用,然后才运行我的代码来呈现该行会引发其他问题,因为当未设置该标志时,我会丢失之前呈现的所有内容。
这似乎是不可能的情况:对于每个on_draw() 事件,要么在新位置重新绘制线条,要么在我使用标志调用我的绘图逻辑时完全删除,并且on_draw() 在该标志被触发时触发没有设置。
我应该如何处理这个问题?我是否需要逻辑来管理两个不同的on_draw() 选项:如果应用程序进行调用,则呈现该行的新版本,如果不是,则重新绘制旧版本?这变得复杂 - 我想我错过了一些东西。我应该使用不同的事件吗?我可以通过某种方式从Cairo::Context 获得有关谁打电话给On_draw() 等的信息,这将有助于我解决这个问题吗?
【问题讨论】: