GtkDrawingArea - 如何使其可绘制?

2023-12-03

我有点失去理智了。

我正在尝试使用 cairo 在 GTK 表单上绘制一些简单的图形。

#include <stdio.h>
#include <gtk/gtk.h>
#include <cairo.h>

GtkWidget* window;
GtkWidget* darea; 


int main(int argc, char **argv)
{
    gtk_init(&argc, &argv);     
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 390, 240);

    darea = gtk_drawing_area_new();
    gtk_container_add(GTK_CONTAINER(window), darea); 

    cairo_t *cr; 
    cr = gdk_cairo_create(darea->window);
    cairo_rectangle(cr, 0, 0, 100, 100); 
    cairo_fill(cr);


    gtk_widget_show_all(window);

    gtk_main(); 

    return 0;
}

这可以编译,但给了我

Gdk-CRITICAL **:IA__gdk_cairo_create:断言`GDK_IS_DRAWABLE (可绘制)'失败

随后出现段错误。

我一直在看教程在这里

所以我按如下方式更改了代码,使 cairo 调用发生在公开事件内。

    #include <stdio.h>
    #include <gtk/gtk.h>
    #include <cairo.h>

    GtkWidget* window;
    GtkWidget* darea; 

    static gboolean
    on_expose_event(GtkWidget *widget,
        GdkEventExpose *event,
        gpointer data)
    {
        cairo_t *cr; 
        cr = gdk_cairo_create(darea->window);
        cairo_rectangle(cr, 0, 0, 100, 100); 
        cairo_fill(cr);

    }    

    int main(int argc, char **argv)
    {
        gtk_init(&argc, &argv);     
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_default_size(GTK_WINDOW(window), 390, 240);

        darea = gtk_drawing_area_new();
        gtk_container_add(GTK_CONTAINER(window), darea); 

        g_signal_connect(darea, "expose-event",
          G_CALLBACK(on_expose_event), NULL);


        gtk_widget_show_all(window);

        gtk_main(); 

        return 0;
    }

为什么这个可以修复它? 我对曝光的理解是: 这

g_signal_connect(darea, "expose-event", G_GCALLBACK(on_expose_event), NULL); 

告诉程序,“当darea发生暴露事件时,调用on_expose_event”。 null 是您可以传递指向附加信息结构的指针以供函数使用的地方。

and

    static gboolean
    on_expose_event(GtkWidget *widget,
        GdkEventExpose *event,
        gpointer data)
    {

意味着 on_expose_event 被传递一个指向事件发生的小部件的指针,在这种情况下,因为它是一个公开事件,一个指向包含有关公开事件信息的结构的指针,以及一个指向您可能喜欢的任何其他信息的结构的指针加上。


使用 Cairo 在小部件上绘图only在暴露事件中工作。这是因为 Cairo 不像矢量绘图程序,其中的线条和形状是被记住和可以操作的对象; Cairo 只是将形状绘制到绘图区域上,然后就忘记了它们。

因此,当您最小化并恢复窗口,或将另一个窗口移到其上方时,形状就会消失。会生成一个公开事件,让您知道形状已消失并且需要重新绘制小部件。因此,您可以在公开事件处理程序中使用 Cairo 进行重绘。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GtkDrawingArea - 如何使其可绘制? 的相关文章

随机推荐

  • 从代码运行 PsExec 进程的问题

    尝试使用 PsExec 远程运行 NET 命令行工具时 我遇到了一个奇怪的问题 从命令行运行 PsExec 时 它可以正常运行并完成 从控制台应用程序运行它时 创建进程 运行 PsExec exe 并为其提供必要的参数 它是 运行正常 当从
  • 如何从 statsmodels 中 WLS 回归的 2D 参数获取测试预测

    我正在逐步提高参数WLS 回归函数使用统计模型 我有一个 10x3 数据集 X 我声明如下 X np array 1 2 3 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 1 2 3 4 5 6 4 5 6 1 2 3 这是我
  • Azure 网站上的自定义域名正常工作,但总是重定向到 azurewebsites.net?

    我在共享模式 Azure 站点上设置了一个自定义域 其中 CNAME 为 www lakestarlodge com A 记录为 Lakestarlodge com 两者都有效 我可以在浏览器中输入其中之一并访问该网站 然而 我刚刚注意到
  • 单日历日期范围选择器

    我正在寻找构建一个日期范围选择器 其值一次仅包含一年的一月至十二月 它看起来像这样 这是从我现有的剑道日期范围选择器中获取的 并且经过了糟糕的Photoshop处理 我使用剑道日期选择器构建了一个日历 但它似乎需要两个日历 一个用于开始日期
  • 如何用 C# 创建自己的事件?

    如何用 C 创建自己的事件 以下是使用 C 创建和使用事件的示例 using System namespace Event Example First we have to define a delegate that acts as a
  • 查找可以用 1 和 0 书写的数字的倍数

    给定数字n 2 10 3 gt 111 4 gt 100 7 gt 1001 11 gt 11 9 gt 111 111 111 我的想法不太好 n 2 和 n 5 000 幻影的最大值 2 5 gt n 3 111 我认为 剩下的数字除法
  • 检查失败:mdb_status == 0 (2 vs. 0) 没有这样的文件或目录

    我在训练数据时收到以下错误 我已经尝试了互联网上给出的所有解决方案 但似乎没有一个对我有用 我已检查 lmdb 文件的路径和大小不为零 但问题仍然存在 我不知道如何解决这个问题 pooling I0411 12 42 53 114141 2
  • 根据窗口大小调整页面元素的大小

    Problem 我的客户希望我为他的产品创建一个启动网页 以便页面上不应该有滚动 任何浏览器或窗口尺寸 Doubt 使用 CSS 和 JavaScript 可以实现这一点吗 一些早期诊断 这可能有点类似于this or this但不同之处在
  • Xamarin.Auth Google 登录完成后不会自动关闭

    我跟随导游在此输入链接描述 当我登录我的谷歌帐户时遇到问题 它显示 toast 并且浏览器不会自动关闭以支持我的 Thanks 在您的 CustomUrlSchemeInterceptorActivity 页面中替换 OnCreate 内
  • 保存多帧 TIFF

    我从 C 应用程序中的 Stream 加载多帧 TIFF 然后使用 Image Save 方法保存它 但是 这仅保存第一帧的 TIFF 如何让它保存多帧 tiff 由于您没有提供任何详细信息 仅提供一些一般提示 多帧 TIFF 是非常复杂的
  • Bootstrap 导航栏宽度与容器相同

    我正在使用 Bootstrap 3 我不能让导航栏与容器具有相同的宽度 如果它适用于大屏幕但不适用于其他屏幕尺寸 我如何制作固定大小的导航栏 它将改变与容器宽度相同的不同屏幕 div class row div
  • 从 NSUserDefaults 字典 iOS 中删除所有键

    我使用 NSUserDefaults 字典来存储基本信息 例如高分等 以便当用户关闭应用程序时数据不会丢失 无论如何我使用 NSUserDefaults prefs NSUserDefaults standardUserDefaults 存
  • 如何使用 PYQt' QImage scanline() 访问像素数据

    我需要使用 PyQt4 访问 qimage 对象中的像素数据 pixel 太慢 因此文档说使用 scanline 方法 在 C 中 我可以获得 scanline 方法返回的指针 并从缓冲区读取 写入像素 RGB 值 使用Python 我得到
  • 如何在 CentOS 7 上安装最新版本的 Docker [已关闭]

    Closed 这个问题是与编程或软件开发无关 目前不接受答案 我正在尝试在 CentOS 7 64 位系统上安装现代 docker io 版本 1 5 yum 服务器附带的默认 docker io 是 1 3 2 并且 这个版本对于我需要的
  • 该文档没有页面。贾斯珀报告

    我在寻找此问题的解决方案时遇到问题 我的代码运行后工作正常 它假设将我的 sql 数据库上的数据显示到我的 jtable 中 并且有一个按钮将触发显示 jasper 报告 但有一点问题 它总是向我显示消息 文档没有页面 这是为什么 有人可以
  • 如何使用 adb shell 打开 Android 设备扬声器

    没有看到任何关于使用 adb shell 打开 Android 设备扬声器的命令 好奇是否有办法 call phone adb shell am start a android intent action CALL d tel X XXX
  • 如何使用 solana rust 合约发送 SOL

    我是一名 Rust Solana 开发新手 感觉我遇到的问题对大多数其他新手都有帮助 我想知道如何在指令期间将 SOL 从帐户转移到程序 然后能够将 SOL 发送回调用该指令的帐户 我读了https docs solana com 但我找不
  • 为什么调用 main 函数被认为是未定义的行为 (UB)

    我担心这又是一个关于解释 ISO IEC 14882 C 标准 的问题 但是 正在呼叫main从程序中 例如我的使命main 递归地从main至少不是实现定义的行为 更新 我的意思是稍后格式不正确 未定义实现 也不是 UB 请参见下文并回答
  • 无法查看 Azure 日志流中的日志

    在我的 Web Api 应用程序中 我有控制器 Route api controller public class ValuesController Controller GET api values HttpGet public IEnu
  • GtkDrawingArea - 如何使其可绘制?

    我有点失去理智了 我正在尝试使用 cairo 在 GTK 表单上绘制一些简单的图形 include