gpt4 book ai didi

c - GTK+ 如何绘制到绘图区

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

我想在 gtk+ cairo 绘图区域内画一些线(实际上是一个正弦波),但我想不出一个方法来做到这一点。所以我的代码首先定义了绘图区域,它有一个函数的回调函数,该函数将白色背景绘制到绘图区域本身......此时我想在每次启动按钮后开始绘制一段正弦波按下(按钮有一个绘图函数的回调)....所以首先..可以这样做吗?我错过了什么吗?谢谢。

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

int x = 0;
int x_old = 0;
float value = 0;
float value_old = 0;
GtkWidget *button = NULL;
GtkWidget *window = NULL;
GtkWidget *area = NULL;
GtkWidget *table = NULL;

static gboolean load_interface(GtkWidget *widget)
{
cairo_t *cr;
cr = gdk_cairo_create(area->window);
cairo_set_source_rgb(cr, 1, 1, 1);
cairo_rectangle(cr, 0, 0, 900, 400);
cairo_fill(cr);
}

void draw(GtkWidget *widget)
{
cairo_t *cr;
cr = gdk_cairo_create(widget->window);

x_old = x;
x = x + 15;
value_old = value;
value = value + 0.25;

cairo_set_source_rgb(cr, 0, 0, 0);
cairo_set_line_width (cr, 1);
cairo_move_to(cr, x_old, 100 + (sin(value_old))*50);
cairo_line_to(cr, x, 100 + (sin(value))*50);
cairo_stroke(cr);
}


int main (int argc, char *argv[])
{
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
gtk_init (&argc, &argv);
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width (GTK_CONTAINER (window), 3);
gtk_window_set_title (GTK_WINDOW (window), "Draw");
gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
gtk_widget_realize (window);
g_signal_connect (window, "destroy", gtk_main_quit, NULL);

table = gtk_table_new (10, 10, TRUE);
gtk_table_set_col_spacings(GTK_TABLE(table),10);
gtk_table_set_row_spacings(GTK_TABLE(table),5);
gtk_container_add (GTK_CONTAINER (window), table);

area = gtk_drawing_area_new();
gtk_signal_connect (GTK_OBJECT(area), "event", G_CALLBACK (load_interface), (gpointer)area);
gtk_table_attach_defaults (GTK_TABLE(table), area, 1, 10, 0, 10);

button = gtk_button_new_from_stock ("START");
g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (draw), (gpointer) window);
gtk_table_attach_defaults (GTK_TABLE(table), button, 0, 1, 0, 1);

gtk_widget_show_all (window);
gtk_main ();

return 0;
}

最佳答案

所有绘图都应该发生在绘图区绘图事件中,GTK2 称为expose-event,GTK3 称为draw。响应单击按钮,您只需更改一些值,您将重新使用这些值来计算绘制的整个场景。更改这些值后,您只需使绘图区域无效以强制重新绘制它,调用 gtk_widget_queue_draw在绘图区。就是这样。

如果场景的绘制成本很高,请记住使用 cairo 裁剪函数通过仅绘制发生变化的部分来提高性能。然后使用 gtk_widget_queue_draw_area而不是 gtk_widget_queue_draw,以提示有关已更改且需要重新绘制的区域。

参见 GtkDrawingArea documentation .

顺便说一句,不要对 GTK_OBJECT 使用强制转换(已弃用),而是使用 G_OBJECT。这使得移植到 GTK3 更容易。

关于c - GTK+ 如何绘制到绘图区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12497620/

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