DrawingArea:区域外的填充区域

Posted

技术标签:

【中文标题】DrawingArea:区域外的填充区域【英文标题】:DrawingArea: fill area outside a region 【发布时间】:2018-05-11 00:35:47 【问题描述】:

我已关注this gtkmm tutorial,了解如何绘制形状并用颜色填充它们(例如透明背景上的红色圆盘)。从这个例子中,我还能够推导出另一个蓝色背景上带有红色圆盘的例子。

但是,我真正需要的是一个蓝色背景的透明圆盘,它可以填充所有减去圆盘区域,它应该保持透明。

所以对于 cairo,通常的工作流程是:

    创建曲面 画一个形状(例如画一个圆) 填满圆圈,使它变成一个圆盘。

我需要一些工作流程来实现这样的目标:

    创建曲面 画一个形状(例如画一个圆) 填充圆圈外部的区域,这样我就有了一个彩色背景,中间有一个透明的“洞”。

我在网上对此进行了一些研究,但所有示例似乎都假设我们要填充形状的内部区域(我必须承认这是更典型的)。

我该怎么做?

附:我添加了 C 标记,因为我不介意您是否更喜欢使用 C(甚至 Python)。

【问题讨论】:

能否解释一下为什么这被否决了? 【参考方案1】:

画出你的圆圈并画一个包含所有可见区域的矩形。将 cairo 填充规则设置为偶数/奇数。填。完成。

cairo_save(cr); // Save the state
cairo_arc(cr, 42, 42, 21, 0, 2*M_PI); // Draw circle
cairo_rectangle(cr, 0, 0, width, height); // Rectangle containing everything
cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
cairo_fill(cr);
cairo_restore(cr); // Restore default fill rule (optional; pairs with save above)

【讨论】:

好的,你的解决方案很有趣。我已经简要地查看了偶数/奇数规则文档,但还没有理解它与我的情况有关。我还没有时间玩它,但我肯定会在本周末左右尝试一下并提供一些反馈。 感谢矩形,所有内容都包含在应该绘制的区域中。多亏了这个圈子,圈子里的所有东西都被包含在另一个时间(= 两次)。偶数/奇数只填充奇数包含的区域,因此矩形中的所有内容,而不是圆形,因为该部分包含两次(即偶数)。【参考方案2】:

恕我直言,“画圈外”的功能对图形框架来说很复杂。如果你在外面画了一个以上的圆圈,也可能会模棱两可。

由于稍后绘制的图形形状被放置在先前绘制的图形上。需要的是在绘制其他形状之前绘制一个矩形来填充整个图形上下文。这在某些框架中被定义为clear,带有背景色

工作流程看起来像: 1. 创建曲面。 2. 用圆圈外的颜色绘制背景。 3. 画出用特定颜色填充的圆圈,例如白色。 结果,圆圈会覆盖背景。

如果非要先画圆,请搜索Flood Fill Algorithm,用于在图片上画图。但是,在屏幕上绘图时,实现屏幕像素并播放此类算法是不必要且昂贵的。


我发现 Example Application: Creating a Clock with Cairo 在您提供的书的后面部分。 这似乎有帮助。

【讨论】:

所以基本上你的意思是没有简单的方法可以做到这一点,因为框架的“顶部”模型,对吧?至于你建议的工作流程,我用它来让我的红色光盘在蓝色背景上。 这与订单有关。如果你用蓝色绘制整个窗口(图形上下文),然后绘制一个白色填充的圆圈。这与您在白色窗口上画一个圆圈然后用蓝色绘制外部区域相同。 但是白色几乎从来都不是小部件的背景颜色。这取决于主题和平台。虽然,如果有一种方法可以根据其样式在该特定平台上找到小部件的默认背景,它会起作用。我可以用白色换取它。

以上是关于DrawingArea:区域外的填充区域的主要内容,如果未能解决你的问题,请参考以下文章

如何在 gtkmm DrawingArea 中绘制 poppler 文档

使用 cairo 检查路径是不是简单且封闭

在 Gtk::DrawingArea 中添加和定位小部件

30.QT-渐变之QLinearGradient QConicalGradientQRadialGradient

QQuickwidget 抓取窗口区域外的图像

MKLocalSearch 返回区域外的结果