gpt4 book ai didi

c - 如何刷新 GTK 镜像?

转载 作者:太空宇宙 更新时间:2023-11-04 03:18:24 28 4
gpt4 key购买 nike

大家好,来自 Stackoverflow 的 friend 们,我有一些编程知识,但不是很多。我的想法是用 c 编写类似视频游戏或可视化工具的程序,为此我以某种方式制作和处理一个表示图像的数组,它必须可视化并始终被刷新,就像视频游戏一样。我已经完成了算法,我需要对其进行优化,我的意思是我知道如何随时创建表示图像的数组,我现在需要的是将其像动画一样可视化,然后使用 opencl 进行优化。我想做的程序必须做这样的事情:“创造形象”“渲染它”,“创造形象”“渲染它”,...
出于这个原因,我知道我可以很容易地从一个非常简单的示例开始,而不必学习 GTK 的所有内容。我一直在集中搜索简单的例子并试图理解它是如何工作的,但没有帮助,我只需要做那个简单的 Action ,刷新它。某处的命令就足够了。

#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <glib.h>
const int Width = 1200, Height = 800;
char *buffer;

int i = 0;
GdkPixbuf *pixbuf;
GtkWidget *window;
GtkWidget* image;


void delay(int number_of_seconds){
int milli_seconds = 1000 * number_of_seconds;
clock_t start_time = clock();
while (clock() < start_time + milli_seconds);
}


int main (int argc, char *argv[]){
buffer = (char*)malloc(3 * Width * Height);

// CREATE AN IMAGE IN BUFFER SOMEHOW
// buffer = something;
//

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
pixbuf = gdk_pixbuf_new_from_data (buffer, GDK_COLORSPACE_RGB, FALSE, 8, Width, Height, (Width)*3, NULL, NULL);
image = gtk_image_new_from_pixbuf (pixbuf);
gtk_container_add(GTK_CONTAINER (window), image);
gtk_window_set_title (GTK_WINDOW (window), "Visualizador");
gtk_widget_show_all (window);
delay(0.04);
gtk_main ();
free (buffer);
return 0;
}

程序非常简单,当我在那里创建/加载图像时它会显示一张图片,但我想把已经编程的函数放在那里,返回一个“缓冲区”,然后刷新显示的图像。我读到 gtk_widget_queue_drawgdk_pixbuf_simple_anim_add_frameg_timeout_add 有事可做,但我不知道它们是如何工作的,也不知道在这个程序中放什么。提前致谢!

最佳答案

如果您想要动态图像或需要经常刷新的东西,那么我建议使用 GtkDrawingArea 并实现它的绘制信号,为此您需要使用 cairo。它应该看起来像这样:

static gboolean
your_draw_cb(GtkWidget *widget, cairo_t *context, gpointer data)
{
// Do your drawing
return FALSE;
}

int main()
{
// Some code before ...
GtkWidget *area = gtk_drawing_area_new();
g_signal_connect(G_OBJECT(area), "draw", G_CALLBACK(your_draw_cb), your_data);
gtk_container_add(GTK_CONTAINER(your_container), area);
// More code ...
}

每次你想刷新它的时候你应该调用

gtk_widget_queue_draw(area);

调用绘制信号。

您不需要存储缓冲区,因为它位于 cairo 上下文中。

但您可能希望为此目的使用其他库,例如专为视频游戏设计的 SDL2 或 OpenGL。

希望对您有所帮助。

关于c - 如何刷新 GTK 镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49100951/

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