我能够做到以下几点:
for (int i = 0; i < NUM_LEDS; ++i) {
ledoff = gtk_image_new_from_file("./ledoff.png");
leds[i].pos=ledpos[i];
gtk_layout_put(GTK_LAYOUT(layout), ledoff, leds[i].pos.x, leds[i].pos.y);
leds[i].status=OFF;
}
基本上,这会将一堆“ledoff”图像加载到某个窗口上。
我需要的是每次单击leds[i].pos.x
,leds[i].pos.y
时将图像ledoff
更改为ledon
。一开始我以为这只是加载一个新的映像并替换以前的映像的问题,但由于这将被执行数千次,我以为每次执行gtk_image_new_from_file
时都是“malloc”一个新文件!这是真的吗?或者我只是替换文件而不是添加新文件?
3条答案
按热度按时间kb5ga3dv1#
下面是一个工作示例,它在窗口中创建一个50x50“LED”阵列,并允许您通过单击它们来切换它们的状态。这并不是真的那么有效,正如我在评论中指出的那样,你最好自己在GtkLayout上绘制图像,但这至少可以作为一个概念证明。
**编辑:**我已经更新了示例代码,以考虑liberforce的建议,这使得事情更干净,内存效率更高。
bwitn5fc2#
一种解决方案是为每个有LED的位置创建一个
GtkImage
。不要使用gtk_image_new_from_file
,因为它将加载每次图像文件。相反:gdk_pixbuf_new_from_file
gtk_image_new
来创建每个图像部件,并立即使用gtk_image_set_from_pixbuf
将它们初始化为正确的像素缓冲区GtkImage
,然后用gtk_image_set_from_pixbuf
改变显示的图像这确保了低内存消耗:你只有2个像素缓冲区被分配(和引用计数从GtkImage示例),你只创建一个GtkImage每个led(而不是销毁/创建一个每次你改变显示的图像)。
**编辑:**这里是Sean Bright提交的改进,其中我修复了一些错误。
在这里,我实现了我的第一个评论,并改进了一些事情:
click_handler
回调的签名click_handler
回调的返回值zzwlnbp83#
我不确定这一点,但你应该把你的2个图像在屏幕上的同一位置,然后显示一个你需要和隐藏一个你不需要。我不知道这是否是一个好方法,但我很肯定,你不是用这种方式分配东西。
希望能帮上忙。
致上,