- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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
bool MyDrawingArea::on_draw( const Cairo::RefPtr<Cairo::Context>& cr )
{
Gtk::Allocation allocation = get_allocation( );
const int width = allocation.get_width( );
const int height = allocation.get_height( );
int coord1{ height - 3 };
cr->set_line_width( 3.0 );
this->get_window( )->freeze_updates( );
cr->set_source_rgb( 0, 0.40, 0.60 );
cr->move_to( 0, coord1 );
cr->line_to( width, coord1 );
cr->stroke( );
cr->set_source_rgb( 1, 0.05, 1 );
cr->move_to( mXStart, coord1 );
cr->line_to( mXStart, mYAxis * 1.5 );
cr->show_text( to_string( mYAxis ) );
cr->stroke( );
mXStart += 5;
this->get_window( )->thaw_updates( );
return true;
}
我的目标是根据我在一个小测试应用程序中所做的计算绘制一个简单的条形图,想法是每次调用 on_draw()
事件时,下一个条形图将是在 mXAxis
上向右移动 5 个单位,将根据新的 mYaxis
值绘制一条垂直线,该值是根据新计算的结果计算的。
当我想重新绘制图形并触发 MyDrawingArea::on_draw() 事件时,我在计算完成并设置了新的 x 轴和 y 轴后从我的应用程序调用 MyDrawingArea.show_all() 。
然而,这并没有像我预期的那样工作:MyDrawingArea.show_all()
使整个绘图窗口无效并从头开始绘制:新图形线出现在适当的位置,但是之前的都被抹掉了。我也试过MyDrawingArea.queue_draw()
,效果一样。 但我想保留以前的图表结果,以便在使用不同的值进行计算时获得计算结果的概况。
此实现还导致我的图形上的底线(我在图形上的 x 轴)- 由我的代码示例中的第一个 stroke()
调用绘制,在每次调用时重新呈现到 on_draw() - 虽然这不应该是必要的,因为这条线在 MyDrawingArea
的生命周期内持续存在 - 没有必要在每个新的 on_draw() 上使其无效然后重新绘制
事件,正如我的代码目前所做的那样,因为我还没有找到处理这个问题的方法。
我是 Cairo 的新手,所以我确定我做的这件事可能完全错了,但是明确的、面向任务的文档似乎很少——没有找到任何解释如何做的东西,尽管我我相信这很简单。
我需要做什么才能在 Gtk::DrawingArea
上绘制一条新线,同时保留在之前的遍中已经绘制的先前图形线,并建立将要绘制的图形元素在 Gtk::DrawingArea
小部件的生命周期内持续存在。显然,使用 show_all()
或 queue_draw()
并在 on_draw()
事件中完成这一切并不是可行的方法。
最佳答案
通常,您必须绘制整个小部件,Cairo 会将绘图裁剪到预定义的脏区域。有关性能提示的“GtkWidget::draw”信号,另请参阅 GTK 引用手册:
The signal handler will get a cr with a clip region already set to the widget's dirty region, i.e. to the area that needs repainting. Complicated widgets that want to avoid redrawing themselves completely can get the full extents of the clip region with gdk_cairo_get_clip_rectangle(), or they can get a finer-grained representation of the dirty region with cairo_copy_clip_rectangle_list().
因此您可以使用 gtk_widget_queue_draw_area() 仅重绘您想要的区域。
关于c++11 - 如何在 Gtk::DrawingArea 区域绘制一条新线,同时保留之前已经绘制的线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24530471/
一段时间以来,我一直在做这个反复出现的噩梦(阅读 - 我的应用程序中的错误)。出于某种原因,某个计时器在我停止后继续发送“Elapsed”事件,即使 在事件本身 计时器“承认”已被禁用!检查一下: /
为了找到 2 个 git 分支的共同祖先,需要做的是: git merge-base branch another_branch 好的。但是……如果两个分支都已经 merge 了怎么办?当我在这种情况
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 1年前关闭。 Improve this
我想要一个相机 View ,可以将图像捕获到本地文件或让用户从本地照片库中选择图像。我想也许有人为此编写了很好的库/代码。也许我可以利用它。已经有好的了吗?谢谢。我只是避免重新发明轮子:) 最佳答案
我从 master 分支创建了一个功能分支。之后有来自功能分支的提交 [F1]。 [F1] -- Feature Branch / [M1]-[M2
我喜欢使用 .NET 进行编程,尤其是 C# 3.0、.NET 3.5 和 WPF。但我特别喜欢的是 Mono .NET 确实与平台无关。 现在我听说了 Mono 中的 Olive 项目。我找不到某种
介绍和搜索 所以我认为我犯了一个严重的错误,我很担心。我已经分析了独立负责人的论坛,我已经接近找到答案,但场景太具体,不适用于我所在的位置。如果您找到可以回答我的问题的特定主题,请链接我。 例如:Ho
我有一个类似于下图的提交图。标记为 * 的提交表示大量提交。 A* | B--------- | | C* D* master 和 cor
我喜欢使用 .NET 进行编程,尤其是 C# 3.0、.NET 3.5 和 WPF。但我特别喜欢的是 Mono .NET 确实与平台无关。 现在我听说了 Mono 中的 Olive 项目。我找不到某种
我们最近接手了一个 .NET 项目,在查看 db 后,我们在某些列中有以下内容: 1)某些列具有诸如" & etc etc 2) 有些有 标签和其他非 html 编码的标签 这些数据
你好,当我导航到应用程序中的另一个页面时出现此错误 我不知道为什么这个错误出现 #0 _AsyncCompleter.complete (dart:async/future_impl.da
我使用以下 C 算法计算数据的 CRC32: #define CRC32_POLYNOM_REVERSED 0xEDB88320 uint32 calcCrc32(uint8* buffer, u
我试图在我的一个测试中断言模型中的字段没有改变。我知道从哲学上这是不正确的,但由于我控制了我需要知道的所有变量,所以我只想检查我的数据库条目是否没有改变。 我愿意接受一个解决方案,该解决方案可以将其转
我是 GitHub 的新手。并通过 Eclipse 使用它我们是两个人在开发一个应用程序。当我在 Git shell 中检查 git status 时,我得到以下状态。 On branch maste
简单代码: std::ifstream file("file.txt"); std::string line; while(getline(file,line)) ; //exhaust file
是的,我又找不到这个 Gradle DSL 方法:'compile()' 问题。 我检查了我有: buildscript { repositories { jcenter()
HTML: articles CSS: #main_menu { float: left; padding-top: 10px; vertical-align: m
我是一名优秀的程序员,十分优秀!