gpt4 book ai didi

c++ - 如何控制代码何时在 gktmm3-Gtk::DrawingArea 的 on_draw 事件中执行

转载 作者:行者123 更新时间:2023-11-30 02:45:10 25 4
gpt4 key购买 nike

我在 Ubuntu 12.04 LTS 32 位上使用带有 GNU 工具链和 gtkmm3 的 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: enter image description here事件二: enter image description here

我的问题是,很明显,on_draw() 事件处理程序在每次重新绘制窗口时都会触发。只需移动应用程序的主窗口(其中包含 MyDrawingArea)即可触发 on_draw() 并将线条呈现在新位置。

我如何控制 on_draw() 事件中的代码何时运行,以便仅当我调用 MyDrawingArea.queue_draw()我的应用程序代码,但在其他时候保留了以前的状态? (我不认为我问的是如何防止 on_draw() 触发,但也许这就是必须发生的事情?)

简单地设置一个标志来通知我的事件已经进行了调用,然后才运行我的代码来渲染该行会引发其他问题,因为如果未设置该标志,我将丢失之前渲染的所有内容。

这似乎是一个不可能的情况:要么在每个 on_draw() 事件的新位置重新绘制线条,要么在我使用标志调用我的绘制逻辑时完全删除,并且 on_draw() 在未设置该标志时触发。

我应该如何管理它?我是否需要逻辑来管理两个不同的 on_draw() 选项:如果应用发出调用,则呈现新版本的线,如果没有,则重新绘制旧版本?这变得复杂 - 我想我错过了一些东西。我应该使用其他事件吗?我是否可以通过某种方式从 Cairo::Context 获取有关调用 On_draw() 的人的信息等,这将帮助我解决这个问题?

最佳答案

如果您打算使用切换按钮打开/关闭 Gtk.DrawingArea,只需询问切换按钮是否处于事件状态,而不是重绘该区域。

<!------ language python ------>
def on_draw (self, widget):
# your cairo draw here
......
......
if toggle_button.get_active () is True: #toggle to show DrawingArea
x+=50
y+=50
# other than that it simply sits there doing nothing

现在,关于断开“draw”信号。将 cr 的最后一个渲染拷贝放在缓冲区中的某个位置,当您准备再次触发它时,再次连接,但这次不要从“draw”信号中获取 cairo *cr参数。使用拷贝

关于c++ - 如何控制代码何时在 gktmm3-Gtk::DrawingArea 的 on_draw 事件中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24728296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com